Détection d’exploits de formats de fichiers structurels (0‑Click Chains)

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Cette page résume des techniques pratiques pour détecter des 0‑click mobile exploit files en validant des invariants structurels de leurs formats au lieu de se fier aux signatures d’octets. L’approche se généralise entre les échantillons, les variantes polymorphes et les futurs exploits qui abusent de la même logique de parser.

Idée clé : encoder des impossibilités structurelles et des incohérences inter‑champs qui n’apparaissent que lorsque l’état vulnérable du décodeur/analyseur est atteint.

Voir aussi :

PDF File analysis

Pourquoi la structure plutôt que les signatures

Lorsque des weaponized samples ne sont pas disponibles et que les payload bytes mutent, les patterns IOC/YARA traditionnels échouent. La détection structurelle inspecte la disposition déclarée du conteneur par rapport à ce qui est mathématiquement ou sémantiquement possible pour l’implémentation du format.

Vérifications typiques :

  • Valider les tailles de tables et les bornes dérivées de la spécification et des implémentations sûres
  • Signaler des opcodes illégaux/non documentés ou des transitions d’état dans du bytecode embarqué
  • Recouper les metadata VS les composants réellement encodés du flux
  • Détecter des champs contradictoires indiquant une confusion du parser ou des configurations visant à provoquer un integer overflow

Ci‑dessous des patterns concrets, testés sur le terrain, pour plusieurs chaînes à fort impact.


PDF/JBIG2 – FORCEDENTRY (CVE‑2021‑30860)

Target: JBIG2 symbol dictionaries embedded inside PDFs (often used in mobile MMS parsing).

Signaux structurels :

  • État contradictoire du dictionnaire qui ne peut pas survenir dans un contenu bénin mais qui est requis pour déclencher l’overflow dans l’arithmetic decoding.
  • Usage suspect de global segments combiné à des comptes de symboles anormaux pendant le refinement coding.

Pseudo‑logique:

# Detecting impossible dictionary state used by FORCEDENTRY
if input_symbols_count == 0 and (ex_syms > 0 and ex_syms < 4):
mark_malicious("JBIG2 impossible symbol dictionary state")

Triage pratique :

  • Identifier et extraire les flux JBIG2 du PDF
  • pdfid/pdf-parser/peepdf pour localiser et dumper les flux
  • Vérifier les indicateurs de codage arithmétique et les paramètres du dictionnaire de symboles par rapport à la spécification JBIG2

Remarques :

  • Fonctionne sans signatures de payload intégrées
  • Faible taux de FP en pratique, car l’état signalé est mathématiquement incohérent

WebP/VP8L – BLASTPASS (CVE‑2023‑4863)

Cible : tables de codes préfixes Huffman de WebP sans perte (VP8L).

Signaux structurels :

  • La taille totale des tables Huffman construites dépasse la borne supérieure sûre attendue par les implémentations de référence/corrigées, impliquant la condition préalable au débordement.

Pseudo‑logique :

# Detect malformed Huffman table construction triggering overflow
let total_size = sum(table_sizes)
if total_size > 2954:   # example bound: FIXED_TABLE_SIZE + MAX_TABLE_SIZE
mark_malicious("VP8L oversized Huffman tables")

Triage pratique:

  • Vérifier les chunks du conteneur WebP : VP8X + VP8L
  • Parser les codes de préfixe VP8L et calculer les tailles réelles des tables allouées

Notes :

  • Robuste contre le polymorphisme au niveau des octets du payload
  • La borne est dérivée des limites en amont / de l’analyse des patchs

TrueType – TRIANGULATION (CVE‑2023‑41990)

Target: TrueType bytecode inside fpgm/prep/glyf programs.

Structural signals :

  • Présence d’opcodes non documentés/interdits dans l’interpréteur d’Apple utilisé par l’exploit chain.

Pseudo‑logique:

# Flag undocumented TrueType opcodes leveraged by TRIANGULATION
switch opcode:
case 0x8F, 0x90:
mark_malicious("Undocumented TrueType bytecode")
default:
continue

Triage pratique :

  • Dump des tables de polices (e.g., using fontTools/ttx) et analyser les programmes fpgm/prep/glyf
  • Pas besoin d’émuler complètement l’interpréteur pour obtenir de la valeur à partir de vérifications de présence

Remarques :

  • Peut produire de rares faux positifs (FP) si des polices non standard incluent des opcodes inconnus ; valider avec des outils secondaires

DNG/TIFF – CVE‑2025‑43300

Cible : métadonnées d’image DNG/TIFF VS le nombre réel de composants dans le flux encodé (e.g., JPEG‑Lossless SOF3).

Signaux structurels :

  • Incohérence entre les champs EXIF/IFD (SamplesPerPixel, PhotometricInterpretation) et le nombre de composants analysé à partir de l’en-tête du flux image utilisé par le pipeline.

Pseudo‑logique:

