| 属性 | 詳細 |
|---|---|
| CVE ID | CVE-2025-66628 |
| ベンダー | ImageMagick Studio LLC |
| 製品 | ImageMagick |
| 影響を受けるバージョン | 7.1.2-10 未満 |
| 修正済みバージョン | 7.1.2-10 |
| 脆弱性の種類 | CWE-190(整数オーバーフロー) |
| CVSS v3.1 スコア | 7.5(高) |
| CVSS ベクトル | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| 研究者 | Sumit Shah |
ImageMagick の coders/tim.c 内の ReadTIMImage 関数に整数オーバーフローの脆弱性が存在します。32ビットシステム上で TIM(PlayStation)画像ファイルを処理する際、ユーザー制御の幅と高さの値に対するチェックのない乗算によりメモリの過小割り当てが発生し、ピクセル処理中の範囲外読み取りにつながります。
脆弱なロジックは coders/tim.c に存在します:
/* coders/tim.c - TIM Image Parser */
// User-controlled input from TIM file header
width = ReadBlobLSBShort(image); // 2 bytes (0-65535)
height = ReadBlobLSBShort(image); // 2 bytes (0-65535)
// VULNERABLE: Integer overflow on 32-bit systems
image_size = 2 * width * height; // No overflow check
// Memory allocated with truncated size
pixels = (unsigned char *) AcquireQuantumMemory(image_size, sizeof(*pixels));
// Loop processes FULL dimensions, reading beyond buffer
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
pixel_index = (y * width + x) * 2;
pixels[pixel_index] = ReadBlobByte(image);
pixels[pixel_index + 1] = ReadBlobByte(image);
}
}
32ビットアーキテクチャでは、size_t は32ビットに制限され、最大値は UINT_MAX = 4,294,967,295 です。
幅と高さの両方が16ビット符号なし整数の最大値に設定された場合:
width = 65535 (0xFFFF)
height = 65535 (0xFFFF)
Expected calculation:
2 × 65535 × 65535 = 8,589,869,050 bytes (~8.5 GB)
Actual result (32-bit wraparound):
8,589,869,050 % 4,294,967,296 = 4,294,901,754
Result after truncation: Small allocated buffer
このオーバーフローにより、メモリアロケータは必要とされるサイズよりも大幅に小さいバッファを確保しますが、処理ループは依然として完全な 65535 × 65535 ピクセルグリッドを反復するため、範囲外読み取りが発生します。
ステップ1: 攻撃者はオーバーフローを引き起こす寸法を持つTIMファイルを作成します
[Magic: 0x10]
[Type: 0x02]
[Width: 0xFFFF] # 65535
[Height: 0xFFFF] # 65535
[Pixel Data...]
ステップ2: 被害者が悪意のあるファイルを処理します
convert malicious.tim output.png
ステップ3: 範囲外読み取りが発生し、以下につながります:
size_t が32ビットである32ビットシステム。64ビットシステムは、計算されたサイズをオーバーフローなしで表現できる十分な整数幅を持つため、影響を受けません。
情報漏えい(主): 範囲外アクセス中に、ImageMagick プロセスのヒープメモリを読み取ることができます。このメモリには以下が含まれる可能性があります:
漏えいしたデータは、変換後の出力画像に埋め込まれたり、サイドチャネル解析によって抽出されたりする可能性があります。
サービス拒否(副):
マッピングされていないメモリ領域の読み取りは SIGSEGV を引き起こし、ImageMagick プロセスの終了と、自動化された画像処理パイプラインにおけるサービス中断をもたらします。
検証目的で技術的詳細を提供します。実行可能なエクスプロイトコードは配布されません。
convert、magick、または任意の ImageMagick API 呼び出しによる処理$ convert malicious.tim output.png
Segmentation fault (core dumped)
または、漏えいしたヒープデータが出力に埋め込まれた状態での変換成功。
$ convert malicious.tim output.png
convert: Memory allocation failed `malicious.tim' @ error/tim.c/ReadTIMImage/XXX.
ImageMagick をバージョン 7.1.2-10 以降に更新します:
# Verify current version
convert --version
# Update using package manager
apt update && apt upgrade imagemagick # Debian/Ubuntu
yum update imagemagick # RHEL/CentOS
brew upgrade imagemagick # macOS
算術演算の前にオーバーフローチェックを実装します:
// Insecure
image_size = 2 * width * height;
// Secure
if (height != 0 && width > (SIZE_MAX / 2) / height) {
ThrowReaderException(ResourceLimitError, "MemoryAllocationFailed");
}
image_size = 2 * width * height;
計算を実行する前に、次元値に対する入力検証と妥当な上限を適用します。
この脆弱性は変種解析(variant analysis)を用いて特定されました。ImageMagick の BMP デコーダーにおける同様の整数オーバーフローの開示後、レガシーフォーマットパーサーの体系的なレビューが実施されました。チェックのない width * height 計算のパターンマッチングにより、TIM パーサーにも同じ欠陥が存在することが特定されました。
レガシー画像フォーマットデコーダー(TIM、SGI、VIFF など)は、セキュリティ監査の頻度が低く、安全でない C 言語の算術演算に依存しているため、価値の高いターゲットです。
この脆弱性は、GitHub Security Advisories を通じて ImageMagick のメンテナに非公開で報告されました。公開開示は、パッチの提供と CVE 採番が行われた後にのみ実施されました。この調査は、責任ある開示の原則の下で倫理的に実施されました。
SUMIT SHAH
研究者: SUMIT SHAH