Rilevamento degli Exploit in File Strutturati (0‑Click Chains)

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Questa pagina riassume tecniche pratiche per rilevare file exploit mobili 0‑click validando invarianti strutturali dei loro formati invece di affidarsi a byte signatures. L’approccio si generalizza attraverso campioni diversi, varianti polimorfiche e futuri exploit che abusano della stessa parser logic.

Idea chiave: codificare impossibilità strutturali e inconsistenze cross‑field che compaiono solo quando viene raggiunto uno stato vulnerabile del decoder/parser.

Vedi anche:

PDF File analysis

Perché la struttura, non le signatures

Quando campioni weaponized non sono disponibili e i payload bytes mutano, gli schemi tradizionali IOC/YARA falliscono. La detection strutturale ispeziona il layout dichiarato del contenitore rispetto a ciò che è matematicamente o semanticamente possibile per l’implementazione del formato.

Controlli tipici:

  • Validare le dimensioni delle tabelle e i limiti derivati dalla spec e dalle implementazioni sicure
  • Segnalare opcodes illegali/non documentati o transizioni di stato in embedded bytecode
  • Cross‑check metadata VS componenti reali dello stream codificato
  • Rilevare campi contraddittori che indicano parser confusion o set‑up per integer overflow

Di seguito pattern concreti, testati sul campo, per più catene ad alto impatto.


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

Obiettivo: JBIG2 symbol dictionaries embedded inside PDFs (spesso usati nel parsing MMS su mobile).

Indicatori strutturali:

  • Stato del dizionario contraddittorio che non può verificarsi in contenuti benigni ma è richiesto per innescare l’overflow nell’arithmetic decoding.
  • Uso sospetto di global segments combinato con conteggi anomali di symbol durante il refinement coding.

Pseudo‑logica:

# 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 pratico:

  • Identificare ed estrarre gli stream JBIG2 dal PDF
  • pdfid/pdf-parser/peepdf per localizzare e dumpare gli stream
  • Verificare i flag di arithmetic coding e i parametri del symbol dictionary rispetto alla spec JBIG2

Note:

  • Funziona senza embedded payload signatures
  • Basso FP in pratica perché lo stato segnalato è matematicamente inconsistente

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

Obiettivo: WebP lossless (VP8L) Huffman prefix‑code tables.

Segnali strutturali:

  • La dimensione totale delle tabelle Huffman costruite supera il limite superiore sicuro previsto dalle implementazioni reference/patched, implicando la precondizione per un overflow.

Pseudo‑logica:

# 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 pratico:

  • Controllare i chunk del container WebP: VP8X + VP8L
  • Analizzare i VP8L prefix codes e calcolare le dimensioni effettivamente allocate delle tabelle

Note:

  • Robusto contro il byte‑level polymorphism del payload
  • Bound è derivato dai limiti upstream/dall’analisi delle patch

TrueType – TRIANGULATION (CVE‑2023‑41990)

Target: TrueType bytecode all’interno dei programmi fpgm/prep/glyf.

Segnali strutturali:

  • Presenza di opcode non documentati/proibiti nell’interprete di Apple usato dalla exploit chain.

Pseudo‑logica:

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

Triage pratico:

  • Estrarre le tabelle dei font (es., usando fontTools/ttx) e scansionare i programmi fpgm/prep/glyf
  • Non è necessario emulare completamente l’interprete per ottenere valore dai presence checks

Note:

  • Potrebbe produrre rari falsi positivi (FPs) se font non standard includono opcode sconosciuti; convalida con strumenti secondari

DNG/TIFF – CVE‑2025‑43300

Obiettivo: metadati immagine DNG/TIFF VS reale numero di componenti nel flusso codificato (es., JPEG‑Lossless SOF3).

Segnali strutturali:

  • Incoerenza tra i campi EXIF/IFD (SamplesPerPixel, PhotometricInterpretation) e il conteggio dei componenti analizzato dall’header del flusso immagine usato dalla pipeline.

Pseudo‑logica:

# 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 pratico:

  • Analizzare IFD primario e tag EXIF
  • Individuare e analizzare l’header JPEG‑Lossless incorporato (SOF3) e confrontare il conteggio dei componenti

Note:

  • Segnalato come sfruttato nel mondo reale; eccellente candidato per controlli di consistenza strutturale

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

Obiettivo: immagini DNG (derivate da TIFF) che contengono un archivio ZIP incorporato aggiunto alla fine del file (EOF) per eseguire payload nativi dopo RCE del parser.

Segnali strutturali:

  • La magic del file indica TIFF/DNG (II*\x00 or MM\x00*) ma il nome del file imita JPEG (es., .jpg/.jpeg come avviene con WhatsApp).
  • Presenza di un ZIP Local File Header o di una magic EOCD vicino alla EOF (PK\x03\x04 or PK\x05\x06) che non è referenziata da nessuna regione dati TIFF IFD (strips/tiles/JPEGInterchangeFormat).
  • Dati finali insolitamente grandi oltre l’ultimo blocco dati IFD referenziato (centinaia di KB fino a MB), coerenti con un archivio incluso di moduli .so.

Pseudo‑logica:

# 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 pratico:

  • Identificare formato vs nome:
  • file sample; exiftool -s -FileType -MIMEType sample
  • Individuare footer/header ZIP vicino a EOF e 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
  • Verifica di sanità: le regioni dati TIFF non si sovrappongono alla 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.

Modelli di implementazione e prestazioni

Uno scanner pratico dovrebbe:

  • Rilevare automaticamente il tipo di file e dispatchare solo gli analyzers rilevanti (PDF/JBIG2, WebP/VP8L, TTF, DNG/TIFF)
  • Stream/partial‑parse per minimizzare le allocazioni e abilitare la terminazione anticipata
  • Eseguire le analisi in parallelo (thread‑pool) per il triage di massa

Esempio di workflow con ElegantBouncer (implementazione Rust open‑source di questi controlli):

# 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

Consigli DFIR e casi limite

  • Oggetti incorporati: i PDF possono incorporare immagini (JBIG2) e font (TrueType); estrarre e scansionare ricorsivamente
  • Sicurezza nella decompressione: usare librerie che impongano limiti rigidi a tabelle/buffer prima dell’allocazione
  • Falsi positivi: mantenere regole conservative, favorire contraddizioni impossibili secondo la specifica
  • Deriva di versione: ricalibrare i limiti di riferimento (p.es., dimensioni delle tabelle VP8L) quando i parser a monte cambiano i limiti

Strumenti correlati

  • ElegantBouncer – scanner strutturale per le rilevazioni precedenti
  • pdfid/pdf-parser/peepdf – estrazione di oggetti PDF e analisi statica
  • pdfcpu – linter/sanitizzatore per PDF
  • fontTools/ttx – dump delle tabelle TrueType e del bytecode
  • exiftool – lettura dei metadata TIFF/DNG/EXIF
  • dwebp/webpmux – analizza i metadata e i chunk di WebP

Riferimenti

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks