【ばっふぁおーばーふろー】

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

公開:
💡 メモリの「器」からデータをあふれさせてプログラムを乗っ取る攻撃
📌 このページのポイント
バッファオーバーフロー 正常なスタック オーバーフロー後 高位 低位 リターンアドレス 保存レジスタ(EBP) バッファ (正常データ) 入力データ リターンアドレス (上書きされた!) 保存レジスタ(破壊) バッファ (溢れたデータ) 過大な入力データ 溢れ → 任意コード実行の危険 バッファ境界を超えたデータがリターンアドレスを上書きし、任意コード実行へ
バッファオーバーフローの仕組み
ひよこ ひよこ
バッファオーバーフローってどういう脆弱性
ペンギン先生 ペンギン先生
たとえば10文字分のメモリ領域を確保したのに、100文字のデータを書き込むとどうなるかな。はみ出した90文字分が隣のメモリ領域を上書きしてしまうんだ。この上書きされた領域に重要な制御データがあると、プログラムの動きが変わってしまうんだよ。
ひよこ ひよこ
なんで任意のコードが実行できるの?
ペンギン先生 ペンギン先生
スタック上には「この関数が終わったら次にどこを実行するか」というリターンアドレスが保存されているんだ。バッファオーバーフローでこのアドレスを攻撃者の用意したコードのアドレスに書き換えると、プログラムが攻撃者のコードを実行してしまうんだよ。
ひよこ ひよこ
JavaPythonでも起きるの?
ペンギン先生 ペンギン先生
JavaPythonのような言語は自動でメモリ管理をしてバッファの境界チェックも行うから、基本的にはバッファオーバーフローは起きないよ。主にCやC++のようなメモリを手動管理する言語で問題になるんだ。ただし、ランタイム自体がC/C++で書かれていれば、そこに脆弱性がある可能性はあるよ。
ひよこ ひよこ
現代のOSには対策があるの?
ペンギン先生 ペンギン先生
いろいろあるよ。ASLR(メモリのアドレスをランダムにして攻撃先を予測しにくくする)、DEP/NX(データ領域でのコード実行を禁止する)、スタックカナリア(バッファとリターンアドレスの間に検知用の値を入れる)など、複数の防御層で守っているんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「バッファオーバーフロー」って出てきたら「メモリの領域を超えてデータを書き込み、プログラムの動作を狂わせる脆弱性だな」と思えればだいたいOK!
📖 おまけ:英語の意味
「Buffer Overflow」 = バッファのあふれ
💬 buffer(緩衝領域)+ overflow(あふれる)。コップに水を注ぎすぎてあふれるイメージだよ
← 用語集にもどる