何が起きるか
メモリ安全性の不備は、プログラムが使ってよいメモリの範囲や使用期間を守れず、別のデータまで読み書きする問題です。画像解析を例にすると、プロセスは作業用の領域をメモリに確保し、その場所を示すポインターを使って画素を書きます。使い終えて領域を解放すると、その場所は別のデータのために再利用できます。古いポインターが残っていても、元の画像用に使い続けてよいわけではありません。
説明用に、攻撃者が画像の幅や高さを変えたファイルをサーバーの変換機能へアップロードする場合を考えます。解析処理は寸法から必要なバイト数を掛け算します。固定幅の符号なし整数では表せる上限があり、例えば8ビットなら255の次は0へ回り込みます。実際のサイズ計算でも同様に小さな値へ回り込む欠陥があると、必要量より小さい領域を確保します。そこへ元の寸法に対応する画素を書けば、隣のデータまで壊してプロセスを停止させるおそれがあります。
範囲外の読み取りでは、隣に残った他の利用者の文書を出力画像へ混ぜ、攻撃者へ返す経路があると情報が漏れます。任意コード実行には、例えば次に呼ぶ関数のアドレスまで書き換え、そのアドレスへ処理を移せることなどの追加条件が必要です。クラッシュが起きただけで、秘密の取得やコード実行まで証明したことにはなりません。
正常ならどう動くか
画像解析では、寸法と色数から計算した必要量が上限内か確かめ、その大きさの領域を確保します。画素を読む位置や書く位置も、その範囲内に限定します。確保時に得たポインターは領域の場所を示す参照であり、領域を解放した後は使いません。
領域を一つの処理だけが管理する場合は、その処理を所有者と決め、使い終わってから解放します。複数の処理が共有する場合は、使用中の参照を参照数として数える方式もあります。例えば処理AとBが使っている間は2、Aだけが使い終われば1です。最後のBも使い終わって0になったときに、参照数を管理する処理が領域を解放します。
不備と攻撃が成立する流れ
攻撃者が画像ファイルの寸法などを操作し、サーバーの変換機能へアップロードする例です。寸法からバイト数を計算する途中で整数の上限を超え、結果が小さな値になると、処理は必要量より小さな領域を確保します。そこへ元の寸法に対応する量の画素を書き込むと、隣の領域まで壊す範囲外書き込みになります。
解放後使用の例では、文書の参照数などの管理を誤り、まだ別の処理が参照する領域を解放してしまいます。その領域が別のデータへ再利用された後も、残った参照から読み書きすると、元の文書とは違うデータを操作してしまいます。必要量の計算と、領域の寿命管理は分けて確認します。
起こり得る被害と条件
停止の例では、メモリの場所を示すポインターが壊れ、その指す場所へアクセスすることで解析プロセスが異常終了し、利用者が画像変換を完了できなくなります。同じ入力で繰り返しプロセスを停止できれば、サービスの利用妨害につながるおそれがあります。
漏えいの例では、解析処理が別の領域の内容まで読み、出力画像やHTTPレスポンスへ混ぜて返します。例えば、同じプロセスが先に扱った別の利用者の文書がその領域に残り、出力へ混ざる場合です。その出力を攻撃者が取得できれば、他人の文書の一部を入手するおそれがあります。異常な読み取りがあるだけではなく、内容が外へ返る経路も必要です。
データ破壊の例では、隣の領域にある計算結果を上書きし、処理結果を誤らせます。次に呼ぶ関数のアドレスなど、実行する処理を選ぶ値まで操作でき、攻撃者の用意した処理へ移せる場合には、解析プロセスの権限でコードが動くおそれがあります。クラッシュの再現だけで、この追加条件まで満たしたとはいえません。
防ぎ方と、防げる理由
寸法や件数の掛け算・足し算では上限を超えるか検査してからメモリを確保し、確保サイズを超える読み書きを拒否します。参照の所有者や寿命を管理して、まだ使う領域を解放したり、解放後の参照を使ったりしないようにします。メモリ安全な言語や更新済みの解析ライブラリを採用することも、この種の誤りを減らします。
Sanitizerは実行時の不正なメモリアクセスなどを検出し、ファジングは多様な入力を与えて異常な経路を探します。検査は欠陥発見の手段なので、それだけで全ての入力に安全と証明するものではありません。
被害を抑えるには、アップロードを受け付けるアプリから、秘密情報を持たない別プロセスへ解析対象のファイルだけを渡します。アプリは解析結果を受け取り、解析側の異常終了や時間超過は変換失敗として扱います。解析側のメモリ・時間・同時実行数も制限すれば、一つの解析が停止しても受付全体の資源を使い切らないようにできます。分離しただけで、全ての利用妨害を防げるわけではありません。
よくある誤解
アプリ本体がJavaScriptでも、CやC++などで実装された画像・PDF解析ライブラリを呼ぶ構成では、そのライブラリのメモリ管理の欠陥を攻撃されるおそれがあります。JavaScriptからの呼び出しだからといって、呼び出した解析処理までメモリ安全になるわけではありません。
参照数をatomicなカウンターで管理すると、複数の処理が同時に増減しても更新を取りこぼさないようにできます。ただし、カウンターの表せる最大値を超える問題は別です。多数の参照で値が回り込み、使用中なのに0と判断して解放する欠陥は、同時更新を正しく扱うだけでは防げません。
実装の確認点
文書・画像・圧縮などのネイティブ依存を列挙し、版と入力元を確認します。寸法や件数の計算、エラー時の解放、参照の所有者を追い、プロセスが読める秘密や書ける場所も確認します。
出典・確認範囲
- [1] CWE-787: Out-of-bounds WriteMITRE CWE / 確認日 2026-10-29
- [2] CWE-416: Use After FreeMITRE CWE / 確認日 2026-10-29
- [3] CWE-190: Integer Overflow or WraparoundMITRE CWE / 確認日 2026-10-29