【だぶるふりー】

ダブルフリー とは?

💡 同じホテルの部屋を2回チェックアウトしたら、フロントの台帳が壊れた
📌 このページのポイント
ダブルフリーの仕組み ① 確保 ptr データ malloc()で確保 ② 1回目 free() ptr (解放済) free listに追加 ③ 2回目 free() ptr ⚠ ヒープ 破壊 free list が壊れる ヒープ管理 (free list) の破壊イメージ 正常: chunk A chunk B NULL 破壊後: chunk A chunk A ← 同じchunkが2回登録 次のmalloc()が予測外アドレスを返す
同じメモリを2回解放するとヒープ管理構造が壊れる
ひよこ ひよこ

ダブルフリーって、同じメモリを2回解放するってこと?

ペンギン先生 ペンギン先生

そうだよ。同じポインタでfree()を2回呼んでしまうバグだね。ヒープを管理しているアロケータは「もう解放したはずの領域をまた解放しようとしている」と混乱してしまうんだ。

ひよこ ひよこ

混乱するとどうなるの?

ペンギン先生 ペンギン先生

ヒープの内部にある「空き領域のリスト(free list)」が壊れてしまうんだよ。そうすると次にmalloc()を呼んだとき、本来返すべきでないアドレスが返ってくることがあるんだ。

ひよこ ひよこ

それを攻撃者はどう悪用するの?

ペンギン先生 ペンギン先生

壊れたfree listを細工することで、次のmalloc()の戻り値を攻撃者が指定したアドレスにできるんだよ。そこにデータを書き込める状態になるから「Write-What-Where」と呼ばれる強力な攻撃プリミティブになるんだ。

ひよこ ひよこ

Use-After-Freeとの違いは何?

ペンギン先生 ペンギン先生

UAFは「解放後にそのポインタを使い続ける」バグで、ダブルフリーは「同じポインタで2回free()を呼んでヒープ管理構造を壊す」バグだよ。でも複雑なコードでは両方が絡まって報告されることも多いんだ。

ひよこ ひよこ

どうやって防ぐの?

ペンギン先生 ペンギン先生

free()した直後にポインタをNULLにする習慣が一番基本的な対策だよ。NULLへのfree()は安全に無視されるからね。C++ではスマートポインタを使うと自動管理できるし、glibcのDouble-Free検出機能やAddressSanitizerでテスト中に発見することもできるんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ダブルフリー」って出てきたら「同じメモリを2回解放してヒープ管理を壊すバグ」と思えればだいたいOK!
📖 おまけ:英語の意味
「Double Free」 = 二重解放
💬 同じメモリ領域をfree()で2回解放してしまうことを指す用語だよ。C言語でポインタ管理を誤ると簡単に起きてしまうんだ。
← 用語集にもどる