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

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:

PDF File analysis

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*\x00 or MM\x00*) ale nazwa pliku udaje JPEG (np. .jpg/.jpeg w nazewnictwie WhatsApp).
  • Obecność nagłówka ZIP Local File Header lub magicznego EOCD blisko EOF (PK\x03\x04 or PK\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

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