【ゆーずあふたーふりー】
Use-After-Free(解放後使用) とは?
最終更新:
💡 もう使えないメモリを、古い参照で使ってしまう
解放済みのメモリを、古いポインタなどから読み書きしてしまうバグ。クラッシュやデータ破損を起こし、条件によって情報漏えいや不正なコード実行につながる。メモリの寿命と参照の管理が重要。
📌 このページのポイント
- 解放後に、古い参照からメモリへアクセスする
- 同じ領域が、別の用途へ再利用されることがある
- クラッシュや破損、情報漏えいなどにつながり得る
- 所有権・寿命の設計と、検査ツールで対策する
メモリを解放した後に使うって、どういうこと?
プログラムが使うために確保したメモリを返したのに、古いポインタなどから、その領域を読み書きしてしまうことだよ。退去して使えなくなった部屋に、古い合鍵で入るようなイメージ。メモリを解放すること自体は、普通に必要な処理なんだ。
ポインタが残っているだけで、このバグなの?
解放済みの領域を指すポインタは、ダングリングポインタと呼ばれるよ。Use-After-Freeは、それを使ってメモリへアクセスしてしまう問題なんだ。その領域が別の用途で再利用されても、以前の持ち主が使ってよい状態には戻らないよ。
アクセスすると、必ず攻撃者のコードが動く?
必ずではないよ。クラッシュ、データの破損、意図しない情報の読み出しなどが起こり得る。攻撃者が利用できる条件がそろうと、不正なコード実行につながる場合もある。解放済み領域にデータが置かれたら、自動でそのデータが実行される、という仕組みではないんだ。
解放したら、ポインタをNULLにすれば大丈夫?
そのポインタを使い続けるのを防ぐ助けにはなるけれど、同じ領域を指す別のポインタまでは変わらないよ。NULLへのアクセスも別の問題になり得る。誰がメモリを持ち、いつまで参照してよいかを設計して、寿命を管理することが大事なんだ。
見つけたり防いだりする方法は?
まとめ:ざっくりこれだけ覚えればOK!
「Use-After-Free」って出てきたら「解放して使えなくなったメモリへ、アクセスするバグ」と思えばだいたいOK!
📖 おまけ:英語の意味
「Use After Free」 = 解放後使用
💬 useは使用、afterは後、freeはメモリの解放。CのfreeやC++のdeleteなどで解放した後のアクセスが例になるよ。