Structural File‑Format Exploit Detection (0‑Click Chains)

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Ta strona podsumowuje praktyczne techniki wykrywania 0‑click mobile exploit files poprzez weryfikację inwariantów strukturalnych ich formatów zamiast polegania na sygnaturach bajtowych. Podejście uogólnia się na różne próbki, warianty polimorficzne oraz przyszłe exploits wykorzystujące tę samą logikę parsera/dekodera.

Key idea: zakodować niemożliwości strukturalne i niespójności między polami, które pojawiają się tylko wtedy, gdy osiągnięty zostaje stan podatnego dekodera/parsera.

See also:

PDF File analysis

Why structure, not signatures

Gdy weaponized samples są niedostępne i payload bytes mutują, tradycyjne wzorce IOC/YARA zawodzą. Wykrywanie strukturalne bada zadeklarowany układ kontenera w kontraście z tym, co jest matematycznie lub semantycznie możliwe dla implementacji formatu.

Typical checks:

  • Waliduj rozmiary tabel i granice wyprowadzone ze specyfikacji oraz bezpiecznych implementacji
  • Oznacz nielegalne/nieudokumentowane opcode’y lub przejścia stanów w osadzonym bytecode
  • Krzyżowo sprawdź metadata VS faktyczne zakodowane komponenty strumienia
  • Wykrywaj sprzeczne pola wskazujące na zdezorientowanie parsera lub konfiguracje prowadzące do integer overflow

Poniżej znajdują się konkretne, przetestowane w praktyce wzorce dla wielu high‑impact chains.


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

Target: JBIG2 symbol dictionaries osadzone w PDF (często używane w parsowaniu mobilnych MMS).

Structural signals:

  • Sprzeczny stan słownika, który nie może wystąpić w benign content, ale jest wymagany do wywołania overflow w arithmetic decoding.
  • Podejrzane użycie global segments połączone z nieprawidłowymi liczbami symboli podczas 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")

Praktyczna ocena:

  • Zidentyfikuj i wyodrębnij strumienie JBIG2 z PDF
  • pdfid/pdf-parser/peepdf — użyj do zlokalizowania i zrzucenia strumieni
  • Zweryfikuj flagi kodowania arytmetycznego i parametry słownika symboli względem specyfikacji JBIG2

Notes:

  • Działa bez osadzonych sygnatur payload
  • Niska liczba FP w praktyce, ponieważ oznaczony stan jest matematycznie niespójny

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

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

Structural signals:

  • Całkowity rozmiar skonstruowanych tabel Huffmana przekracza bezpieczny górny limit oczekiwany przez referencyjne/załatane implementacje, co sugeruje warunek wstępny przepełnienia.

Pseudo‑logic:

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

Praktyczny triaż:

  • Sprawdź chunky kontenera WebP: VP8X + VP8L
  • Parsuj VP8L prefix codes i oblicz rzeczywiste rozmiary przydzielonych tabel

Uwagi:

  • Odporny na polimorfizm payloadu na poziomie bajtów
  • Granica pochodzi z analizy limitów/łat upstream

TrueType – TRIANGULATION (CVE‑2023‑41990)

Cel: TrueType bytecode wewnątrz programów fpgm/prep/glyf.

Sygnały strukturalne:

  • Obecność nieudokumentowanych/zabronionych opcode’ów w interpreterze Apple używanym przez exploit chain.

Pseudo‑logika:

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

Praktyczne triage:

  • Wykonaj zrzut tabel fontów (np. używając fontTools/ttx) i przeskanuj programy fpgm/prep/glyf
  • Nie trzeba w pełni emulować interpretera, aby uzyskać użyteczne informacje z kontroli obecności

Uwagi:

  • Może powodować rzadkie FPs, jeśli niestandardowe fonty zawierają nieznane opcodes; zweryfikuj za pomocą dodatkowych narzędzi

DNG/TIFF – CVE‑2025‑43300

Cel: metadane obrazów DNG/TIFF wobec rzeczywistej liczby komponentów w zakodowanym strumieniu (np. JPEG‑Lossless SOF3).

Sygnały strukturalne:

  • Niespójność między polami EXIF/IFD (SamplesPerPixel, PhotometricInterpretation) a liczbą komponentów sparsowaną z nagłówka strumienia obrazu używanego przez pipeline.

Pseudo-logika:

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

Practical triage:

  • Parsuj główne tagi IFD i EXIF
  • Zlokalizuj i sparsuj osadzony nagłówek JPEG‑Lossless (SOF3) i porównaj liczbę komponentów

Notes:

  • Reported exploited in the wild; excellent candidate for structural consistency checks

DNG/TIFF – Samsung libimagecodec.quram.so (CVE‑2025‑21042) + Dołączony ZIP payload (LANDFALL)

Target: obrazy DNG (pochodne od TIFF) zawierające osadzony archiwum ZIP dopisany na EOF, służące do stage’owania natywnych payloadów po parser RCE.

