
Gera arquivos TIFF/DNG manipulados para acionar gravações fora dos limites na libimagecodec.quram.so da Samsung, incluindo análise binária e etapas de reprodução.
Este repositório contém ficheiros de prova de conceito (PoC) conceptuais que demonstram
vulnerabilidades de escrita fora dos limites (OOB) na biblioteca de codecs de imagem Quramsoft
(libimagecodec.quram.so) utilizada em dispositivos Samsung Android.
| CVE | Formato | Tipo | Gravidade | CVSS 4.0 | Corrigido Em |
|---|---|---|---|---|---|
| CVE-2026-21045 | TIFF | Escrita Fora dos Limites (CWE-787) | Crítica | 8.4 | SMR Jul-2026 Release 1 |
| CVE-2026-21048 | DNG | Escrita Fora dos Limites (CWE-787) | Alta | — | SMR Jul-2026 Release 1 |
/system/lib64/libimagecodec.quram.soA vulnerabilidade reside na função de análise de tags IFD (Image File Directory)
WINKJ_ReadExifField (offset 0x13a0a8 no binário de 64 bits). Esta função
processa entradas IFD individuais do TIFF/EXIF, sendo cada uma uma estrutura de 12 bytes:
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, o campo Value de 4 bytes é tratado como um
offset de ficheiro (apontando para onde os dados reais residem). O código executa
então uma verificação de limites no endereço 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
A vulnerabilidade é um estouro de inteiro não assinado de 32 bits na adição.
Se um atacante forjar value_offset e count * element_size de modo a que a sua
soma tenha um wrap-around para um valor pequeno, a verificação passa mesmo que o
acesso real à memória em base + value_offset saia dos limites.
Exemplo (tipo UNDEFINED, element_size = 1):
A adição de 32 bits 0x17FFF + 0xFFFF0001 = 0x10008000 é truncada para 0x8000,
que é igual a buffer_size. A verificação passa, mas o ponteiro real de dados
(base + 0x17FFF) situa-se 0x7FFF bytes além do final do buffer alocado.
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
| Ficheiro | Descrição |
|---|---|
cve-2026-21045_tiff_oob_poc.py | Gera poc_crash.tif — TIFF malformado que desencadeia escrita OOB através de tag ASCII com count/offset forjados |
cve-2026-21048_dng_oob_poc.py | Gera poc_crash.dng — DNG malformado que desencadeia escrita OOB através de tag UNDEFINED com count/offset forjados |
# 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
Num dispositivo não corrigido (patch de segurança < julho de 2026), abrir o ficheiro TIFF/DNG forjado na Galeria Samsung (ou em qualquer aplicação que utilize o descodificador Quram) deverá causar uma corrupção de memória heap que pode levar a:
Num dispositivo corrigido (SMR Jul-2026 ou posterior), a imagem deve ser rejeitada como inválida ou processada com segurança. Uma falha num dispositivo totalmente corrigido pode indicar um problema separado não corrigido.
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
Todos os tipos com element_size = 1 (BYTE, ASCII, UNDEFINED) partilham o mesmo
handler e são igualmente vulneráveis ao contorno por estouro de inteiro.
Estas provas de conceito são fornecidas apenas para fins educacionais e de investigação em segurança. Demonstram o mecanismo da vulnerabilidade para ajudar utilizadores e programadores a compreender o risco. Não as utilize contra sistemas que não possui ou para os quais não tenha permissão explícita para testar.
| 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 (estouro!) | 32.768 |
buffer_size | 0x00008000 | 32.768 |
Resultado da verificação: 0x8000 <= 0x8000 | ✅ PASSA | — |
Acesso real à memória: base + 0x17FFF | 0x7FFF bytes além do buffer | ❌ OOB |
| Função | Endereço (64 bits) | Tamanho | Finalidade |
|---|
WINKJ_ReadExifField | 0x13a0a8 | 912 | Analisa entrada IFD individual (vulnerável) |
WINKJ_ReadTiffIFDInfo | 0x139d28 | 896 | Lê todas as entradas IFD |
WINKJ_ReadTiffInfo | 0x139ad4 | 596 | Analisador de informações TIFF de alto nível |
WINKJ_GetTiffInfo | 0x1393fc | 1752 | Ponto de entrada principal da análise TIFF |
decodeTIFF | 0x1a2adc | 580 | Descodifica imagem TIFF via libtiff |
getTIFFImageInfo | 0x1a2d20 | 508 | Obtém metadados da imagem TIFF |
copySubImageBuffer | 0x0b2824 | 324 | Copia região de sub-imagem |
TIFFReadDirectory | 0x1aac78 | 5896 | Leitor de diretórios do libtiff 4.6.0 |
_TIFFMultiply32 | 0x1a2f1c | 56 | Verificação segura de multiplicação de 32 bits |
_TIFFMultiply64 | 0x1a2f58 | 48 | Verificação segura de multiplicação de 64 bits |
| Tipo | Nome | Tamanho do Elemento | Endereço do 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 | Descrição | Estado |
|---|
| CVE-2025-58477 | Escrita OOB na análise de tags IFD em libimagecodec.quram.so (SMR Dec-2025) | ✅ Corrigido |
| CVE-2026-20973 | Leitura OOB em libimagecodec.quram.so (SMR Jan-2026) | ✅ Corrigido |
| CVE-2026-21045 | Escrita OOB na análise TIFF em libimagecodec.media.quram.so (SMR Jul-2026) | ⚠️ Não corrigido para mim |
| CVE-2026-21048 | Escrita OOB na análise DNG em libimagecodec.media.quram.so (SMR Jul-2026) | ⚠️ Não corrigido para mim |
| CVE-2026-4775 | Estouro de inteiro com sinal no libtiff 4.6.0 putcontig8bitYCbCr44tile | ⚠️ Não corrigido para mim |
| CVE-2024-7006 | Desreferência NULL no libtiff tif_dirinfo.c | ✅ Corrigido na 4.6.1 |