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

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Esta página resume técnicas práticas para detectar arquivos de exploit móvel 0‑click validando invariantes estruturais dos seus formatos em vez de confiar em assinaturas de bytes. A abordagem generaliza através de amostras, variantes polimórficas e futuros exploits que abusam da mesma lógica do parser.

Ideia‑chave: codificar impossibilidades estruturais e inconsistências entre campos que só aparecem quando um estado vulnerável do decoder/parser é alcançado.

See also:

PDF File analysis

Por que estrutura, não assinaturas

Quando amostras weaponizadas não estão disponíveis e os bytes do payload mutam, padrões IOC/YARA tradicionais falham. A detecção estrutural inspeciona o layout declarado do contêiner versus o que é matematicamente ou semanticamente possível para a implementação do formato.

Typical checks:

  • Validar tamanhos de tabelas e limites derivados da especificação e de implementações seguras
  • Sinalizar opcodes ilegais/undocumentados ou transições de estado em bytecode embutido
  • Cross‑check metadata VS componentes reais do fluxo codificado
  • Detectar campos contraditórios que indicam confusão do parser ou configurações para integer overflow

Abaixo estão padrões concretos, testados em campo, para múltiplas cadeias de alto impacto.


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

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

Sinais estruturais:

  • Estado contraditório do dicionário que não pode ocorrer em conteúdo benigno, mas é necessário para disparar o overflow na decodificação aritmética.
  • Uso suspeito de segmentos globais combinado com contagens anormais de símbolos durante o 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")

Triagem prática:

  • Identificar e extrair streams JBIG2 do PDF
  • pdfid/pdf-parser/peepdf para localizar e despejar streams
  • Verificar flags de codificação aritmética e parâmetros do dicionário de símbolos contra a especificação JBIG2

Notes:

  • Funciona sem assinaturas de payload embutidas
  • Baixa taxa de FP na prática porque o estado sinalizado é matematicamente inconsistente

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

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

Structural signals:

  • O tamanho total das tabelas Huffman construídas excede o limite superior seguro esperado pelas implementações de referência/corrigidas, implicando a pré‑condição de overflow.

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

Triagem prática:

  • Verifique os chunks do contêiner WebP: VP8X + VP8L
  • Analise códigos de prefixo VP8L e calcule os tamanhos reais das tabelas alocadas

Notas:

  • Robusto contra polimorfismo a nível de byte do payload
  • O limite é derivado de limites upstream/análise de patches

TrueType – TRIANGULATION (CVE‑2023‑41990)

Target: TrueType bytecode inside fpgm/prep/glyf programs.

Structural signals:

  • Presença de opcodes não documentados/proibidos no interpretador da Apple usado pela cadeia de exploit.

Pseudo‑lógica:

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

Triagem prática:

  • Extrair tabelas de fontes (p.ex., usando fontTools/ttx) e escanear programas fpgm/prep/glyf
  • Não é necessário emular totalmente o interpretador para obter valor a partir de verificações de presença

Notas:

  • Pode produzir raros falsos positivos (FPs) se fontes não padrão incluírem opcodes desconhecidos; valide com ferramentas secundárias

DNG/TIFF – CVE‑2025‑43300

Alvo: metadados de imagem DNG/TIFF vs contagem real de componentes no fluxo codificado (p.ex., JPEG‑Lossless SOF3).

Sinais estruturais:

  • Inconsistência entre campos EXIF/IFD (SamplesPerPixel, PhotometricInterpretation) e a contagem de componentes analisada a partir do cabeçalho do fluxo de imagem usado pelo pipeline.

Pseudo‑lógica:

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

Triagem prática:

  • Analisar os IFD primários e as tags EXIF
  • Localizar e analisar o header JPEG‑Lossless embutido (SOF3) e comparar a contagem de componentes

Notas:

  • Relatos de exploração na natureza; excelente candidato para verificações de consistência estrutural

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

Alvo: DNG (derivado de TIFF) images contendo um arquivo ZIP embutido anexado ao EOF para carregar payloads nativos após RCE no parser.

Sinais estruturais:

  • A magic do arquivo indica TIFF/DNG (II*\x00 or MM\x00*) mas o nome do arquivo imita JPEG (por exemplo, .jpg/.jpeg nomenclatura do WhatsApp).
  • Presença de um ZIP Local File Header ou assinatura EOCD perto do EOF (PK\x03\x04 or PK\x05\x06) que não é referenciada por nenhuma região de dados IFD do TIFF (strips/tiles/JPEGInterchangeFormat).
  • Dados finais incomumente grandes além do último bloco de dados IFD referenciado (centenas de KB a MB), consistente com um arquivo empacotado de módulos .so.

Pseudo‑lógica:

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

Triagem prática:

  • Identificar formato vs nome:
  • file sample; exiftool -s -FileType -MIMEType sample
  • Localizar footer/header do ZIP próximo do EOF e extrair:
  • 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
  • Verificar se as regiões de dados TIFF não se sobrepõem à região ZIP extraída:
  • tiffdump -D sample.dng | egrep ‘StripOffsets|TileOffsets|JPEGInterchangeFormat|StripByteCounts|TileByteCounts|JPEGInterchangeFormatLength’
  • Verify max(offset+length) << zip_off
  • Carving único (grosseiro): binwalk -eM sample.dng

Notas:

  • Explorado em ataques reais contra Samsung’s libimagecodec.quram.so (CVE‑2025‑21042). O ZIP anexado continha módulos nativos (p.ex., loader + SELinux policy editor) extraídos/executados pós‑RCE.

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

Alvo: containers HEIF/AVIF analisados por libheif (e builds ImageIO/OpenImageIO que o incorporam).

Sinais estruturais:

  • Overlay items (iloc/iref) cujos retângulos de origem excedem as dimensões da imagem base ou cujos offsets são negativos/estouram → aciona ImageOverlay::parse fora dos limites (CVE‑2024‑41311).
  • Grid items referenciando IDs de item inexistentes (ImageItem_Grid::get_decoder NULL deref, CVE‑2025‑43967) – verificação estrutural simples, sem necessidade de decodificação.
  • Parâmetros SAO/loop‑filter ou contagens de tiles que forçam alocações de tabelas maiores que o máximo permitido pelo libde265 (CVE‑2025‑29482): contagens de bandas excessivas ou dimensões de slices.
  • Tamanhos de box (length/extent) que apontam além do EOF (típico em PoCs CVE‑2025‑65586 descobertos via fuzzing).

Pseudo‑lógica:

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

Triagem prática:

  • Verificação rápida de metadados sem decodificação completa:
  • heif-info sample.heic
  • oiiotool –info –stats sample.heic
  • Validar extents em relação ao tamanho do arquivo:
  • heif-convert –verbose sample.heic /dev/null | grep -i extent
  • Carve boxes suspeitos para inspeção manual:
  • dd if=sample.heic bs=1 skip=$((box_off)) count=$((box_len)) of=box.bin

Notas:

  • Essas verificações detectam estrutura malformada antes de uma decodificação pesada; útil para gateways de mail/MMS que precisam apenas de decisões allow/deny.
  • Os limites do libheif mudam entre versões; re‑baseline as constantes quando o upstream mudar (1.18.x → 1.21.x apertou a validação de overlay e grid).

Padrões de implementação e desempenho

Um scanner prático deve:

  • Detectar automaticamente o tipo de arquivo e acionar apenas os analisadores relevantes (PDF/JBIG2, WebP/VP8L, TTF, DNG/TIFF, HEIF/AVIF)
  • Processar em streaming/análise parcial para minimizar alocações e permitir terminação antecipada
  • Executar análises em paralelo (thread‑pool) para triagem em massa

Fluxo de trabalho exemplo com 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

Dicas de DFIR e casos-limite

  • Objetos embutidos: PDFs podem embutir imagens (JBIG2) e fontes (TrueType); extraia e escaneie recursivamente
  • Segurança na descompressão: use bibliotecas que limitem rigidamente tabelas/buffers antes da alocação
  • Falsos positivos: mantenha regras conservadoras, favoreça contradições que sejam impossíveis segundo a especificação
  • Variação de versão: reajuste os limites de referência (e.g., tamanhos de tabela VP8L) quando parsers upstream mudarem os limites

Ferramentas relacionadas

  • ElegantBouncer – scanner estrutural para as detecções acima
  • pdfid/pdf-parser/peepdf – extração de objetos PDF e análise estática
  • pdfcpu – linter/sanitizador de PDF
  • fontTools/ttx – extrair tabelas TrueType e bytecode
  • exiftool – ler metadados TIFF/DNG/EXIF
  • dwebp/webpmux – analisar metadados e chunks de WebP
  • heif-info/heif-convert (libheif) – inspeção da estrutura HEIF/AVIF
  • oiiotool – validar HEIF/AVIF via OpenImageIO

Referências

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks