Strukturelle Dateiformat-Exploit Detection (0‑Click Chains)

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Diese Seite fasst praktische Techniken zusammen, um 0‑click mobile exploit files zu erkennen, indem strukturelle Invarianten ihrer Formate validiert werden, statt sich auf Byte-Signaturen zu verlassen. Der Ansatz generalisiert über samples, polymorphe Varianten und zukünftige exploits, die dieselbe parser logic missbrauchen.

Kernidee: strukturelle Unmöglichkeiten und feldübergreifende Inkonsistenzen kodieren, die nur auftreten, wenn ein verwundbarer Decoder/Parser-Zustand erreicht wird.

Siehe auch:

PDF File analysis

Warum Struktur, nicht Signaturen

Wenn weaponized samples nicht verfügbar sind und payload bytes mutieren, versagen traditionelle IOC/YARA-Pattern. Strukturelle Erkennung prüft das deklarierte Layout des Containers gegenüber dem, was mathematisch oder semantisch für die Format-Implementierung möglich ist.

Typische Prüfungen:

  • Validiere Tabellengrößen und Grenzen, abgeleitet von der Spezifikation und sicheren Implementierungen
  • Markiere illegale/undokumentierte opcodes oder Zustandsübergänge in eingebettetem bytecode
  • Kreuzprüfe Metadaten VS tatsächliche kodierte Stream-Komponenten
  • Erkenne widersprüchliche Felder, die auf Parser-Verwirrung oder Integer-Overflow-Setups hinweisen

Nachfolgend konkrete, feldgetestete Muster für mehrere high‑impact chains.


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

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

Strukturelle Signale:

  • Widersprüchlicher dictionary state, der in benign content nicht auftreten kann, aber erforderlich ist, um den Overflow in arithmetic decoding auszulösen.
  • Verdächtige Verwendung von global segments kombiniert mit abnormalen symbol counts während refinement coding.

Pseudo‑logic:

# 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")

Praktische Triage:

  • JBIG2-Streams im PDF identifizieren und extrahieren
  • pdfid/pdf-parser/peepdf, um Streams zu lokalisieren und zu dumpen
  • Arithmetische-Codierungs-Flags und Parameter des Symbol-Wörterbuchs gegen die JBIG2-Spezifikation verifizieren

Anmerkungen:

  • Funktioniert ohne eingebettete Payload-Signaturen
  • Geringe FP-Rate in der Praxis, weil der markierte Zustand mathematisch inkonsistent ist

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

Target: WebP lossless (VP8L) Huffman-Präfix-Codetabellen.

Strukturelle Hinweise:

  • Die Gesamtgröße der konstruierten Huffman-Tabellen überschreitet die sichere obere Grenze, die von den Referenz-/gepatchten Implementierungen erwartet wird, was darauf hinweist, dass die Bedingung für einen Überlauf erfüllt ist.

Pseudo-Logik:

# 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")

Praktische Triage:

  • Überprüfe WebP-Container-Chunks: VP8X + VP8L
  • Parste VP8L-Präfixcodes und berechne die tatsächlich zugewiesenen Tabellengrößen

Hinweise:

  • Robust gegenüber byte‑level polymorphism der payload
  • Die Grenze wird aus der Analyse der upstream-Limits und Patches abgeleitet

TrueType – TRIANGULATION (CVE‑2023‑41990)

Ziel: TrueType bytecode in fpgm/prep/glyf-Programmen.

Strukturelle Signale:

  • Vorhandensein von undokumentierten/verbotenen opcodes im Apple‑Interpreter, die von der exploit chain verwendet werden.

Pseudo‑Logik:

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

Practical triage:

  • Dump font tables (e.g., using fontTools/ttx) and scan fpgm/prep/glyf programs
  • No need to fully emulate the interpreter to get value from presence checks

Notes:

  • May produce rare False Positives (FPs) if nonstandard Fonts include unknown opcodes; validate with secondary tooling

DNG/TIFF – CVE‑2025‑43300

Target: DNG/TIFF image metadata gegen die tatsächliche Komponentenanzahl im kodierten Stream (z. B. JPEG‑Lossless SOF3).

Structural signals:

  • Inkonsistenz zwischen EXIF/IFD‑Feldern (SamplesPerPixel, PhotometricInterpretation) und der aus dem Image‑Stream‑Header geparsten Komponentenanzahl, die von der Pipeline verwendet wird.

Pseudo‑logic:

# 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")

Praktische Triage:

  • Primäre IFD- und EXIF-Tags parsen
  • Den eingebetteten JPEG‑Lossless-Header (SOF3) finden und parsen sowie Komponentenanzahlen vergleichen

Anmerkungen:

  • Über Ausnutzung in der freien Wildbahn berichtet; ausgezeichneter Kandidat für strukturelle Konsistenzprüfungen

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

Ziel: DNG (TIFF‑abgeleitete) Bilder, die ein eingebettetes ZIP-Archiv am EOF angehängt enthalten, um native Payloads nach einem Parser RCE zu platzieren.

Strukturelle Signale:

  • File magic zeigt TIFF/DNG (II*\x00 oder MM\x00*) an, aber der Dateiname imitiert JPEG (z. B. .jpg/.jpeg WhatsApp-Benennung).
  • Vorhandensein eines ZIP Local File Header oder EOCD magic nahe EOF (PK\x03\x04 oder PK\x05\x06), das von keinem TIFF IFD-Datenbereich (strips/tiles/JPEGInterchangeFormat) referenziert wird.
  • Ungewöhnlich große trailing data über den letzten referenzierten IFD-Datenblock hinaus (hundert KB bis MB), konsistent mit einem gebündelten Archiv von .so-Modulen.

Pseudo‑Logik:

# 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)")

Practical triage:

  • Identify format vs name:
  • file sample; exiftool -s -FileType -MIMEType sample
  • Locate ZIP footer/header near EOF and 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
  • Sanity‑check TIFF data regions don’t overlap the carved ZIP region:
  • tiffdump -D sample.dng | egrep ‘StripOffsets|TileOffsets|JPEGInterchangeFormat|StripByteCounts|TileByteCounts|JPEGInterchangeFormatLength’
  • Verify max(offset+length) << zip_off
  • One‑shot carving (coarse): binwalk -eM sample.dng

Notes:

  • Exploited in the wild against Samsung’s libimagecodec.quram.so (CVE‑2025‑21042). The appended ZIP contained native modules (e.g., loader + SELinux policy editor) extracted/executed post‑RCE.

HEIF/AVIF – libheif & libde265 (CVE‑2024‑41311, CVE‑2025‑29482, CVE‑2025‑65586)

Target: HEIF/AVIF containers parsed by libheif (and ImageIO/OpenImageIO builds that bundle it).

Struktursignale:

  • Overlay items (iloc/iref), deren Quellrechtecke die Basisbild-Dimensionen überschreiten oder deren Offsets negativ/überlaufend sind → löst ImageOverlay::parse out‑of‑bounds aus (CVE‑2024‑41311).
  • Grid items, die auf nicht existierende Item‑IDs verweisen (ImageItem_Grid::get_decoder NULL deref, CVE‑2025‑43967) – einfache Strukturprüfung, kein Decoding erforderlich.
  • SAO/loop‑filter-Parameter oder Tile‑Anzahlen, die Tabellenallokationen erzwingen, die größer sind als das von libde265 erlaubte Maximum (CVE‑2025‑29482): zu hohe Band‑Counts oder Slice‑Dimensionen.
  • Box length/extent Größen, die über EOF hinaus zeigen (typisch in CVE‑2025‑65586 PoCs, die via fuzzing entdeckt wurden).

Pseudo‑logic:

# HEIF overlay bounds check
for overlay in heif_overlays:
if overlay.x < 0 or overlay.y < 0: mark_malicious("HEIF overlay negative offset")
if overlay.x + overlay.w > base.w or overlay.y + overlay.h > base.h:
mark_malicious("HEIF overlay exceeds base image (CVE‑2024‑41311 pattern)")

# Grid item reference validation
for grid in heif_grids:
if any(ref_id not in item_ids):
mark_malicious("HEIF grid references missing item (CVE‑2025‑43967 pattern)")

# SAO / slice allocation guard
if sao_band_count > 32 or (tile_cols * tile_rows) > MAX_TILES or sao_eo_class not in {0..3}:
mark_malicious("HEIF SAO/tiling exceeds safe bounds (CVE‑2025‑29482 pattern)")

Praktische Triage:

  • Schnelle Metadaten-Prüfung ohne vollständiges Decoding:
  • heif-info sample.heic
  • oiiotool –info –stats sample.heic
  • Extents im Verhältnis zur Dateigröße validieren:
  • heif-convert –verbose sample.heic /dev/null | grep -i extent
  • Verdächtige Boxes für manuelle Inspektion ausschneiden:
  • dd if=sample.heic bs=1 skip=$((box_off)) count=$((box_len)) of=box.bin

Hinweise:

  • Diese Prüfungen erkennen fehlerhafte Strukturen bevor ein aufwändiges Decoding erfolgt; nützlich für mail/MMS-Gateways, die nur Zulassen-/Ablehnen-Entscheidungen treffen müssen.
  • libheif-Limits verschieben sich zwischen Versionen; Konstanten neu kalibrieren, wenn upstream sich ändert (1.18.x → 1.21.x verschärfte Overlay- und Grid-Validierung).

Implementierungsmuster und Leistung

Ein praktischer Scanner sollte:

  • Automatisch Dateityp erkennen und nur relevante Analyzer ausführen (PDF/JBIG2, WebP/VP8L, TTF, DNG/TIFF, HEIF/AVIF)
  • Stream/teilweises Parsen, um Speicherallokationen zu minimieren und frühes Beenden zu ermöglichen
  • Analysen parallel ausführen (Thread‑Pool) für Massen-Triage

Beispiel-Workflow mit ElegantBouncer (Open-Source Rust-Implementierung dieser Prüfungen):

# 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

DFIR-Tipps und Randfälle

  • Eingebettete Objekte: PDFs können Bilder (JBIG2) und Fonts (TrueType) einbetten; extrahieren und rekursiv scannen
  • Sicherheit bei Dekompression: Verwende Bibliotheken, die Tabellen/Puffer vor der Allokation hart begrenzen
  • Fehlalarme: Regeln konservativ halten, Widersprüche bevorzugen, die gemäß der Spezifikation unmöglich sind
  • Versionsdrift: Grenzwerte neu festlegen (z. B. VP8L-Tabellengrößen), wenn upstream Parser ihre Limits ändern

Verwandte Tools

  • ElegantBouncer – struktureller Scanner für die oben genannten Erkennungen
  • pdfid/pdf-parser/peepdf – PDF-Objekt-Extraktion und statische Analyse
  • pdfcpu – PDF-Linter/Sanitizer
  • fontTools/ttx – TrueType-Tabellen und Bytecode ausgeben
  • exiftool – TIFF/DNG/EXIF-Metadaten lesen
  • dwebp/webpmux – WebP-Metadaten und Chunks parsen
  • heif-info/heif-convert (libheif) – HEIF/AVIF-Strukturinspektion
  • oiiotool – HEIF/AVIF über OpenImageIO validieren

Referenzen

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks