Skip to content
Vol. 1 · Ed. 2026
CyberGlossary
Entry № 527

ヒープオーバーフロー

監修Cybersecurity entrepreneur & security researcher

ヒープオーバーフロー とは何ですか?

ヒープオーバーフロー動的に割り当てられたメモリで発生するバッファオーバーフローで、アロケータのメタデータ、関数ポインタ、オブジェクトの仮想テーブルを破壊することが多い。


ヒープオーバーフローは、ヒープに割り当てられたバッファの末尾を超えて書き込みを行い、隣接するチャンクや、malloc/free、jemalloc、mimalloc などのアロケータが管理する管理用メタデータを破壊する。スタックオーバーフローとは異なり、直接乗っ取るべきリターンアドレスは存在しない。代わりに攻撃者は、プログラムが後で信頼するデータ——隣接オブジェクトの関数ポインタ、C++ の vtable ポインタ、スマートポインタの制御ブロック、あるいは free() の際に使われるアロケータのフリーリストのリンク(古典的な「unlink」プリミティブ)——を破壊する。

ヒープのレイアウトは非決定論的であるため、攻撃の成立は**ヒープグルーミング / 風水(feng shui)**に依存する。すなわち、割り当てと解放を制御して、有用なターゲットが脆弱なバッファの直後に配置されるようにする。実世界の典型例が GHOSTCVE-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、チャンクの分離、ガードページ)に、ASLRCFI、サンドボックス化、そして Rust のようなメモリ安全な言語への移行を重ね合わせる。ヒープオーバーフローは、ブラウザ、カーネル、ドキュメントパーサーの攻撃において依然として中心的であり、Pwn2Own の勝利エクスプロイトチェーンにも頻繁に登場する。

  1. 01

    GHOST(CVE-2015-0235)——glibc の gethostbyname におけるヒープオーバーフローで、Exim メールサーバー経由で到達可能。

  2. 02

    CVE-2018-4407——XNU カーネルの TCP オプションにおけるヒープオーバーフローで、ネットワーク越しに発動可能。

よくある質問

ヒープオーバーフロー とは何ですか?

動的に割り当てられたメモリで発生するバッファオーバーフローで、アロケータのメタデータ、関数ポインタ、オブジェクトの仮想テーブルを破壊することが多い。 サイバーセキュリティの 脆弱性 カテゴリに属します。

ヒープオーバーフロー とはどういう意味ですか?

動的に割り当てられたメモリで発生するバッファオーバーフローで、アロケータのメタデータ、関数ポインタ、オブジェクトの仮想テーブルを破壊することが多い。

ヒープオーバーフロー からどのように防御しますか?

ヒープオーバーフロー に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。

ヒープオーバーフロー の別名は何ですか?

一般的な別名: ヒープバッファオーバーフロー。

関連用語

関連項目