【ゆーずあふたーふりー】

Use-After-Free(解放後使用) とは?

💡 退去した部屋の合鍵で、入居した他人の荷物を触るようなもの
📌 このページのポイント
Use-After-Free の流れ ① 確保 ptr データ malloc()で 確保した領域 ptrが指している ② 解放 ptr (解放済) free()で解放 でもptrはまだ 同じアドレスを 指したまま ← dangling pointer ③ 悪用 ptr 攻撃 コード 攻撃者が解放済み 領域に悪意ある データを配置 → コード実行に発展
解放後のメモリに攻撃者がデータを配置するイメージ
ひよこ ひよこ

Use-After-Freeって、どんなバグなの?

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

メモリをfree()で解放した後も、そのアドレスを指すポインタが残ったままになってしまうバグだよ。「もう使えない住所」に手紙を送り続けるようなイメージだね。

ひよこ ひよこ

ポインタが残ったままだと、どうなるの?

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

解放後のメモリには別のデータが書き込まれることがあるんだよ。古いポインタでアクセスすると意図しない値を読み書きして、プログラムがクラッシュしたり誤動作したりするんだ。

ひよこ ひよこ

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

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

free()のタイミングを狙って、解放された領域に悪意あるコードを書き込むんだよ。その後プログラムが古いポインタを使ったとき、攻撃者のコードが実行されてしまうんだ。ヒープスプレーと組み合わせて使われることも多いよ。

ひよこ ひよこ

ブラウザでよく聞く気がするけど、なぜブラウザが狙われやすいの?

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

ブラウザC++で複雑なオブジェクトを大量に管理していて、参照カウント非同期処理が絡むと解放タイミングの管理がとても難しいんだよ。その複雑さがUse-After-Freeを生みやすくしているんだね。

ひよこ ひよこ

どうすれば防げるの?

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

free()した直後にポインタをNULLに設定する習慣が基本だよ。さらにC++ではshared_ptrなどスマートポインタを使うと自動で管理してくれるし、Rustのような言語はコンパイル時にこのバグを原理的に防いでくれるんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Use-After-Free」って出てきたら「解放済みメモリを使って起きる危険なバグ」と思えればだいたいOK!
📖 おまけ:英語の意味
「Use After Free」 = 解放後使用
💬 use(使う)+after(〜の後に)+free(解放する)の合成語で、メモリをfree()した後にそのポインタを使ってしまう状態を指しているんだよ。
← 用語集にもどる