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

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

最終更新:
💡 データを書き込む前に、メモリの境界を確かめる

確保したバッファ(データを入れるメモリ領域)の範囲を超えて書き込んでしまう問題。別のデータの破壊やプログラムの異常終了を招き、条件によっては攻撃者によるコード実行につながる。

📌 このページのポイント
書き込める範囲を超えると? 4バイトのバッファと、その先の領域 範囲内の書き込み 1 2 3 4 — — バッファ:4バイト 別の領域 範囲を超える書き込み 1 2 3 4 5 6 バッファ:4バイト 別の領域 1マス=1バイトの模式図 結果はデータ破壊・異常終了など条件による
範囲外の書き込みによる結果は一定ではなく、条件によっては不正なコード実行につながります。
ひよこ ひよこ
バッファオーバーフローってどういう問題?
ペンギン先生 ペンギン先生
たとえば4バイト分の領域に、長さを確かめず6バイトを書き込もうとするような問題だよ。範囲外の書き込みで、別のデータを壊したり、プログラムが異常終了したりすることがある。
ひよこ ひよこ
必ずプログラムを乗っ取られるの?
ペンギン先生 ペンギン先生
必ずではないよ。ただし、処理の行き先を決める情報などが壊されると、攻撃者の意図したコードが実行される場合がある。結果はメモリの配置や防御機構などによって変わるんだ。
ひよこ ひよこ
JavaやPythonでも気にする必要がある?
ペンギン先生 ペンギン先生
境界を検査する仕組みは、範囲外のアクセスを防ぐ助けになるよ。ただし、呼び出すネイティブコードなどに問題が残る場合がある。自動で不要なメモリを回収する機能と、境界の検査は別の役割なんだ。
ひよこ ひよこ
プログラム側ではどう防ぐの?
ペンギン先生 ペンギン先生
書き込み先の容量を超えないよう、入力の長さや操作を確認するよ。文字数とバイト数は同じとは限らないし、Cの文字列なら末尾を示す文字の分も容量が必要。境界を検査する言語機能やライブラリの選択も役立つんだ。
ひよこ ひよこ
OSやコンパイラの対策もある?
ペンギン先生 ペンギン先生
メモリの配置を予測しにくくするASLR、実行を許さない領域を設けるDEP/NX、特定の上書きを検知するスタックカナリアなどがあるよ。ただし、これらだけで範囲外の書き込みそのものがなくなるわけではないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「バッファオーバーフロー」って出てきたら「メモリの決められた範囲を超えて書き込む問題」と思えばだいたいOK!
📖 おまけ:英語の意味
「Buffer Overflow」 = バッファのあふれ
💬 bufferはデータを一時的に置く領域、overflowはあふれること。ここでは書き込みが領域の境界を越えることを表すよ。

参考資料

← 用語集にもどる