脆弱性
バッファオーバーフロー
別称: バッファオーバーラン
定義
メモリ安全性の欠陥で、確保済みバッファの末尾を超えて書き込みが行われ、隣接メモリが破壊されてしばしばコード実行を可能にする。
バッファオーバーフローは、C や C++ などの言語で入力長を宛先バッファのサイズと適切に比較しない場合に発生します。あふれたバイト列は隣接するスタックフレーム、ヒープチャンク、関数ポインタ、戻りアドレスなどを上書きし、攻撃者は制御フローを乗っ取ったりデータを漏えいさせたりできます。古典的なスタックオーバーフローは多くの歴史的エクスプロイトの基盤であり、ヒープオーバーフローも現在なお頻発します。緩和策としてはスタックカナリア、ASLR、DEP/NX、CFI、より安全な libc 関数、ファズテスト、そして Rust のようなメモリ安全言語への移行などが採られます。CWE-119 等で分類され、OWASP や SANS の上位リストにも常連です。
例
- CVE-2014-0160(Heartbleed):OpenSSL のメモリ読み取りオーバーフロー。
- Morris ワーム(1988):fingerd のスタックオーバーフローを悪用。
関連用語
スタックオーバーフロー脆弱性
プログラムのスタック上で発生するバッファオーバーフロー。多くの場合、保存された戻りアドレスや関数ポインタを上書きして実行を奪う。
ヒープオーバーフロー
動的に確保したメモリ上で発生するバッファオーバーフロー。アロケータのメタデータ、関数ポインタ、オブジェクトの vtable などが破壊されることが多い。
メモリ破壊
プログラムが意図したメモリ境界の外に書き込み、型安全性・制御フロー・データ整合性を損なうタイプの脆弱性を総称する用語。
解放後使用(Use-After-Free)
free 済みのメモリをプログラムが使い続けるメモリ安全性のバグ。攻撃者にオブジェクト状態の操作と制御フロー奪取を許すことが多い。
Secure Coding
Secure Coding — definition coming soon.
ファジング(Fuzz Testing)
プログラムに大量の不正・ランダム・想定外な入力を与え、クラッシュ・メモリ破壊・セキュリティ脆弱性を自動的に発見するテスト手法。