メモリの解放とは?解放後使用が不具合につながる理由

別の作業に使われ始めた席へ、古い番号札から手がかりが残る模型

30秒でわかる答え

メモリの解放とは?

メモリの解放とは、プログラムが使い終えた作業場所を返し、次の処理で使えるようにすることです。 限りある場所を使い回すための、正常な処理です。 返した場所への古い参照を使う解放後使用(Use After Free)が、停止や脆弱性につながる理由を、席と番号札の例で解説します。

メモリの解放とは、プログラムが使い終えた作業場所を返し、次の処理で使えるようにすることです。 限りある場所を使い回すための、正常な処理です。ここでいう「場所」が、コンピューターのメモリの一部に当たります。

問題になるのは、返した場所を「まだ自分が使ってよい」と扱い続けることです。別の処理の情報が置かれていれば、それを読んだり壊したりしてしまうおそれがあります。これを「解放後使用」といい、英語ではUse After Free、略してUAFと呼びます。

2026年10月のPHP脆弱性でも、メモリの扱いが問題になりました。ここではコードを書かずに、「片づけたあとに使うと、なぜ危ないのか」をラボの作業席で考えます。

メモリの解放とは、作業用の場所を返すこと

メモリは、コンピューターが処理中の情報を置くための作業場所です。保存しておく場所と、いま作業に使う場所の違いは、メモリとストレージの違いで詳しく説明しています。

プログラムは、必要な情報を扱うための領域を用意し、使い、不要になったら返します。単純化すると次の三段階です。

段階コンピューターでの意味ラボの席にたとえると
確保処理に使う領域を用意する作業席を借りる
利用そこへ情報を置き、読み書きする机に材料を広げて作業する
解放使い終えた領域を再利用可能にする席を返し、次の人が使えるようにする

誰も席を返さなければ、いつか次の人が座れなくなります。メモリでも、使い終えた領域を適切に再利用できることが大切です。

ただし、「解放したら、タスクマネージャーに出る使用量が必ずすぐ減る」とは限りません。実行環境が次の処理のために領域を保持する場合もあります。プログラム内部で再利用できることと、OSへすぐ返すことは、同じではありません。

解放後使用とは?古い参照が残る問題

では、イトが作業席を返したのに、その席の番号札をまだ持っていたらどうでしょう。

返した席を、古い番号札で使ってしまう
1席を借りる

イトが3番の席を使って工作する。

2席を返す

作業が終わり、次の作業に使える状態へ戻す。

3別の作業が始まる

同じ3番の席に、別の材料が置かれる。

4古い札で触ってしまう

イトがまだ自分の席だと思い、別の材料を片づけてしまう。

解放後使用のたとえです。実際のメモリでも、場所が同じだから使い続けてよいとは限りません。すぐ再利用されない場合もあります。

席の番号は同じでも、そこにあるものは、もう別の作業の材料かもしれません。問題は席を返したことではなく、返したあとの席を自分のものとして扱ったことです。

コンピューターで、情報のある場所をたどるための手がかりを「参照」と呼びます。仕組みによっては「ポインター」という言葉も使います。古い参照が残り、解放済みの場所を読み書きすると、違う情報を扱ってしまうおそれがあります。

MITREのCWE-416では、解放したメモリを再び参照・利用する問題として解放後使用を整理しています。再利用先のデータを壊したり、プログラムが停止したり、条件によっては不正なコード実行につながったりする場合があります。

イト

3番の席があるからって、まだ僕が使っていいとは限らないんだ。

マコト

その通り。場所の番号が同じことと、使っていい期間が続いていることは別なんだね。

このたとえでは、返した席をすぐ次の人が使っています。実際には、すぐ再利用されるとは限りません。だからこそ、不具合が毎回同じ形で表れず、普段は動いて見えることもあります。

メモリの解放はデータの完全消去とは違う

