Виявлення експлойтів структурних форматів файлів (0‑Click Chains)

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

Ця сторінка узагальнює практичні методи виявлення 0‑click мобільних експлойт-файлів шляхом перевірки структурних інваріантів їхніх форматів замість покладання на байтові сигнатури. Підхід узагальнюється на зразки, поліморфні варіанти та майбутні експлойти, що зловживають тією самою логікою парсера.

Ключова ідея: закодувати структурні неможливості та суперечності між полями, які з’являються лише тоді, коли досягається вразливий стан декодера/парсера.

See also:

PDF File analysis

Чому структура, а не сигнатури

Коли озброєні зразки недоступні і байти payload мутують, традиційні IOC/YARA патерни не спрацьовують. Структурне виявлення перевіряє оголошену розмітку контейнера порівняно з тим, що математично або семантично можливо для реалізації формату.

Типові перевірки:

  • Перевіряти розміри таблиць і межі, виведені зі специфікації та безпечних реалізацій
  • Позначати незаконні/недокументовані опкоди або переходи станів у вбудованому байткоді
  • Перехресна перевірка метаданих проти фактичних закодованих компонентів потоку
  • Виявляти суперечливі поля, які свідчать про плутанину парсера або про конструкції, спрямовані на виклик переповнення цілих чисел

Нижче наведено конкретні, перевірені на практиці шаблони для кількох ланцюжків з високим ступенем впливу.


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

Практичний триаж:

  • Виявити та витягти JBIG2 потоки з PDF
  • pdfid/pdf-parser/peepdf — для пошуку та дампу потоків
  • Перевірити прапори арифметичного кодування та параметри словника символів відповідно до JBIG2 spec

Notes:

  • Працює без підписів вбудованого payload
  • Низький рівень FP на практиці, оскільки позначений стан математично неконсистентний

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

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

Структурні сигнали:

  • Загальний розмір побудованих Huffman-таблиць перевищує безпечну верхню межу, яку очікують еталонні/виправлені реалізації, що вказує на наявність передумови переповнення.

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

Практичний тріаж:

  • Перевірити чанки контейнера WebP: VP8X + VP8L
  • Розібрати префіксні коди VP8L і обчислити фактичні розміри виділених таблиць

Примітки:

  • Стійкий до byte‑level polymorphism payload
  • Межа визначається на основі upstream limits/patch analysis

TrueType – TRIANGULATION (CVE‑2023‑41990)

Ціль: TrueType bytecode всередині програм fpgm/prep/glyf.

Структурні сигнали:

  • Наявність недокументованих/заборонених opcodes в Apple’s interpreter, які використовуються exploit chain.

Псевдологіка:

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

Практичний тріаж:

  • Dump font tables (e.g., using fontTools/ttx) and scan fpgm/prep/glyf programs
  • No need to fully emulate the interpreter to get value from presence checks

Notes:

  • May produce rare FPs if nonstandard fonts include unknown opcodes; validate with secondary tooling

DNG/TIFF – CVE‑2025‑43300

Ціль: невідповідність метаданих зображення DNG/TIFF та фактичної кількості компонентів у кодуваному потоці (наприклад, JPEG‑Lossless SOF3).

Структурні сигнали:

  • Невідповідність між полями EXIF/IFD (SamplesPerPixel, PhotometricInterpretation) та кількістю компонентів, розпарсеною з заголовка потоку зображення, який використовує pipeline.

Псевдо‑логіка:

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

Практична тріаж:

  • Парсити первинні IFD та EXIF теги
  • Знайти та розпарсити вбудований JPEG‑Lossless заголовок (SOF3) та порівняти кількості компонентів

Notes:

  • Повідомлялося про експлуатацію у реальному середовищі; відмінний кандидат для перевірок структурної узгодженості

DNG/TIFF – Samsung libimagecodec.quram.so (CVE‑2025‑21042) + Appended ZIP payload (LANDFALL)

Target: DNG (TIFF‑derived) images carrying an embedded ZIP archive appended at EOF to stage native payloads after parser RCE.

Structural signals:

  • Магічна сигнатура файлу вказує на TIFF/DNG (II*\x00 or MM\x00*) але ім’я файлу маскується під JPEG (e.g., .jpg/.jpeg WhatsApp naming).
  • Наявність ZIP Local File Header або EOCD сигнатури поблизу EOF (PK\x03\x04 or PK\x05\x06), яка не посилається з жодної TIFF IFD data region (strips/tiles/JPEGInterchangeFormat).
  • Непривично велика хвостова частина даних після останнього згаданого блоку даних IFD (сотні KB до MB), що відповідає присутності вкладеного архіву з .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)")

Практичний триаж:

  • Визначити формат vs ім’я:
  • file sample; exiftool -s -FileType -MIMEType sample
  • Знайти ZIP футер/хедер біля EOF і вирізати:
  • 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
  • Перевірити, що регіони даних TIFF не перекривають вирізаний ZIP:
  • tiffdump -D sample.dng | egrep ‘StripOffsets|TileOffsets|JPEGInterchangeFormat|StripByteCounts|TileByteCounts|JPEGInterchangeFormatLength’
  • Переконатися max(offset+length) << zip_off
  • One‑shot carving (coarse): binwalk -eM sample.dng

Примітки:

  • 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.

HEIF/AVIF – libheif & libde265 (CVE‑2024‑41311, CVE‑2025‑29482, CVE‑2025‑65586)

Ціль: HEIF/AVIF containers parsed by libheif (and ImageIO/OpenImageIO builds that bundle it).

Структурні сигнали:

  • 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) – простий структурний чек, декодування не потрібне.
  • SAO/loop‑filter parameters or tile counts that force table allocations larger than the max allowed by libde265 (CVE‑2025‑29482): overly large band counts or slice dimensions.
  • Box length/extent sizes that point past EOF (typical in CVE‑2025‑65586 PoCs discovered via fuzzing).

Псевдологіка:

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

Практичний тріаж:

  • Швидка перевірка метаданих без повного декодування:
  • heif-info sample.heic
  • oiiotool –info –stats sample.heic
  • Перевірка extents відносно розміру файлу:
  • heif-convert –verbose sample.heic /dev/null | grep -i extent
  • Вирізати підозрілі boxes для ручної перевірки:
  • dd if=sample.heic bs=1 skip=$((box_off)) count=$((box_len)) of=box.bin

Примітки:

  • Ці перевірки виявляють пошкоджену структуру до важкого декодування; корисно для mail/MMS шлюзів, яким потрібні лише рішення allow/deny.
  • Обмеження libheif змінюються між версіями; оновлюйте базові константи при змінах upstream (1.18.x → 1.21.x посилив валідацію overlay і grid).

Implementation patterns and performance

Практичний сканер має:

  • Автоматично визначати тип файлу і запускати лише релевантні аналізатори (PDF/JBIG2, WebP/VP8L, TTF, DNG/TIFF, HEIF/AVIF)
  • Потоковий/частковий парсинг щоб мінімізувати алокації і дозволити раннє завершення
  • Виконувати аналізи паралельно (thread‑pool) для масового тріажу

Приклад робочого процесу з ElegantBouncer (open‑source реалізація на Rust цих перевірок):

# 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 поради та крайові випадки

  • Вбудовані об’єкти: файли PDF можуть вбудовувати зображення (JBIG2) та шрифти (TrueType); витягуйте та рекурсивно скануйте
  • Безпека при декомпресії: використовуйте бібліотеки, які строго обмежують розміри таблиць/буферів перед виділенням
  • Помилкові спрацьовування: тримайте правила консервативними, віддавайте перевагу суперечностям, які неможливі згідно зі специфікацією
  • Дрейф версій: переналаштовуйте базові межі (наприклад, розміри таблиць VP8L), коли upstream-парсери змінюють ліміти

Пов’язані інструменти

  • ElegantBouncer – структурний сканер для вищезгаданих виявлень
  • pdfid/pdf-parser/peepdf – витяг об’єктів PDF та статичний аналіз
  • pdfcpu – PDF лінтер/санітизатор
  • fontTools/ttx – вивантаження таблиць TrueType та байткоду
  • exiftool – читання метаданих TIFF/DNG/EXIF
  • dwebp/webpmux – розбір метаданих та чанків WebP
  • heif-info/heif-convert (libheif) – перегляд структури HEIF/AVIF
  • oiiotool – перевірка HEIF/AVIF за допомогою OpenImageIO

References

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks