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

Reading time: 6 minutes

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 mobilnych plików‑eksploitów 0‑click poprzez weryfikację niezmienników strukturalnych ich formatów zamiast polegania na sygnaturach bajtowych. Podejście uogólnia się na próbki, warianty polimorficzne oraz przyszłe exploity wykorzystujące tę samą logikę parsera.

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

Zobacz też:

PDF File analysis

Dlaczego struktura, a nie sygnatury

Gdy próbki uzbrojone są niedostępne a bajty ładunku 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 kontrole:

  • Weryfikuj rozmiary tabel i zakresy wyprowadzone ze specyfikacji i bezpiecznych implementacji
  • Oznacz nielegalne/nieudokumentowane opcodes lub przejścia stanów w osadzonym bytecode
  • Porównaj metadata z rzeczywistymi zakodowanymi komponentami strumienia
  • Wykryj sprzeczne pola wskazujące na zamieszanie parsera lub przygotowania do integer overflow

Poniżej znajdują się konkretne, w praktyce przetestowane wzorce dla wielu łańcuchów o dużym znaczeniu.


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

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

Structural signals:

  • Sprzeczny stan słownika, który nie występuje w treści nieszkodliwej, ale jest wymagany do wywołania overflow w arithmetic decoding.
  • Podejrzane wykorzystanie global segments połączone z nieprawidłową liczbą symboli podczas refinement coding.

Pseudo‑logika:

pseudo
# 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 triaż:

  • Zidentyfikuj i wyodrębnij strumienie JBIG2 z PDF
  • 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
  • Niskie 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 implementacje referencyjne/załatane, co sugeruje warunek wstępny przepełnienia.

Pseudologika:

pseudo
# 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:

  • Sprawdź WebP container chunks: VP8X + VP8L
  • Parsuj VP8L prefix codes i oblicz faktyczne zaalokowane rozmiary tabel

Notes:

  • Odporny na polimorfizm payloadu na poziomie bajtów
  • 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‑logic:

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

Praktyczne triage:

  • Zrzucić tabele fontów (np. używając fontTools/ttx) i przeskanować programy fpgm/prep/glyf
  • Nie trzeba w pełni emulować interpretera, aby uzyskać wartość ze sprawdzeń obecności

Uwaga:

  • Może powodować rzadkie fałszywe pozytywy (FP), jeśli niestandardowe fonty zawierają nieznane opcodes; 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:

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

Pseudo‑logic:

pseudo
# 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
  • Znajdź i parsuj osadzony nagłówek JPEG‑Lossless (SOF3) oraz porównaj liczbę komponentów

Notes:

  • Zgłaszano wykorzystania w rzeczywistych atakach; doskonały kandydat do kontroli spójności strukturalnej

Wzorce implementacji i wydajność

Praktyczny skaner powinien:

  • Automatycznie wykrywać typ pliku i uruchamiać tylko odpowiednie analizatory (PDF/JBIG2, WebP/VP8L, TTF, DNG/TIFF)
  • Przetwarzać strumieniowo/parsować częściowo, aby zminimalizować alokacje i umożliwić wcześniejsze zakończenie
  • Uruchamiać analizy równolegle (thread‑pool) przy przetwarzaniu wsadowym

Przykładowy przebieg pracy z ElegantBouncer (otwartoźródłowa implementacja w Rust tych sprawdzeń):

bash
# 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

Wskazówki DFIR i przypadki brzegowe

  • Embedded objects: Pliki PDF mogą osadzać obrazy (JBIG2) i fonty (TrueType); wyodrębnij je i przeskanuj rekurencyjnie
  • Decompression safety: używaj bibliotek, które narzucają twarde limity na tabele/bufory przed alokacją
  • Fałszywe alarmy: utrzymuj reguły konserwatywne, preferuj sprzeczności, które są niemożliwe zgodnie ze specyfikacją
  • Version drift: ponownie ustal granice (np. rozmiary tabel VP8L), gdy parsery upstream zmieniają limity

  • 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 – wyodrębnianie tabel TrueType i bytecode
  • exiftool – czytanie metadanych TIFF/DNG/EXIF
  • dwebp/webpmux – parsowanie metadanych i chunków WebP

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