「解放」と聞くと、中身を全部消して真っ白にする作業に思えるかもしれません。しかし、解放は主に、その領域を使う権利や再利用の管理を切り替えることです。

作業席の予約を取り消しても、机に書いたメモまで自動で消えるわけではありません。同じように、メモリの場所を返すことと、中に残る情報を確実に消すことは別です。実際の扱いは、使う言語やプログラムを動かす仕組みによって変わります。

「中身がまだ読めそうだから使ってよい」とは考えられません。返した領域は、すでに別の用途へ回されているかもしれないからです。

また、ここでいうメモリの解放は、写真フォルダーの削除や、スマートフォンの保存容量を空ける操作とは別です。「メモリを解放すれば、この脆弱性を自分で直せる」という意味でもありません。問題なのは、ソフトウェア内部の使う順序や期間の管理です。

メモリ不足・リーク・解放後使用の違い

メモリに関する用語は、同じ原因を言い換えているわけではありません。

用語何が起きているか作業席の例
メモリ不足(OOM)必要な領域を確保できない新しい作業の席が足りない
メモリリーク不要な領域が適切に解放されず残る使い終えた席を返し忘れる
解放後使用(UAF)解放済みの領域を使う返した席を古い番号札で使う
バッファオーバーフロー用意した領域の範囲を越えて書き込む自分の机から隣の机へ材料をはみ出させる

OOMはOut Of Memoryの略です。メモリリークが続いてメモリ不足になることはありますが、メモリ不足が必ずリークで起きるわけではありません。一度に扱う情報が多すぎる場合などもあります。

解放後使用も、「メモリを増やせば仕組みが正しくなる」という問題ではありません。空いている席が増えても、返した席の番号札を使い続ける誤りそのものは残ります。

この表は用語を分けるための整理です。実際の不具合では、複数の問題が連なって起こることもあります。

解放後使用が脆弱性になる条件

解放後使用は、まずプログラムの不具合です。その不具合を外部から引き起こせたり、誤って使うデータへ影響を与えられたりすると、安全を損なう弱点になる場合があります。

たとえば、古い参照で読み出した内容が別の利用者の情報なら、情報が漏れる可能性があります。重要な管理情報を書き換えてしまえば、処理の流れがおかしくなる可能性もあります。

ただし、解放後使用が見つかるたびに、簡単にサーバーを乗っ取れるわけではありません。攻撃者がどこまで条件を操作できるか、実行環境にどんな保護があるかなどが関係します。影響が停止にとどまる場合もあれば、さらに深刻な結果へつながる場合もあります。

プログラミング言語の中には、使い終えた場所の管理を自動で行ったり、使ってよい期間を確かめたりして、この種の誤りを減らすものもあります。

それでも、プログラムを動かすソフトウェアの内部にまで、同じ守りが行き届くとは限りません。PHPを書く人が自分でメモリを解放していなくても、PHPを動かす側のソフトウェアに問題が生じることはあります。

PHPのメモリ問題をニュースで読むには

今回のPHP脆弱性は、メモリに関係する2件ですが、同じ不具合を二つの番号で呼んでいるわけではありません。

一方は、メモリ不足で準備途中の処理が中断し、その不完全な状態を後片づけで扱う問題。もう一方は、前の依頼の領域を解放したあとに古い状態が残り、後の依頼で使われる問題です。細かな条件と対応は、PHP公式のセキュリティ告知に示されています。

「メモリ関連」と一まとめにせず、足りなくなったのか、返し忘れたのか、返したあとに使ったのかを見ると、説明の筋を追いやすくなります。

イトが返した3番の席も、解放自体が悪かったのではありません。返したあとに古い番号札を使ったことが問題でした。この区別を覚えておけば、解放後使用という長い用語も、何が食い違っているのかを考える言葉になります。

今回の利用者として必要な確認は、PHP脆弱性の影響と修正版にまとめています。内部の仕組みを全部覚えてからでなくても、提供元へ修正状況を確認できます。

内容の最終確認日: