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

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

最終更新:
💡 もう使えないメモリを、古い参照で使ってしまう

解放済みのメモリを、古いポインタなどから読み書きしてしまうバグ。クラッシュやデータ破損を起こし、条件によって情報漏えいや不正なコード実行につながる。メモリの寿命と参照の管理が重要。

📌 このページのポイント
解放後使用:古い参照でアクセス① 確保使える領域参照から使用通常の処理② 解放返した領域参照が残る使用は不可③ 使用解放済みへ読み書きここがUAFクラッシュ・破損・情報漏えいなどの危険影響は使われ方や条件によるメモリの寿命と参照を管理しよう
解放した領域を使う段階が問題。条件によっては不正なコード実行につながる。
ひよこ ひよこ
メモリを解放した後に使うって、どういうこと?
ペンギン先生 ペンギン先生
プログラムが使うために確保したメモリを返したのに、古いポインタなどから、その領域を読み書きしてしまうことだよ。退去して使えなくなった部屋に、古い合鍵で入るようなイメージ。メモリを解放すること自体は、普通に必要な処理なんだ。
ひよこ ひよこ
ポインタが残っているだけで、このバグなの?
ペンギン先生 ペンギン先生
解放済みの領域を指すポインタは、ダングリングポインタと呼ばれるよ。Use-After-Freeは、それを使ってメモリへアクセスしてしまう問題なんだ。その領域が別の用途で再利用されても、以前の持ち主が使ってよい状態には戻らないよ。
ひよこ ひよこ
アクセスすると、必ず攻撃者のコードが動く?
ペンギン先生 ペンギン先生
必ずではないよ。クラッシュ、データの破損、意図しない情報の読み出しなどが起こり得る。攻撃者が利用できる条件がそろうと、不正なコード実行につながる場合もある。解放済み領域にデータが置かれたら、自動でそのデータが実行される、という仕組みではないんだ。
ひよこ ひよこ
解放したら、ポインタをNULLにすれば大丈夫?
ペンギン先生 ペンギン先生
そのポインタを使い続けるのを防ぐ助けにはなるけれど、同じ領域を指す別のポインタまでは変わらないよ。NULLへのアクセスも別の問題になり得る。誰がメモリを持ち、いつまで参照してよいかを設計して、寿命を管理することが大事なんだ。
ひよこ ひよこ
見つけたり防いだりする方法は?
ペンギン先生 ペンギン先生
CやC++では、AddressSanitizerなどを付けてテストし、不正なアクセスを検出する方法があるよ。Rustは所有権や借用の規則で有効な参照を守る仕組みを持つけれど、unsafeで扱う生ポインタなどには別の確認が必要。道具の保証が届く範囲も理解しよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Use-After-Free」って出てきたら「解放して使えなくなったメモリへ、アクセスするバグ」と思えばだいたいOK!
📖 おまけ:英語の意味
「Use After Free」 = 解放後使用
💬 useは使用、afterは後、freeはメモリの解放。CのfreeやC++のdeleteなどで解放した後のアクセスが例になるよ。

参考資料

← 用語集にもどる