Wykrywanie eksploatacji formatów plików strukturalnych (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 plików exploitów mobilnych 0‑click poprzez weryfikację inwariantów strukturalnych ich formatów zamiast polegania na sygnaturach bajtowych. Podejście to uogólnia się na różne próbki, polimorficzne warianty i przyszłe eksploity wykorzystujące tę samą logikę parsera.
Główna idea: zakodować strukturalne niemożliwości i niespójności między polami, które pojawiają się tylko wtedy, gdy osiągnięty zostanie podatny stan dekodera/parsera.
Zobacz także:
Dlaczego struktura, a nie sygnatury
Gdy weaponized samples są niedostępne, a payload bytes mutują, tradycyjne wzorce IOC/YARA zawodzą. Wykrywanie strukturalne sprawdza zadeklarowany układ kontenera w porównaniu z tym, co jest matematycznie lub semantycznie możliwe dla implementacji formatu.
Typowe sprawdzenia:
- Weryfikuj rozmiary tabel i zakresy wyprowadzone ze specyfikacji oraz bezpiecznych implementacji
- Oznacz nielegalne/nieudokumentowane opcodes lub przejścia stanów w osadzonym bytecode
- Krzyżowo sprawdź metadata VS rzeczywiste składowe zakodowanego strumienia
- Wykryj sprzeczne pola wskazujące na zamieszanie parsera lub przygotowania do integer overflow
Poniżej znajdują się konkretne, przetestowane w praktyce wzorce dla wielu łańcuchów o dużym wpływie.
PDF/JBIG2 – FORCEDENTRY (CVE‑2021‑30860)
Target: JBIG2 symbol dictionaries embedded inside PDFs (often used in mobile MMS parsing).
Structural signals:
- Contradictory dictionary state that cannot occur in benign content but is required to trigger the overflow in arithmetic decoding.
- Suspicious use of global segments combined with abnormal symbol counts during 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")
Praktyczny przesiew:
- Zidentyfikuj i wyodrębnij strumienie JBIG2 z PDF-a
- pdfid/pdf-parser/peepdf do zlokalizowania i zrzucenia strumieni
- Zweryfikuj flagi kodowania arytmetycznego i parametry słownika symboli względem specyfikacji JBIG2
Uwagi:
- Działa bez osadzonych sygnatur payloadu
- 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.
Sygnały strukturalne:
- Całkowity rozmiar skonstruowanych tablic Huffmana przekracza bezpieczny górny limit oczekiwany przez referencyjne/załatane implementacje, co implikuje warunek wstępny przepełnienia.
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")
Praktyczna selekcja:
- Sprawdź bloki kontenera WebP: VP8X + VP8L
- Parsuj kody prefiksowe VP8L i oblicz faktyczne przydzielone rozmiary tabel
Uwagi:
- Odporne na polimorfizm na poziomie bajtu payloadu
- Granica wynika z analizy limitów i poprawek upstream
TrueType – TRIANGULATION (CVE‑2023‑41990)
Target: TrueType bytecode inside fpgm/prep/glyf programs.
Structural signals:
- Obecność nieudokumentowanych/zabronionych opcodes w interpreterze Apple używanym przez exploit chain.
Pseudo‑logika:
# Flag undocumented TrueType opcodes leveraged by TRIANGULATION
switch opcode:
case 0x8F, 0x90:
mark_malicious("Undocumented TrueType bytecode")
default:
continue
Praktyczne rozpoznanie:
- Zrzucić tabele czcionek (np. używając fontTools/ttx) i przeskanować programy fpgm/prep/glyf
- Nie trzeba w pełni emulować interpretera, aby uzyskać wartościowe wyniki z kontroli obecności
Notes:
- Może generować rzadkie fałszywe pozytywy (FP), jeśli niestandardowe czcionki zawierają nieznane opkody; zweryfikuj za pomocą dodatkowych narzędzi
DNG/TIFF – CVE‑2025‑43300
Target: DNG/TIFF image metadata VS actual component count in encoded stream (e.g., JPEG‑Lossless SOF3).
Structural signals:
- Inconsistency between EXIF/IFD fields (SamplesPerPixel, PhotometricInterpretation) and the component count parsed from the image stream header used by the 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")
Praktyczne triage:
- Parsuj główne tagi IFD i EXIF
- Zlokalizuj i sparsuj osadzony nagłówek JPEG‑Lossless (SOF3) oraz porównaj liczbę komponentów
Notes:
- Zgłaszano wykorzystanie w rzeczywistych przypadkach; doskonały kandydat do kontroli spójności strukturalnej
DNG/TIFF – Samsung libimagecodec.quram.so (CVE‑2025‑21042) + Appended ZIP payload (LANDFALL)
Target: obrazy DNG (pochodne od TIFF) zawierające osadzone archiwum ZIP dopisane na końcu pliku (EOF), używane do uruchomienia native payloads po parser RCE.
Structural signals:
- Magic pliku wskazuje TIFF/DNG (
II*\x00orMM\x00*) ale nazwa pliku udaje JPEG (np..jpg/.jpegw nazewnictwie WhatsApp). - Obecność nagłówka ZIP Local File Header lub magicznego EOCD blisko EOF (
PK\x03\x04orPK\x05\x06), który nie jest referencjonowany przez żaden region danych TIFF IFD (strips/tiles/JPEGInterchangeFormat). - Nienaturalnie duże dane na końcu pliku poza ostatnim referencjonowanym blokiem danych IFD (setki KB do MB), zgodne z dołączonym archiwum zawierającym moduły .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)")
Practical triage:
- Zidentyfikuj format vs nazwę:
- file sample; exiftool -s -FileType -MIMEType sample
- Zlokalizuj ZIP footer/header blisko 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
- Sprawdź, czy regiony danych TIFF nie nakładają się na wyodrębniony region ZIP:
- tiffdump -D sample.dng | egrep ‘StripOffsets|TileOffsets|JPEGInterchangeFormat|StripByteCounts|TileByteCounts|JPEGInterchangeFormatLength’
- Verify
max(offset+length) << zip_off - Jednorazowe wyodrębnianie (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.
Wzorce implementacyjne i wydajność
Praktyczny skaner powinien:
- Automatycznie wykrywać typ pliku i uruchamiać tylko odpowiednie analizatory (PDF/JBIG2, WebP/VP8L, TTF, DNG/TIFF)
- Stream/partial‑parse, aby zminimalizować przydziały pamięci i umożliwić wczesne zakończenie
- Uruchamiać analizy równolegle (thread‑pool) dla bulk triage
Przykładowy workflow with ElegantBouncer (open‑source Rust implementation of these checks):
# 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: PDFy mogą osadzać obrazy (JBIG2) i fonty (TrueType); wyodrębnij i przeskanuj rekurencyjnie
- Bezpieczeństwo dekompresji: używaj bibliotek, które nakładają twarde limity na rozmiary tabel/pufrów przed alokacją
- Fałszywe pozytywy: stosuj konserwatywne reguły; preferuj wykrycia oparte na sprzecznościach niemożliwych zgodnie ze specyfikacją
- Dryf wersji: ponownie ustal granice (np. rozmiary tabel VP8L), gdy zewnętrzne parsery zmienią limity
Powiązane narzędzia
- ElegantBouncer – skaner strukturalny dla powyższych wykryć
- pdfid/pdf-parser/peepdf – wyodrębnianie obiektów PDF i analiza statyczna
- pdfcpu – linter/sanitizer plików PDF
- fontTools/ttx – zrzut tabel TrueType i bytecode
- exiftool – odczyt metadanych TIFF/DNG/EXIF
- dwebp/webpmux – parsowanie metadanych i chunków WebP
Referencje
- 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
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.
HackTricks