Wskaźniki strukturalne:

  • Magic number pliku wskazuje na TIFF/DNG (II*\x00 or MM\x00*) ale nazwa pliku udaje JPEG (np. .jpg/.jpeg w nazewnictwie WhatsApp).
  • Obecność ZIP Local File Header lub EOCD magic blisko EOF (PK\x03\x04 or PK\x05\x06) która nie jest referencjonowana przez żaden region danych IFD TIFF (strips/tiles/JPEGInterchangeFormat).
  • Nietypowo duże dane końcowe poza ostatnim referencjonowanym blokiem danych IFD (setki KB do MB), zgodne z dołączonym archiwum modułów .so.

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

Praktyczne triage:

  • Rozróżnij format od nazwy pliku:
  • file sample; exiftool -s -FileType -MIMEType sample
  • Zlokalizuj stopkę/nagłówek ZIP blisko EOF i wydziel:
  • 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: upewnij się, że regiony danych TIFF nie zachodzą na wydzielony region ZIP:
  • tiffdump -D sample.dng | egrep ‘StripOffsets|TileOffsets|JPEGInterchangeFormat|StripByteCounts|TileByteCounts|JPEGInterchangeFormatLength’
  • Zweryfikuj max(offset+length) << zip_off
  • One‑shot carving (coarse): binwalk -eM sample.dng

Notatki:

  • Wykorzystywane w naturze przeciwko Samsung’s libimagecodec.quram.so (CVE‑2025‑21042). Dołączony ZIP zawierał moduły natywne (np. loader + edytor polityk SELinux) wyodrębnione/wykonywane po 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).

Structural signals:

  • Overlay items (iloc/iref) whose source rectangles exceed the base image dimensions or whose offsets are negative/overflowing → triggers ImageOverlay::parse out‑of‑bounds (CVE‑2024‑41311).
  • Grid items referencing non‑existent item IDs (ImageItem_Grid::get_decoder NULL deref, CVE‑2025‑43967) – łatwa kontrola strukturalna, nie wymaga dekodowania.
  • Parametry SAO/loop‑filter lub liczby tile, które wymuszają alokacje tabel większe niż maksymalnie dozwolone przez libde265 (CVE‑2025‑29482): zbyt duża liczba bandów lub rozmiary slice.
  • Rozmiary box length/extent wskazujące poza EOF (typowe w PoCach CVE‑2025‑65586 znalezionych przez fuzzing).

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

Praktyczny triage:

  • Szybczna weryfikacja metadanych bez pełnego dekodowania:
  • heif-info sample.heic
  • oiiotool –info –stats sample.heic
  • Weryfikuj extents względem rozmiaru pliku:
  • heif-convert –verbose sample.heic /dev/null | grep -i extent
  • Wyodrębniaj podejrzane boxes do ręcznej inspekcji:
  • dd if=sample.heic bs=1 skip=$((box_off)) count=$((box_len)) of=box.bin

Uwagi:

  • Te kontrole wykrywają niepoprawną strukturę przed ciężkim dekodowaniem; przydatne dla bramek mail/MMS, które potrzebują tylko decyzji allow/deny.
  • libheif limits shift across versions; re‑baseline constants when upstream changes (1.18.x → 1.21.x tightened overlay and grid validation).

Wzorce implementacyjne i wydajność

Praktyczny skaner powinien:

  • Automatycznie wykrywać typ pliku i uruchamiać tylko odpowiednie analizatory (PDF/JBIG2, WebP/VP8L, TTF, DNG/TIFF, HEIF/AVIF)
  • Przetwarzać strumieniowo/częściowo, aby zminimalizować alokacje i umożliwić wczesne zakończenie
  • Uruchamiać analizy równolegle (thread‑pool) dla masowego triage

Przykładowy workflow z ElegantBouncer (otwartoźródłowa implementacja w Rust tych kontroli):

# 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 — wskazówki i przypadki brzegowe

  • Osadzone obiekty: Pliki PDF mogą osadzać obrazy (JBIG2) i czcionki (TrueType); wyodrębnij je i przeskanuj rekurencyjnie
  • Bezpieczeństwo dekompresji: używaj bibliotek, które twardo ograniczają rozmiary tabel/buforów przed alokacją
  • Fałszywe pozytywy: utrzymuj reguły konserwatywne, preferuj sprzeczności niemożliwe w ramach specyfikacji
  • Dryf wersji: ponownie ustal granice (np. rozmiary tabel VP8L) gdy parsery upstream zmieniają limity

Powiązane narzędzia

  • ElegantBouncer – skaner strukturalny dla powyższych detekcji
  • pdfid/pdf-parser/peepdf – ekstrakcja obiektów PDF i analiza statyczna
  • pdfcpu – linter/sanitizer dla PDF
  • fontTools/ttx – zrzut tabel TrueType i bytecode
  • exiftool – odczyt metadanych TIFF/DNG/EXIF
  • dwebp/webpmux – parsowanie metadanych WebP i chunków
  • heif-info/heif-convert (libheif) – inspekcja struktury HEIF/AVIF
  • oiiotool – walidacja HEIF/AVIF przez OpenImageIO

References

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks