【ヒープオーバーフロー】
ヒープオーバーフロー とは?
最終更新:
💡 確保したヒープの枠を超えて書いてしまう
ヒープに確保したバッファの範囲を超えて書き込み、メモリを壊す不具合。メモリ不足との違い、影響と境界の確認・検出方法を解説します。
📌 このページのポイント
ヒープオーバーフローは、メモリ不足のこと?
バッファオーバーフローとは別?
はみ出すと、何が起きる?
メモリ上の別の情報を壊し、停止やデータ破損につながることがある。条件によっては、攻撃者が意図するコードの実行にもつながる。ただし、いつも同じ情報を上書きし、必ずコードを実行できるという意味ではない。
サイズを指定する関数なら、安心?
正しい大きさを渡し、処理後の長さや終端も含めて確認する必要がある。入力を加工すると、元より長くなる場合もあるよ。コピー先の容量、位置、必要な大きさの計算を合わせて確認しよう。
どうやって見つけて直す?
境界を自動で確認する言語や仕組みを選び、範囲外へ書かない実装にする。開発時にはAddressSanitizerでヒープなどの範囲外アクセスを検出できる。実行した経路の確認なので、通ったテストだけで全経路の安全を保証するものではないよ。
もっと詳しく知りたい人へ
ASLRなどの防御があれば、修正しなくてよい?
修正が必要です。メモリ配置のランダム化などは悪用しにくくする防御ですが、範囲外に書き込む不具合そのものをなくすわけではありません。原因の修正とテストに加え、防御機能を組み合わせます。
スタックオーバーフローとの違いは?
バッファの範囲外書き込みを比較する場合は、ヒープ上かスタック上かという違いです。ただし「スタックオーバーフロー」は再帰などでスタックの容量を使い切る意味にも使われるので、何があふれたのかを文脈で確認します。
まとめ:ざっくりこれだけ覚えればOK!
「ヒープオーバーフロー」って出てきたら「ヒープに確保した枠を超えて書き込み、メモリを壊す不具合」と思えばだいたいOK!
📖 おまけ:英語の意味
「Heap-based Buffer Overflow」 = ヒープにあるバッファの範囲を超える書き込み
💬 ここでのオーバーフローは、単にヒープの空きが足りないことではなく、確保した領域の境界を超えることです。