Otkrivanje eksploita u strukturnim formatima fajlova (0‑Click Chains)

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Ova stranica sumira praktične tehnike za detekciju 0‑click mobilnih exploit fajlova proverom strukturnih invarijanata njihovih formata umesto oslanjanja na byte potpise. Pristup se generalizuje preko uzoraka, polimorfnih varijanti i budućih eksploita koji zloupotrebljavaju istu parser logiku.

Ključna ideja: enkodirati strukturne nemogućnosti i kontradikcije između polja koje se pojavljuju samo kada je postignuto ranjivo stanje decoder/parser‑a.

See also:

PDF File analysis

Zašto struktura, a ne potpisi

Kada oružani uzorci nisu dostupni i payload bajtovi mutiraju, tradicionalni IOC/YARA paterni zakažu. Strukturna detekcija ispituje deklarisani raspored kontejnera naspram onoga što je matematički ili semantički moguće za implementaciju formata.

Tipične provere:

  • Validirati veličine tabela i granice izvedene iz specifikacije i sigurnih implementacija
  • Označiti ilegalne/neudokumentovane opkodove ili prelaze stanja u ugrađenom bytecode‑u
  • Uporediti metadata VS stvarne komponente enkodovanog stream‑a
  • Detektovati kontradiktorna polja koja ukazuju na konfuziju parser‑a ili postavke za integer overflow

Ispod su konkretni, na terenu testirani paterni za više high‑impact lanaca.


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

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

Strukturni signali:

  • Kontradiktorno stanje rečnika koje se ne može pojaviti u benignom sadržaju, a neophodno je da bi se izazvao overflow u arithmetic decoding.
  • Sumnjiva upotreba global segments u kombinaciji sa abnormalnim brojem simbola tokom 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")

Praktična trijaža:

  • Identifikujte i izdvojite JBIG2 streams iz PDF-a
  • Koristite pdfid/pdf-parser/peepdf za lociranje i dumpovanje streamova
  • Proverite arithmetic coding flags i parametre symbol dictionary u odnosu na JBIG2 spec

Beleške:

  • Radi bez ugrađenih payload potpisa
  • Nizak FP u praksi zato što je označeno stanje matematički nekonzistentno

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

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

Strukturni signali:

  • Ukupna veličina konstruisanih Huffman tabela prelazi bezbedni gornji prag očekivan od reference/patched implementacija, što implicira preuslov za overflow.

Pseudo‑logika:

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

Practical triage:

  • Proveri WebP container chunks: VP8X + VP8L
  • Parsiraj VP8L prefix codes i izračunaj stvarne dodeljene veličine tabela

Notes:

  • Otporno na polimorfizam na nivou bajta u payload‑u
  • Granica je izvedena iz upstream ograničenja i analize patch‑eva

TrueType – TRIANGULATION (CVE‑2023‑41990)

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

Structural signals:

  • Prisutnost nedokumentovanih/zabranjenih opcodes u Apple‑ovom interpreteru koji koristi exploit chain.

Pseudo‑logic:

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

Practical triage:

  • Izdvojite font tabele (npr. koristeći fontTools/ttx) i skenirajte fpgm/prep/glyf programe
  • Nije potrebno potpuno emulirati interpreter da biste izvukli vrednost iz provera prisustva

Notes:

  • Može proizvesti retke lažno pozitivne rezultate ako nestandardni fontovi sadrže nepoznate opkodove; verifikujte sekundarnim alatima

DNG/TIFF – CVE‑2025‑43300

Target: DNG/TIFF image metadata nasuprot stvarnom broju komponenti u enkodovanom streamu (npr. JPEG‑Lossless SOF3).

Structural signals:

  • Nedoslednost između EXIF/IFD polja (SamplesPerPixel, PhotometricInterpretation) i broja komponenti parsiranog iz zaglavlja image stream-a koje koristi pipeline.

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

Praktična trijaža:

  • Parsirati primarne IFD i EXIF tagove
  • Pronaći i parsirati ugrađeno JPEG‑Lossless zaglavlje (SOF3) i uporediti broj komponenti

Napomene:

  • Prijavljeno iskorišćavano u stvarnom svetu; odličan kandidat za provere strukturne konzistentnosti

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

Target: DNG (TIFF‑derived) images carrying an embedded ZIP archive appended at EOF to stage native payloads after parser RCE.

Strukturni signali:

  • File magic ukazuje na TIFF/DNG (II*\x00 or MM\x00*) ali ime fajla imitira JPEG (npr. .jpg/.jpeg u WhatsApp imenovanju).
  • Prisutnost ZIP Local File Header ili EOCD magic blizu EOF (PK\x03\x04 or PK\x05\x06) koji nije referenciran ni u jednom TIFF IFD data regionu (strips/tiles/JPEGInterchangeFormat).
  • Neobično veliki trailing podaci nakon poslednjeg referenciranog IFD data bloka (stotine KB do MB), u skladu sa uključenom arhivom .so modula.

Pseudo‑logic:

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

Praktična trijaža:

  • Identifikujte format naspram imena:
  • file sample; exiftool -s -FileType -MIMEType sample
  • Pronađite ZIP footer/header blizu EOF i 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
  • Brza provera da TIFF data regioni ne preklapaju carved ZIP region:
  • tiffdump -D sample.dng | egrep ‘StripOffsets|TileOffsets|JPEGInterchangeFormat|StripByteCounts|TileByteCounts|JPEGInterchangeFormatLength’
  • Proverite max(offset+length) << zip_off
  • One‑shot carving (grubo): binwalk -eM sample.dng

Notes:

  • Zabeleženo u prirodi protiv Samsung‑ove libimagecodec.quram.so (CVE‑2025‑21042). Priloženi ZIP je sadržao native module (npr. loader + SELinux policy editor) koji su ekstrahovani/izvršeni posle 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).

Strukturni pokazatelji:

  • Overlay items (iloc/iref) čiji izvorni pravougaonici prelaze dimenzije osnovne slike ili čiji offseti imaju negativne/prekoračene vrednosti → dovodi do ImageOverlay::parse out‑of‑bounds (CVE‑2024‑41311).
  • Grid stavke koje referenciraju nepostojeće item ID‑eve (ImageItem_Grid::get_decoder NULL deref, CVE‑2025‑43967) – jednostavna strukturna provera, dekodiranje nije potrebno.
  • SAO/loop‑filter parametri ili brojevi tile‑ova koji primoravaju alokacije tabela većih od maksimalno dozvoljenog u libde265 (CVE‑2025‑29482): preveliki brojevi bandova ili dimenzije slice‑ova.
  • Box length/extent sizes koje pokazuju izvan EOF (tipično u CVE‑2025‑65586 PoC‑ima otkrivenim fuzzing‑om).

Pseudo‑logika:

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

Praktični trijaž:

  • Brza provera metapodataka bez potpunog dekodiranja:
  • heif-info sample.heic
  • oiiotool –info –stats sample.heic
  • Proveriti extente u odnosu na veličinu fajla:
  • heif-convert –verbose sample.heic /dev/null | grep -i extent
  • Carve sumnjive boxes za ručni pregled:
  • dd if=sample.heic bs=1 skip=$((box_off)) count=$((box_len)) of=box.bin

Napomene:

  • Ove provere uhvate malformiranu strukturu pre teškog dekodiranja; korisno za mail/MMS gateway-e koji trebaju samo odluku allow/deny.
  • libheif limits se menjaju između verzija; ponovo prilagodite konstante kada upstream promeni (1.18.x → 1.21.x je pooštrio overlay i grid validaciju).

Obrasci implementacije i performanse

Praktični skener treba da:

  • Automatski detektovati tip fajla i pozvati samo relevantne analizatore (PDF/JBIG2, WebP/VP8L, TTF, DNG/TIFF, HEIF/AVIF)
  • Koristiti stream/partial‑parse da se minimiziraju alokacije i omogući rani prekid
  • Pokretati analize paralelno (thread‑pool) za masovni trijaž

Primer toka rada sa ElegantBouncer (open‑source Rust implementacija ovih provera):

# 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 saveti i rubni slučajevi

  • Embedded objects: PDF-ovi mogu sadržavati slike (JBIG2) i fontove (TrueType); izvucite ih i rekurzivno skenirajte
  • Decompression safety: koristite biblioteke koje strogo ograničavaju tabele/bufere pre alokacije
  • False positives: pravila držite konzervativnim, favorizujte kontradikcije koje su nemoguće prema specifikaciji
  • Version drift: ponovo postavite osnovne granice (npr. VP8L table sizes) kada upstream parseri promene limite

  • ElegantBouncer – strukturni skener za prethodno navedene detekcije
  • pdfid/pdf-parser/peepdf – ekstrakcija PDF objekata i statička analiza
  • pdfcpu – PDF linter/sanitizer
  • fontTools/ttx – ispis TrueType tabela i bajtkoda
  • exiftool – čitanje TIFF/DNG/EXIF metapodataka
  • dwebp/webpmux – parsiranje WebP metapodataka i delova
  • heif-info/heif-convert (libheif) – inspekcija strukture HEIF/AVIF
  • oiiotool – validacija HEIF/AVIF putem OpenImageIO

References

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks