脆弱性・CVE速報深刻度: 緊急

imgproxy の ICO 読み込みで整数あふれによるヒープ破壊、遠隔からの停止やコード実行の恐れ(GHSA-hff9-5pqw-6w9f): 4.0.0 以上 4.0.16 未満が対象、4.0.16 で修正

目次(5)

画像変換サーバー imgproxy は、ICO 形式の画像を読み込むとき、ファイル内に書かれたデータの大きさ(32 ビットの値)に 14 バイトを足して領域を確保します。この足し算が桁あふれ(整数あふれ)を起こす値を入れた ICO を送ると、確保される領域が数バイトしかないのに、はるかに大きなデータを書き込んでしまい、ヒープが壊れます(GHSA-hff9-5pqw-6w9f)。勧告によると、結果として imgproxy のプロセスを落とす(サービス停止)ことも、コード実行に至る可能性もあります。GitHub の深刻度は Critical、CVSS v3.1 は 9.8(AV:N/AC:L/PR:N/UI:N)、弱点は CWE-122・CWE-190 です。CVE は未割り当てです。修正版は 4.0.16 です。

何が起きるか

  • 対象は ICO の読み込み処理(vips/icoload.c)です。ファイルの先頭が ICO の印(00 00 01 00)なら、拡張子や宣言に関わらず ICO として処理されます(勧告の経路説明)。
  • 勧告の例では、データの大きさに 0xfffffff5 を書くと、14 を足した結果が 32 ビットで 3 に丸まり、3 バイトの領域だけが確保されます。
  • その後、読み込み処理は宣言された大きさを前提に、確保した領域の 14 バイト先から読み込みを始めます。勧告の試験用ファイルでは 64 バイトが不正な宛先に書き込まれ、ヒープが壊れます。
  • ネットワーク越しに画像を渡せる相手が、認証なしで引き起こせます(PR:N、UI:N)。imgproxy が外部から取得した画像(利用者が指定した URL の画像など)を処理する構成は、特に注意が必要です(本記事の推定)。
  • 悪用の報告は確認できていません。CVE がないため、NVD・EPSS・KEV では照合できません。

影響を受ける条件

項目内容
対象imgproxy 4.0.0 以上 4.0.16 未満(Go モジュール github.com/imgproxy/imgproxy/v3 ほか。勧告の記載)
修正版4.0.16(リリース 9/28 UTC、勧告は 10/30 22:57 UTC。リリースノートは「ICO ローダーの複数の脆弱性を修正」)
弱点CWE-122(ヒープベースのバッファオーバーフロー)、CWE-190(整数のオーバーフロー)
評価GitHub の深刻度は Critical、CVSS v3.1 は 9.8(CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
CVE未割り当て
NVD・EPSS・KEVCVE がないため照合不可

修正の中身

修正コミット a821b6a(9/24 UTC、題名は「無効な ICO の読み込みでのセグメンテーション違反を修正」)は、vips/icoload.c を次のように直します。

  • ICO の 1 エントリのデータの大きさに上限(10 MB)を設け、超える値は「大きすぎる」として拒否します。
  • 足し算の結果を 32 ビットの変数に入れて使い回し、領域の確保に失敗したときはエラーで戻ります。
  • 読み込み失敗時に確保した領域を解放し、BMP のヘッダーを入れるのに十分な大きさがない場合もエラーにします。
  • 不正な ICO の試験用ファイル 3 点と試験を追加しています。

このコミットが v4.0.16 のタグに含まれることは、比較で確認しました(コミットはタグより前、タグの側が 3 コミット先、遅れなし)。最新のタグは v4.0.20 です。

対応

  1. imgproxy を 4.0.16 以上(できれば最新)に更新します。コンテナで使う場合はイメージのタグも確認します。
  2. すぐ更新できない場合は、外部から渡せる画像の取得先を許可リストで絞る、署名付き URL を必須にするなどで、信頼できない画像が届かないようにします(本記事の推定。勧告に回避策の記載はありません)。
  3. 更新前に、プロセスが異常終了していないか、不審な ICO 形式の入力がないかをログで見直します(本記事の推定)。

未確認の点

  • 悪用の報告は確認できていません。CVE がないため、NVD の評価・EPSS・KEV は照合できていません。
  • 勧告は、コード実行に至る「可能性」に触れています。実際にコード実行へつながるか、どの環境で成り立つかは確認できていません。
  • 修正から勧告まで約 1 か月あります(9/24 コミット、9/28 リリース、10/30 勧告)。その間の経緯は確認していません。
  • 勧告の対象範囲(4.0.0 以上)は構造化データの記載です。それより前の版の扱いは確認していません。
  • 実際の環境での再現は行っていません。記載は勧告、修正コミット、リリースノートに基づきます。

この記事について

出典

この記事を共有