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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
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:
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*\x00orMM\x00*) ale nazwa pliku udaje JPEG (np..jpg/.jpegw nazewnictwie WhatsApp). - Obecność ZIP Local File Header lub EOCD magic blisko EOF (
PK\x03\x04orPK\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
- ELEGANTBOUNCER: When You Can’t Get the Samples but Still Need to Catch the Threat
- ElegantBouncer project (GitHub)
- Researching FORCEDENTRY: Detecting the exploit with no samples
- Researching BLASTPASS – Detecting the exploit inside a WebP file (Part 1)
- Researching BLASTPASS – Analysing the Apple & Google WebP PoC file (Part 2)
- Researching TRIANGULATION – Detecting CVE‑2023‑41990 with single‑byte signatures
- CVE‑2025‑43300: Critical vulnerability found in Apple’s DNG image processing
- LANDFALL: New Commercial-Grade Android Spyware in Exploit Chain Targeting Samsung Devices
- CVE‑2024‑41311 analysis (libheif overlay OOB)
- CVE‑2025‑65586 libheif metadata iterator flaw
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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