# Metadata claims 2 samples per pixel but stream header exposes only 1 component
if samples_per_pixel == 2 and sof3_components == 1:
mark_malicious("DNG/TIFF metadata vs. stream mismatch")

Triage pratique :

  • Parse les IFD primaires et les tags EXIF
  • Localiser et parser l’en-tête JPEG‑Lossless embarqué (SOF3) et comparer le nombre de composants

Notes :

  • Signalé exploité en conditions réelles ; excellent candidat pour des vérifications de cohérence structurelle

DNG/TIFF – Samsung libimagecodec.quram.so (CVE‑2025‑21042) + Appended ZIP payload (LANDFALL)

Cible : images DNG (TIFF‑derived) contenant une archive ZIP embarquée ajoutée en EOF pour mettre en place des payloads natifs après un RCE du parser.

Signaux structurels :

  • L’en-tête magique du fichier indique TIFF/DNG (II*\x00 ou MM\x00*) mais le nom de fichier imite JPEG (p.ex., .jpg/.jpeg nommage WhatsApp).
  • Présence d’un ZIP Local File Header ou d’une signature EOCD près de EOF (PK\x03\x04 ou PK\x05\x06) qui n’est référencée par aucune région de données TIFF IFD (strips/tiles/JPEGInterchangeFormat).
  • Données finales anormalement volumineuses au-delà du dernier bloc de données IFD référencé (des centaines de KB à MB), cohérent avec une archive groupée de modules .so.

Pseudo‑logique :

# Detect appended ZIP payload hidden after DNG/TIFF data (Samsung chain)
if is_tiff_dng(magic):
ext = file_extension()
if ext in {".jpg", ".jpeg"}: mark_suspicious("Extension/magic mismatch: DNG vs JPEG")

zip_off = rfind_any(["PK\x05\x06", "PK\x03\x04"], search_window_last_n_bytes=8*1024*1024)
if zip_off >= 0:
end_dng = approx_end_of_tiff_data()  # max(end of Strip/Tile/JPEGInterchangeFormat regions)
if zip_off > end_dng + 0x200:
mark_malicious("DNG with appended ZIP payload (LANDFALL‑style)")

Triage pratique :

  • Identifier le format vs le nom :
  • file sample; exiftool -s -FileType -MIMEType sample
  • Localiser le footer/header ZIP près de EOF et carve :
  • off=$(grep -aboa -E $‘PK\x05\x06|PK\x03\x04’ sample.dng | tail -n1 | cut -d: -f1)
  • dd if=sample.dng of=payload.zip bs=1 skip=“$off”
  • zipdetails -v payload.zip; unzip -l payload.zip
  • Vérifier que les régions de données TIFF ne chevauchent pas la région ZIP carved :
  • tiffdump -D sample.dng | egrep ‘StripOffsets|TileOffsets|JPEGInterchangeFormat|StripByteCounts|TileByteCounts|JPEGInterchangeFormatLength’
  • Vérifier max(offset+length) << zip_off
  • One‑shot carving (coarse): binwalk -eM sample.dng

Notes :

  • Exploité dans la nature contre la libimagecodec.quram.so de Samsung (CVE‑2025‑21042). L’archive ZIP ajoutée contenait des modules natifs (p.ex., loader + SELinux policy editor) extraits/exécutés post‑RCE.

Modèles d’implémentation et performances

Un scanner pratique doit :

  • Auto‑détecter le type de fichier et lancer uniquement les analyseurs pertinents (PDF/JBIG2, WebP/VP8L, TTF, DNG/TIFF)
  • Parser en flux / partiellement pour minimiser les allocations et permettre une terminaison anticipée
  • Exécuter les analyses en parallèle (thread‑pool) pour le triage en masse

Exemple de flux de travail avec ElegantBouncer (implémentation open‑source en Rust de ces vérifications) :

# Scan a path recursively with structural detectors
$ elegant-bouncer --scan /path/to/directory

# Optional TUI for parallel scanning and real‑time alerts
$ elegant-bouncer --tui --scan /path/to/samples

Conseils DFIR et cas limites

  • Objets embarqués : les PDFs peuvent intégrer des images (JBIG2) et des polices (TrueType) ; extraire et analyser récursivement
  • Sécurité de la décompression : utiliser des bibliothèques qui limitent strictement les tables/tampons avant allocation
  • Faux positifs : maintenir des règles conservatrices, privilégier les contradictions impossibles selon la spécification
  • Dérive de version : réinitialiser les bornes de référence (e.g., VP8L table sizes) lorsque les parseurs upstream modifient les limites

Outils associés

  • ElegantBouncer – scanner structurel pour les détections ci‑dessus
  • pdfid/pdf-parser/peepdf – extraction d’objets PDF et analyse statique
  • pdfcpu – linter/sanitiseur PDF
  • fontTools/ttx – exporte les tables TrueType et le bytecode
  • exiftool – lire les métadonnées TIFF/DNG/EXIF
  • dwebp/webpmux – analyser les métadonnées et chunks WebP

Références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks