Виявлення експлойтів структурних форматів файлів (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 мобільних експлойт-файлів шляхом валідації структурних інваріантів їхніх форматів замість покладання на байтові сигнатури. Підхід узагальнюється на різні зразки, поліморфні варіанти та майбутні експлойти, що зловживають тією ж логікою парсера.

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

Див. також:

PDF File analysis

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

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

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

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

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


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

Practical triage:

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

Notes:

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

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

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

Structural signals:

  • Загальний розмір побудованих таблиць 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 та обчислити фактичні розміри виділених таблиць

Примітки:

  • Стійкий до байтового поліморфізму payload
  • Межа визначається на основі аналізу upstream обмежень і патчів

TrueType – TRIANGULATION (CVE‑2023‑41990)

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

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

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

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

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

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

  • Вивантажити таблиці шрифтів (наприклад, використовуючи fontTools/ttx) та просканувати програми fpgm/prep/glyf
  • Не потрібно повністю емуляти інтерпретатор, щоб отримати користь від перевірок на наявність

Notes:

  • Може давати рідкісні FPs, якщо нестандартні шрифти містять невідомі opcodes; перевіряйте за допомогою додаткових інструментів

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

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

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

Примітки:

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

DNG/TIFF – Samsung libimagecodec.quram.so (CVE‑2025‑21042) + доданий ZIP payload (LANDFALL)

Ціль: DNG (TIFF‑derived) зображення, що несуть вбудований ZIP архів, доданий в кінці файлу (EOF), щоб stage native payloads після parser RCE.

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

  • Magic файлу вказує на TIFF/DNG (II*\x00 or MM\x00*) але ім’я файлу імітує JPEG (наприклад, .jpg/.jpeg — номенклатура WhatsApp).
  • Наявність ZIP Local File Header або EOCD magic біля EOF (PK\x03\x04 or PK\x05\x06), яка не посилається жодним полем даних TIFF IFD (strips/tiles/JPEGInterchangeFormat).
  • Незвично велика кінцева частина даних після останнього посиланого блоку IFD (сотні KB до MB), сумісна з упакованим архівом .so модулів.

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

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

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

  • Визначити формат порівняно з іменем:
  • file sample; exiftool -s -FileType -MIMEType sample
  • Знайти ZIP footer/header біля 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’
  • Verify max(offset+length) << zip_off
  • One‑shot carving (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.

Шаблони реалізації та продуктивність

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

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

Приклад робочого процесу з 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 та особливі випадки

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

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

  • ElegantBouncer – структурний сканер для виявлень, наведених вище
  • pdfid/pdf-parser/peepdf – витягування об’єктів PDF та статичний аналіз
  • pdfcpu – PDF linter/санітизатор
  • fontTools/ttx – вивантаження таблиць TrueType та байткоду
  • exiftool – читання метаданих TIFF/DNG/EXIF
  • dwebp/webpmux – розбір метаданих WebP та чанків

Посилання

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