バッファオーバーフローとは

バッファオーバーフローは、プログラムがデータを格納するメモリ領域(バッファ)に、割り当てられた容量を超えるデータを書き込むことで、予期しない動作やセキュリティ上の脆弱性を引き起こす現象のことです。

バッファオーバーフローの概要と目的

バッファオーバーフロー(Buffer Overflow)は、コンピュータのメモリ管理における最も古く、かつ深刻なセキュリティ問題の一つです。バッファとは、データを一時的に保持するために確保されたメモリ領域を指します。

プログラムが、このバッファに規定されたサイズ以上のデータを書き込もうとすると、バッファの境界を越えて隣接するメモリ領域を上書きしてしまいます。

バッファオーバーフローの主な目的は、悪意のある攻撃者がシステムの制御を奪ったり、機密情報を盗み出したりすることにあります。この脆弱性を悪用することで、プログラムの実行フローを乗っ取り、攻撃者が用意した不正なコードを実行させることが可能になります。

バッファオーバーフローが発生する仕組み

バッファオーバーフローは、主にC言語やC++といった、メモリ管理をプログラマが手動で行う言語で発生しやすいです。strcpygetsといった、入力データのサイズをチェックしない関数を使用した場合に、攻撃者が入力するデータのサイズを意図的に大きくすることで、脆弱性を突くことが可能になります。

脆弱性のあるコードの例

#include <stdio.h>
#include <string.h>

void function(char *input) {
    char buffer[16]; // 16バイトのバッファを確保
    strcpy(buffer, input); // 入力データをバッファにコピー
}

int main() {
    char large_data[32] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
    function(large_data);
    return 0;
}

この例では、function内で16バイトのバッファbufferを確保していますが、strcpy関数は入力データinputのサイズをチェックしません。main関数から渡されるlarge_dataは32バイトあり、strcpyはバッファの16バイトを超えて、隣接するメモリ領域を上書きしてしまいます。

スタックベースのバッファオーバーフロー

多くのバッファオーバーフロー攻撃は、関数の呼び出し情報が格納されるスタック領域を標的とします。スタックには、関数の戻りアドレス(関数が終了した後に制御が戻るべきアドレス)が保存されています。攻撃者は、バッファオーバーフローによってこの戻りアドレスを、不正なコードが格納されたアドレスに書き換えることで、プログラムの実行を乗っ取ります。

バッファオーバーフローを防ぐための対策

バッファオーバーフローは、深刻な脅威であるため、様々な対策が講じられています。

1. プログラミングにおける対策

  • 安全な関数の使用
    • 入力データのサイズをチェックするstrncpysnprintfといった関数を使用し、バッファのサイズを超えないようにします。
  • メモリ保護機能
    • OSやコンパイラが提供するスタック保護機能(例: GCCのStack-smashing Protector)を有効にします。これは、戻りアドレスが書き換えられていないかをチェックし、攻撃を防ぎます。
  • 境界チェック
    • 配列や文字列の操作を行う際に、常に境界チェックを行い、範囲外のアクセスを検出します。

2. システムレベルでの対策

  • アドレス空間配置のランダム化(ASLR)
    • プログラムが実行されるたびに、メモリ上のアドレス配置をランダムに変更する技術です。これにより、攻撃者は戻りアドレスを正確に予測することが困難になります。
  • 実行不可ビット(DEP)
    • データが格納されるメモリ領域(スタックなど)に、プログラムのコードとして実行されることを禁止する設定を施すことで、不正なコードの実行を防ぎます。

バッファオーバーフローは、依然として多くの脆弱性の原因となっていますが、これらの対策を組み合わせることで、そのリスクを大幅に軽減することが可能です。

関連用語

メモリリーク | 今更聞けないIT用語集
バッファオーバーフロー攻撃 セキュリティ用語集 | APPSWINGBY
ソフトウェアエンジニアリング

お問い合わせ

システム開発・アプリ開発に関するご相談がございましたら、APPSWINGBYまでお気軽にご連絡ください。

APPSWINGBYの

ソリューション

APPSWINGBYのセキュリティサービスについて、詳しくは以下のメニューからお進みください。

システム開発

既存事業のDXによる新規開発、既存業務システムの引継ぎ・機能追加、表計算ソフトによる管理からの卒業等々、様々なWebシステムの開発を行っています。

iOS/Androidアプリ開発

既存事業のDXによるアプリの新規開発から既存アプリの改修・機能追加まで様々なアプリ開発における様々な課題・問題を解決しています。


リファクタリング

他のベンダーが開発したウェブサービスやアプリの不具合改修やソースコードの最適化、また、クラウド移行によってランニングコストが大幅にあがってしまったシステムのリアーキテクチャなどの行っています。