
Erzeugt manipulierte TIFF/DNG-Dateien, um Out-of-Bounds-Schreibzugriffe in Samsungs libimagecodec.quram.so auszulösen, einschließlich Binäranalyse und Reproduktionsschritten.
Dieses Repository enthält konzeptionelle Proof-of-Concept-Dateien (PoC), die
Out-of-Bounds-Schreibschwachstellen (OOB) in der Quramsoft-Bildcodec-Bibliothek
(libimagecodec.quram.so) demonstrieren, die auf Samsung-Android-Geräten verwendet wird.
| CVE | Format | Typ | Schweregrad | CVSS 4.0 | Behoben in |
|---|---|---|---|---|---|
| CVE-2026-21045 | TIFF | Out-of-Bounds Write (CWE-787) | Kritisch | 8.4 | SMR Jul-2026 Release 1 |
| CVE-2026-21048 | DNG | Out-of-Bounds Write (CWE-787) | Hoch | — | SMR Jul-2026 Release 1 |
/system/lib64/libimagecodec.quram.soDie Schwachstelle befindet sich in der IFD-Tag-Parsing-Funktion (Image File Directory)
WINKJ_ReadExifField (Offset 0x13a0a8 in der 64-Bit-Binärdatei). Diese Funktion
verarbeitet einzelne TIFF/EXIF-IFD-Einträge, jeweils eine 12-Byte-Struktur:
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
Wenn count * element_size > 4, wird das 4-Byte-Feld Value als Datei-Offset
behandelt (der auf die tatsächlichen Daten zeigt). Der Code führt dann eine Grenzprüfung
an der Adresse 0x13a258 durch:
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
Die Schwachstelle ist ein 32-Bit-Integer-Überlauf ohne Vorzeichen bei der Addition.
Wenn ein Angreifer value_offset und count * element_size so gestaltet, dass ihre
Summe auf einen kleinen Wert überläuft, besteht die Prüfung, obwohl der tatsächliche
Speicherzugriff bei base + value_offset außerhalb der Grenzen liegt.
Beispiel (Typ UNDEFINED, element_size = 1):
| Feld | Wert (hex) | Dezimal |
|---|---|---|
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 (Überlauf!) | 32.768 |
buffer_size | 0x00008000 | 32.768 |
Prüfergebnis: 0x8000 <= 0x8000 | ✅ BESTANDEN | — |
Tatsächlicher Speicherzugriff: base + 0x17FFF | 0x7FFF Bytes hinter dem Puffer | ❌ OOB |
Die 32-Bit-Addition 0x17FFF + 0xFFFF0001 = 0x10008000 wird auf 0x8000
abgeschnitten, was buffer_size entspricht. Die Prüfung besteht, aber der tatsächliche
Datenzeiger (base + 0x17FFF) liegt 0x7FFF Bytes hinter dem Ende des zugewiesenen Puffers.
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
| Datei | Beschreibung |
|---|---|
cve-2026-21045_tiff_oob_poc.py | Erzeugt poc_crash.tif — manipulierte TIFF-Datei, die einen OOB-Write über ein ASCII-Tag mit manipuliertem Count/Offset auslöst |
cve-2026-21048_dng_oob_poc.py | Erzeugt poc_crash.dng — manipulierte DNG-Datei, die einen OOB-Write über ein UNDEFINED-Tag mit manipuliertem Count/Offset auslöst |
# 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
Auf einem ungepatchten Gerät (Sicherheitspatch vor Juli 2026) sollte das Öffnen der manipulierten TIFF/DNG-Datei in Samsung Gallery (oder einer anderen App, die den Quram-Decoder verwendet) eine Heap-Speicherbeschädigung verursachen, die möglicherweise zu Folgendem führt:
Auf einem gepatchten Gerät (SMR Jul-2026+) sollte das Bild entweder als ungültig abgelehnt oder sicher verarbeitet werden. Ein Absturz auf einem vollständig gepatchten Gerät kann auf ein separates, ungepatchtes Problem hinweisen.
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
| Funktion | Adresse (64-Bit) | Größe | Zweck |
|---|---|---|---|
WINKJ_ReadExifField | 0x13a0a8 | 912 | Parst einzelnen IFD-Eintrag (verwundbar) |
WINKJ_ReadTiffIFDInfo | 0x139d28 | 896 | Liest alle IFD-Einträge |
WINKJ_ReadTiffInfo | 0x139ad4 | 596 | High-Level-TIFF-Info-Parser |
WINKJ_GetTiffInfo | 0x1393fc | 1752 | Haupt-Einstiegspunkt für die TIFF-Analyse |
decodeTIFF | 0x1a2adc | 580 | Dekodiert TIFF-Bild über libtiff |
getTIFFImageInfo | 0x1a2d20 | 508 | Ruft TIFF-Bildmetadaten ab |
copySubImageBuffer | 0x0b2824 | 324 | Kopiert Sub-Bild-Bereich |
TIFFReadDirectory | 0x1aac78 | 5896 | libtiff 4.6.0-Verzeichnisleser |
_TIFFMultiply32 | 0x1a2f1c | 56 | Sicherer 32-Bit-Multiplikationscheck |
_TIFFMultiply64 | 0x1a2f58 | 48 | Sicherer 64-Bit-Multiplikationscheck |
Extrahiert aus WINKJ_ReadExifField:
| Typ | Name | Elementgröße | Handler-Adresse |
|---|---|---|---|
| 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 |
Alle Typen mit element_size = 1 (BYTE, ASCII, UNDEFINED) teilen sich denselben Handler
und sind gleichermaßen anfällig für den Integer-Überlauf-Bypass.
| CVE | Beschreibung | Status |
|---|---|---|
| CVE-2025-58477 | OOB-Write in der IFD-Tag-Analyse in libimagecodec.quram.so (SMR Dez-2025) | ✅ Behoben |
| CVE-2026-20973 | OOB-Read in libimagecodec.quram.so (SMR Jan-2026) | ✅ Behoben |
| CVE-2026-21045 | OOB-Write in der TIFF-Analyse in libimagecodec.media.quram.so (SMR Jul-2026) | ⚠️ Für mich ungepatcht |
| CVE-2026-21048 | OOB-Write in der DNG-Analyse in libimagecodec.media.quram.so (SMR Jul-2026) | ⚠️ Für mich ungepatcht |
| CVE-2026-4775 | Vorzeichenbehafteter Integer-Überlauf in libtiff 4.6.0 putcontig8bitYCbCr44tile | ⚠️ Für mich ungepatcht |
| CVE-2024-7006 | NULL-Dereferenz in libtiff tif_dirinfo.c | ✅ Behoben in 4.6.1 |