メモリに決められた範囲以上のデータを書き込んでしまうことで、予期せぬ動作やセキュリティの問題を引き起こす現象のこと
簡単な説明
バッファオーバーフローってのは、メモリにデータ詰め込みすぎてはみ出しちゃうトラブルのことだよ。
悪用されるとウイルス動かされたりするから超危ない。
データの量ちゃんとチェックしてれば防げるやつ!
由来
「バッファ」とは一時的にデータを保存するメモリ領域のことです。
プログラムはこのバッファにデータを入れて処理しますが、入力するデータが想定より多い場合に上限を超えてしまうと、本来のメモリ領域を飛び越えて他の領域までデータが書き込まれてしまいます。これが「バッファオーバーフロー」です。
この問題は、C言語などの低レベル言語で多く発生しており、1990年代から有名なセキュリティ問題として認識されています。
具体的な説明
プログラムが使うメモリには限りがあります。その限られた中で「ここには64文字分のデータが入る」と決めたのに、100文字を入力されたら、残りの36文字は別の大切な場所に入り込んでしまうのです。
例えば、靴箱に「6足分の靴を入れてください」と言われているのに、無理やり10足入れたらどうなるでしょう?
靴箱からはみ出て、隣の棚にある他人の靴を押しのけてしまいますよね。
コンピュータでも同じように、本来のメモリの領域(棚)をはみ出て、別のデータを壊したり、悪意のあるコードを実行させたりすることがあるのです。
バッファオーバーフローは、スタックメモリ上のバッファに対する境界チェックが行われていない場合に発生します。
典型的な例では、関数の戻りアドレスを含む領域にまでデータが上書きされ、攻撃者が用意した任意のコード(シェルコードなど)が実行される「スタックオーバーフロー攻撃」があります。
例文
「バッファオーバーフローが原因で、アプリが突然終了してしまいました。」
疑問
Q: なぜバッファオーバーフローが危険なのですか?
A: 他の重要なメモリ領域に不正にアクセスされ、機密情報が漏れたり、悪意のあるコードが実行されたりする可能性があるためです。
Q: バッファオーバーフローはすべてのプログラミング言語で発生しますか?
A: 主にC言語やC++などの低レベル言語で発生しやすいですが、対策がなければ他の言語でも起こる可能性はあります。
Q: バッファオーバーフローを防ぐ方法はありますか?
A: 入力の長さをチェックしたり、安全な関数(fgetsなど)を使ったりすることで防ぐことができます。
Q: 実際にどんな被害がありましたか?
A: 2003年の「Slammerワーム」では、バッファオーバーフローを使った攻撃により世界中のSQL Serverが停止し、数億ドル規模の被害が発生しました
理解度を確認する問題
バッファオーバーフローに関する説明として最も適切なものはどれか。
A. メモリ内の使用されていない領域を開放すること
B. 使用できるメモリ領域を超えてデータを書き込むこと
C. メモリを暗号化してセキュリティを強化すること
D. メモリを圧縮して容量を増やすこと
正解:B
関連論文や参考URL
“Smashing The Stack For Fun And Profit”(Aleph One, 1996)
概要: バッファオーバーフローによるスタックの上書きを利用した攻撃方法と対策について詳細に解説。
結果: この論文は後のセキュリティ対策のきっかけとなり、OSやコンパイラが境界チェックや「実行不可スタック」などの対策を取るきっかけとなりました。
まとめ
バッファオーバーフローとは、決められたメモリ領域を超えてデータを書き込んでしまう現象です。
プログラムが誤動作したり、セキュリティ上の脆弱性につながることがあります。
安全な関数の使用や入力チェックで防止が可能です。


コメント