ペネトレーションテスト&バグバウンティ
ハッカーである倫理的なエクスプロイト開発者(Ethical Exploit Developer)が学ぶ「バッファオーバーフロー」を出来るだけわかりやすく簡単に解説します。
バッファオーバーフロー(Buffer Overflow)とは
想像してください。テーブルの上にあるコップに水を入れます。
コップに入る水の容量(バッファの大きさ)は決まっています。
もし水(データ)を入れすぎると、水が溢れてコップが置いてあるテーブルは水浸しになってしまいます。
これと同じように、コンピュータのメモリに決められた以上のデータを書き込むと、本来関係ない場所(隣のメモリ)に影響を与えて、プログラムが誤作動を起こす可能性が発生します。
これは、メモリ管理のミスを突いた脆弱性です。プログラムが想定以上のデータを書き込むことで、隣接するメモリ領域を上書きし、悪意のあるコードが実行されたり、予期しない動作を引き起こすことができます。
バッファオーバーフローの具体的な例
バッファオーバーフローは、メモリ管理のミスを突いた脆弱性です。
プログラムが想定以上のデータを書き込むことで、隣接するメモリ領域を上書きし、予期しない動作を引き起こす可能性があります。
1.バッファとは
バッファとは、データを一時的に保存する領域(メモリの一部)のことです。
例えば、C言語で文字列を扱う場合、以下のように固定サイズのバッファを定義できます。
// 5バイトのバッファを定義しました。
char buffer[5];
2. バッファオーバーフローのコーディング
バッファオーバーフローは「バッファサイズより大きなデータを書き込んだとき」に発生します。
// 5バイトのバッファに8バイトの文字データを書き込みます。
char buffer[5];
strcpy(buffer, "12345678");
※5バイトを超えた分の3バイトのデータが、隣のメモリ領域を上書しました。
3.実際には、赤丸で囲まれた箇所が悪意を持って更新された情報になります。
これは、「バッファオーバーフローによるリターンアドレスの書き換え」の攻撃と言い、プログラムが関数の戻り先(リターンアドレス)を保存する領域を上書きし、攻撃者が用意したコードを実行する攻撃手法になります。
※今回は簡単に説明させていただきました。
※この仕組みを理解するには、「スタック」の仕組みを知る必要があります。
バッファオーバーフロー攻撃とは
バッファオーバーフロー攻撃(Buffer Overflow Attack) とは、プログラムのバッファ領域を超えるデータを書き込み、メモリを上書きして意図しない動作をさせる攻撃 です。
攻撃者は、この脆弱性を悪用してプログラムの制御を乗っ取り、任意のコードを実行(エクスプロイト)することができます。
バッファオーバーフロー攻撃の種類としては
1.スタックオーバーフロー(Stack Buffer Overflow)
関数のローカル変数のバッファをオーバーフローさせ、リターンアドレスを上書きする攻撃 です。
攻撃者は、リターンアドレスを自分のシェルコードがある場所に変更 することで、悪意のあるコードを実行できます。
2.ヒープオーバーフロー(Heap Buffer Overflow)
ヒープメモリ(動的に確保されるメモリ領域)にあるバッファをオーバーフローさせ、プログラムのデータ構造を破壊して攻撃する手法です。
3.リターン・オリエンテッド・プログラミング(ROP: Return-Oriented Programming)
近年では、DEP(データ実行防止)により、スタック上のシェルコードが実行されないことが多くなりました。
そのため、ROP攻撃では、プログラム内の既存の命令(ガジェット)を組み合わせて攻撃を行います。
バッファオーバーフロー攻撃の防御策
プログラミングのテクニックにより対応します。
1.安全な関数を使用
gets()や、strcpy()の代わりにfgets()や、strncpy()を使う。
2.バッファのサイズを明示的にチェック
strlen()で長さをチェックし、安全な範囲内に制限する。
3.スタックガード(Canary)
スタックに特定の値を配置し、変更されたらクラッシュするようにする。
4.ASLR(アドレス空間配置のランダム化)
メモリの配置をランダムにし、攻撃者がアドレスを予測しにくくする。
5.DEP(データ実行防止)
スタック領域のコード実行を禁止し、シェルコードの実行を防ぐ。
6.コンパイラのセキュリティ機能
-fstack-protectorなどのオプションを利用して脆弱性を軽減する。
ハッカーは、バッファオーバーフローを学ぶことにより、脆弱性を理解し、攻撃手法を再現して安全なソフトウェア開発を支援しますのまとめ
ちょっと難しかったですね。
バッファオーバーフローとは、プログラムのバッファ領域を超えるデータを書き込むことで、メモリを上書きし、意図しない動作を引き起こす脆弱性です。
特に、スタックオーバーフローでは、リターンアドレスを上書きし、攻撃者が用意したコードを実行させることが可能になります。ヒープオーバーフローやROP攻撃など、より高度な手法も存在します。
防御策としては、安全な関数の使用、バッファサイズの厳格なチェック、DEP(データ実行防止)、ASLR(アドレス空間配置のランダム化)などがあります。
バッファオーバーフローは、エクスプロイト開発やセキュリティ対策の基礎となる重要な概念であり、安全なソフトウェア開発を支援を行うには十分な理解が必要です。