バッファオーバーフロー
バッファオーバーフロー とは何ですか?
バッファオーバーフローメモリ安全性の欠陥で、確保済みバッファの末尾を超えて書き込みが行われ、隣接メモリが破壊されてしばしばコード実行を可能にする。
バッファオーバーフローは、C や C++ などの言語で入力長を宛先バッファのサイズと適切に制限しない場合に発生します。あふれたバイト列は隣接するスタックフレーム、ヒープチャンク、関数ポインタ、戻りアドレスなどを上書きし、攻撃者は制御フローを乗っ取ったりデータを漏えいさせたりできます。古典的なスタックスマッシュは保存された戻りアドレスを上書きし、関数が攻撃者の用意したシェルコードへ「リターン」するようにします。一方ヒープオーバーフローはアロケータのメタデータや隣接オブジェクトを破壊し、書き込みプリミティブを獲得します。
この手口はインターネットの歴史を動かしてきました。1988 年の Morris Worm は BSD の fingerd におけるスタックオーバーフローを介して拡散しました。Code Red(2001 年)は IIS の .ida ISAPI フィルタにおける未検証バッファ(CVE-2001-0500)を悪用しました。そして SQL Slammer(2003 年)は SQL Server Resolution Service のオーバーフロー(MS02-039 / CVE-2002-0649)を突き、ポート 1434 への 1 個の 404 バイト UDP パケットによって 10 分以内に約 75,000 台のホストを感染させました。これはパッチ公開から 6 か月後のことでした。
境界外書き込み(CWE-787)は、XSS に次いで 2024 年の CWE Top 25 で 2 位にランクされました。現代の緩和策はスタックカナリア、ASLR、DEP/NX、制御フロー整合性(Intel CET、ARM PAC/BTI)、より安全な libc 関数、コンパイラによる堅牢化(_FORTIFY_SOURCE)、ファズテスト、そしてますます増えている、ホットなコードを Rust のようなメモリ安全言語へ移植するアプローチを重ねて適用します。
flowchart TD
A[攻撃者が過大な入力を送信] --> B{長さをバッファサイズと<br/>照合しているか}
B -->|はい 制限あり| C[入力を切り詰め または 拒否]
B -->|境界チェックなし| D[バッファ末尾を超えて書き込み]
D --> E[戻りアドレスや<br/>関数ポインタを上書き]
E --> F[制御フローが横取りされる]
F --> G[攻撃者のシェルコードや ROP チェーンが実行]
C --> H[プログラムは安全に継続]● 例
- 01
CVE-2014-0160(Heartbleed):OpenSSL のメモリ読み取りオーバーフロー。
- 02
Morris ワーム(1988):fingerd のスタックオーバーフローを悪用。
● よくある質問
バッファオーバーフロー とは何ですか?
メモリ安全性の欠陥で、確保済みバッファの末尾を超えて書き込みが行われ、隣接メモリが破壊されてしばしばコード実行を可能にする。 サイバーセキュリティの 脆弱性 カテゴリに属します。
バッファオーバーフロー とはどういう意味ですか?
メモリ安全性の欠陥で、確保済みバッファの末尾を超えて書き込みが行われ、隣接メモリが破壊されてしばしばコード実行を可能にする。
バッファオーバーフロー からどのように防御しますか?
バッファオーバーフロー に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。
バッファオーバーフロー の別名は何ですか?
一般的な別名: バッファオーバーラン。