何が起きたか・対象

OpenCVのJPEG 2000読み込みで、画像ヘッダーの解析に失敗した後も有効な画像の保存先があると扱い、不正なメモリへ書き込む問題がありました。識別子はCVE-2025-53644です。

OpenCVのreadHeaderは、画像オブジェクトのメモリアドレスを受け取る変数rawImageを用意し、OpenJPEGがその変数へ結果を書けるように渡します。しかし変数を初期化しておらず、解析に失敗して結果が設定されないと、以前そのスタック領域にあった値が残り得ます。未初期化は、明示的に「参照先なし」のnullを入れた状態とは異なります。

OpenJPEG内部のopj_jp2_read_headerは、実際のヘッダー解析opj_j2k_read_headerの成功値を確認せず、rawImageが指すはずの画像オブジェクトへ色空間やICCプロファイルの情報を書きます。残った値を有効なアドレスと扱うと、画像用ではない別のメモリへ書き込んでしまいます。

攻撃者が失敗するJPEG 2000画像をアップロード機能などから該当する解析経路へ渡すと、ヒープ上の別の場所を壊し、解析プロセスが停止するおそれがあります。該当形式とOpenJPEG連携の構成が条件で、停止や不正書き込みの確認だけを任意コード実行・情報持ち出しの証明とは扱いません。

報告・修正・公開の時系列

4.11.0で検証され、2025-04-24に報告、05-13に4.xブランチへ修正が入りました。修正を含む4.12.0は07-02、研究資料は07-17に公開されています。

正常ならどう動くはずだったか

正常な処理では、OpenJPEGが画像の管理情報を入れるオブジェクトを確保し、そのアドレスを呼び出し元のrawImageへ返します。後続処理はヘッダー解析の成功を確認してから、そのオブジェクトの色空間などの属性へ値を書きます。この「保存先」はディスク上のファイルではなく、画像オブジェクトのメモリです。失敗時は有効な保存先を仮定せず中断します。

技術的な原因

readHeaderのrawImageは、OpenJPEGが出力を書き戻すための変数です。そのアドレスを渡すことで、OpenJPEGは呼び出し元の変数を更新できます。一方、解析関数の戻り値は別に成功・失敗を示します。内部のopj_jp2_read_headerが、opj_j2k_read_headerの失敗値を確認せず色空間などを書いたため、rawImageに有効な画像のアドレスが設定されていない場合にも不正書き込みへ進みました。

攻撃が成立する条件と流れ

攻撃者がヘッダー解析を失敗させるJPEG 2000画像を用意し、アプリの画像入力などから該当OpenJPEG連携へ読み込ませます。失敗後の書き込み経路へ入ると、画像の処理結果を保存すべき領域とは異なるメモリへ書き込む場合があります。通常のJPEG処理全てではなく、該当する形式・依存構成を使うことが条件です。

確認された事実と、想定される影響

研究が示す直接の問題は、ヒープ上の不正な場所へ書き込み得ることです。画像解析プロセスが異常終了すれば、利用者は変換結果を得られず、同じ処理へ画像を繰り返し渡せる構成ではサービス利用を妨げるおそれがあります。別のデータが上書きされる場合もありますが、結果はOSやメモリ配置に依存します。任意コード実行や情報の持ち出し、実際の侵害は参照資料で確認されていません。

実際の修正・対応方針

修正コミットa39db41390de546d18962ee1278bd6dbb715f466では、書き込み条件にヘッダー解析関数の戻り値retの成功確認を加えています。アドレスが非nullかだけでなく、解析が成功した場合だけ後続の書き込みへ進むことで、失敗時の不正参照を止めます。4.12.0への収録は研究の時系列で確認できます。 nullは参照先がないことを表す値ですが、未初期化の値がnull以外だったとしても有効な画像とは限りません。retも確認することで、解析失敗時にその値を使わず止まれます。

利用者・運用者が確認すること

OpenCVの版とJPEG 2000の対応を確認して更新します。アップロード画像を処理するサービスでも、解析を権限の低い別プロセスへ分離し、秘密を読んだり、不要な保存先へ書き込んだりできない構成を検討します。

開発者への教訓(教材としての考察)

今回のrawImageのような出力引数は、呼び出された関数が呼び出し元へ結果を書き戻すために使います。成功・失敗を返す戻り値とは別なので、失敗時に出力引数がどんな値を持つか、次の処理がその値を使う前に成功を確認するかまで追う必要があります。

出典・確認範囲

  1. [1] Heap buffer write in OpenCVGitHub Security Lab / 確認日 2026-10-29
  2. [2] Cherry-pick OpenJPEG decoding status fixOpenCV / 確認日 2026-10-29
未確認事項・限界

実悪用・被害件数・任意コード実行の成立までは参照資料で確認できません。