目次(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・KEV | CVE がないため照合不可 |
修正の中身
修正コミット a821b6a(9/24 UTC、題名は「無効な ICO の読み込みでのセグメンテーション違反を修正」)は、vips/icoload.c を次のように直します。
- ICO の 1 エントリのデータの大きさに上限(10 MB)を設け、超える値は「大きすぎる」として拒否します。
- 足し算の結果を 32 ビットの変数に入れて使い回し、領域の確保に失敗したときはエラーで戻ります。
- 読み込み失敗時に確保した領域を解放し、BMP のヘッダーを入れるのに十分な大きさがない場合もエラーにします。
- 不正な ICO の試験用ファイル 3 点と試験を追加しています。
このコミットが v4.0.16 のタグに含まれることは、比較で確認しました(コミットはタグより前、タグの側が 3 コミット先、遅れなし)。最新のタグは v4.0.20 です。
対応
- imgproxy を 4.0.16 以上(できれば最新)に更新します。コンテナで使う場合はイメージのタグも確認します。
- すぐ更新できない場合は、外部から渡せる画像の取得先を許可リストで絞る、署名付き URL を必須にするなどで、信頼できない画像が届かないようにします(本記事の推定。勧告に回避策の記載はありません)。
- 更新前に、プロセスが異常終了していないか、不審な ICO 形式の入力がないかをログで見直します(本記事の推定)。
未確認の点
- 悪用の報告は確認できていません。CVE がないため、NVD の評価・EPSS・KEV は照合できていません。
- 勧告は、コード実行に至る「可能性」に触れています。実際にコード実行へつながるか、どの環境で成り立つかは確認できていません。
- 修正から勧告まで約 1 か月あります(9/24 コミット、9/28 リリース、10/30 勧告)。その間の経緯は確認していません。
- 勧告の対象範囲(4.0.0 以上)は構造化データの記載です。それより前の版の扱いは確認していません。
- 実際の環境での再現は行っていません。記載は勧告、修正コミット、リリースノートに基づきます。
この記事について
- 執筆・編集
- World Security 編集部
出典
- GitHub Advisory GHSA-hff9-5pqw-6w9f(GitHub)
- imgproxy セキュリティ勧告(GitHub)
- 修正コミット a821b6a(GitHub)
- imgproxy v4.0.16 リリース(GitHub)




