【ヒープオーバーフロー】

ヒープオーバーフロー とは?

最終更新:
💡 確保したヒープの枠を超えて書いてしまう

ヒープに確保したバッファの範囲を超えて書き込み、メモリを壊す不具合。メモリ不足との違い、影響と境界の確認・検出方法を解説します。

📌 このページのポイント
ヒープオーバーフロー:確保した枠を超える説明用:4バイトを確保(位置0〜3)5バイト目を書くと、範囲外になる0123範囲外確保した4バイト停止・データ破損につながる場合がある容量・書く位置・加工後の大きさを確認ヒープの空きが足りないこととは別
緑の四つの枠は確保した領域、赤はその範囲外です。横の並びは概念的な位置で、実際に隣接する情報の種類や、必ず起きる影響を固定するものではありません。
ひよこ ひよこ
ヒープオーバーフローは、メモリ不足のこと?
ペンギン先生 ペンギン先生
この脆弱性の文脈では違うよ。ヒープに確保したバッファの範囲を超えて書き込む不具合だ。ヒープ全体の空きが足りず、確保に失敗する場合と区別するんだ。
ひよこ ひよこ
ペンギン先生 ペンギン先生
その一種だよ。ヒープに確保したバッファで起きるものを指す。たとえば4バイトの領域に5バイトを書こうとすると、最後の1バイトが確保した範囲を超える。これは仕組みを説明する例だよ。
ひよこ ひよこ
はみ出すと、何が起きる?
ペンギン先生 ペンギン先生
メモリ上の別の情報を壊し、停止やデータ破損につながることがある。条件によっては、攻撃者が意図するコードの実行にもつながる。ただし、いつも同じ情報を上書きし、必ずコードを実行できるという意味ではない。
ひよこ ひよこ
サイズを指定する関数なら、安心?
ペンギン先生 ペンギン先生
正しい大きさを渡し、処理後の長さや終端も含めて確認する必要がある。入力を加工すると、元より長くなる場合もあるよ。コピー先の容量、位置、必要な大きさの計算を合わせて確認しよう。
ひよこ ひよこ
どうやって見つけて直す?
ペンギン先生 ペンギン先生
境界を自動で確認する言語や仕組みを選び、範囲外へ書かない実装にする。開発時にはAddressSanitizerでヒープなどの範囲外アクセスを検出できる。実行した経路の確認なので、通ったテストだけで全経路の安全を保証するものではないよ。
もっと詳しく知りたい人へ

ASLRなどの防御があれば、修正しなくてよい?

修正が必要です。メモリ配置のランダム化などは悪用しにくくする防御ですが、範囲外に書き込む不具合そのものをなくすわけではありません。原因の修正とテストに加え、防御機能を組み合わせます。

スタックオーバーフローとの違いは?

バッファの範囲外書き込みを比較する場合は、ヒープ上かスタック上かという違いです。ただし「スタックオーバーフロー」は再帰などでスタックの容量を使い切る意味にも使われるので、何があふれたのかを文脈で確認します。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ヒープオーバーフロー」って出てきたら「ヒープに確保した枠を超えて書き込み、メモリを壊す不具合」と思えばだいたいOK!
📖 おまけ:英語の意味
「Heap-based Buffer Overflow」 = ヒープにあるバッファの範囲を超える書き込み
💬 ここでのオーバーフローは、単にヒープの空きが足りないことではなく、確保した領域の境界を超えることです。

参考資料

← 用語集にもどる