【ヒープオーバーフロー】
ヒープオーバーフロー とは?
💡 隣の部屋まではみ出す荷物、仕切りを壊して大惨事
📌 このページのポイント
- ヒープに確保したバッファのサイズを超えてデータを書き込む攻撃手法
- 隣接するヒープチャンクのメタデータや関数ポインタを上書きできる
- スタックオーバーフローより攻撃は複雑だが、防御も難しい
- malloc実装の内部構造を悪用してシェルコード実行に持ち込む手口がある
ヒープオーバーフローってバッファオーバーフローとは違うの?
バッファオーバーフローの一種だよ。バッファオーバーフローにはスタック上で起きるものとヒープ上で起きるものがあって、ヒープ上で起きるのがヒープオーバーフローだね。
ヒープで起きると何が違うの?
スタックオーバーフローは戻りアドレスを書き換えるのが定番だけど、ヒープの場合は隣接するヒープチャンクのメタデータや関数ポインタを書き換えるんだ。倉庫の仕切りを壊して隣の荷物を入れ替えるイメージだよ。
具体的にはどうやって攻撃するの?
たとえばglibcのmalloc実装では、解放済みチャンクが前後のポインタで連結リストを作っているよ。ヒープオーバーフローで隣のチャンクのポインタを書き換えると、次のfree()やmalloc()で任意のアドレスに値を書き込める「unlink攻撃」が成立するんだ。
それって防げないの?
じゃあもう安全なの?
ヒープ風水って面白い名前だね!プログラマはどう対策すればいいの?
📖 おまけ:英語の意味
「Heap Overflow」 = ヒープの溢れ
💬 「heap(ヒープ領域)」が「overflow(あふれる)」という、メモリ破壊の様子がそのまま名前になっているよ