ヒープオーバーフロー
ヒープオーバーフロー とは何ですか?
ヒープオーバーフロー動的に割り当てられたメモリで発生するバッファオーバーフローで、アロケータのメタデータ、関数ポインタ、オブジェクトの仮想テーブルを破壊することが多い。
ヒープオーバーフローは、ヒープに割り当てられたバッファの末尾を超えて書き込みを行い、隣接するチャンクや、malloc/free、jemalloc、mimalloc などのアロケータが管理する管理用メタデータを破壊する。スタックオーバーフローとは異なり、直接乗っ取るべきリターンアドレスは存在しない。代わりに攻撃者は、プログラムが後で信頼するデータ——隣接オブジェクトの関数ポインタ、C++ の vtable ポインタ、スマートポインタの制御ブロック、あるいは free() の際に使われるアロケータのフリーリストのリンク(古典的な「unlink」プリミティブ)——を破壊する。
ヒープのレイアウトは非決定論的であるため、攻撃の成立は**ヒープグルーミング / 風水(feng shui)**に依存する。すなわち、割り当てと解放を制御して、有用なターゲットが脆弱なバッファの直後に配置されるようにする。実世界の典型例が GHOST(CVE-2015-0235)であり、これは glibc の __nss_hostname_digits_dots() 関数に存在するヒープオーバーフローで、gethostbyname() を通じて到達できる。Qualys は 2015 年に Exim メールサーバーに対する完全なリモートコード実行を実証し、この欠陥は glibc 2.2 以降ひそかに存在し続けていた。CVE-2018-4407 は Apple の XNU カーネルで同じクラスの問題を示し、細工された単一の TCP パケットによってネットワーク越しに発動できた。
flowchart TD
A[被害オブジェクトと脆弱なバッファを隣接して割り当てる] --> B[ヒープグルーミングでターゲットをバッファの後ろに配置]
B --> C[オーバーフローがバッファ末尾を超えて書き込む]
C --> D{破壊されたターゲット}
D -->|アロケータのメタデータ| E[free unlink -> 任意書き込み]
D -->|関数ポインタ / vtable| F[制御フローを乗っ取る]
E --> G[コード実行]
F --> G防御策は、アロケータの堅牢化(メタデータの整合性チェック、安全な unlink、チャンクの分離、ガードページ)に、ASLR、CFI、サンドボックス化、そして Rust のようなメモリ安全な言語への移行を重ね合わせる。ヒープオーバーフローは、ブラウザ、カーネル、ドキュメントパーサーの攻撃において依然として中心的であり、Pwn2Own の勝利エクスプロイトチェーンにも頻繁に登場する。
● 例
- 01
GHOST(CVE-2015-0235)——glibc の gethostbyname におけるヒープオーバーフローで、Exim メールサーバー経由で到達可能。
- 02
CVE-2018-4407——XNU カーネルの TCP オプションにおけるヒープオーバーフローで、ネットワーク越しに発動可能。
● よくある質問
ヒープオーバーフロー とは何ですか?
動的に割り当てられたメモリで発生するバッファオーバーフローで、アロケータのメタデータ、関数ポインタ、オブジェクトの仮想テーブルを破壊することが多い。 サイバーセキュリティの 脆弱性 カテゴリに属します。
ヒープオーバーフロー とはどういう意味ですか?
動的に割り当てられたメモリで発生するバッファオーバーフローで、アロケータのメタデータ、関数ポインタ、オブジェクトの仮想テーブルを破壊することが多い。
ヒープオーバーフロー からどのように防御しますか?
ヒープオーバーフロー に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。
ヒープオーバーフロー の別名は何ですか?
一般的な別名: ヒープバッファオーバーフロー。