Detecção de Exploits em Formatos de Arquivo Estruturais (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óveis 0‑click validando invariantes estruturais de seus formatos em vez de depender de assinaturas de bytes. A abordagem se generaliza entre amostras, variantes polimórficas e futuros exploits que abusam da mesma lógica do parser/decoder.

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

Veja também:

PDF File analysis

Por que estrutura, não assinaturas

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

Verificações típicas:

  • Validar tamanhos de tabelas e bounds derivados da spec e de implementações seguras
  • Marcar opcodes ilegais/não documentados ou transições de estado em bytecode embutido
  • Conferir metadata VS componentes reais do encoded stream
  • Detectar campos contraditórios que indicam confusão do parser ou cenários de 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 acionar o overflow na arithmetic decoding.
  • Uso suspeito de global segments combinado com contagens de símbolos anormais durante a refinement coding.

Pseudo‑lógica:

# 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 fluxos JBIG2 do PDF
  • pdfid/pdf-parser/peepdf para localizar e extrair fluxos
  • Verificar flags de arithmetic coding e parâmetros do dicionário de símbolos em relação à especificação JBIG2

Notes:

  • Funciona sem assinaturas de payload embutidas
  • Baixo 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:

  • Total size of constructed Huffman tables exceeds the safe upper bound expected by the reference/patched implementations, implying the overflow precondition.

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

Practical triage:

  • Verificar chunks do container WebP: VP8X + VP8L
  • Analisar os prefix codes do VP8L e calcular os tamanhos reais das tabelas alocadas

Notes:

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

TrueType – TRIANGULATION (CVE‑2023‑41990)

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

Structural signals:

  • Presence of undocumented/forbidden opcodes in Apple’s interpreter used by the exploit chain.

Pseudo‑logic:

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

Triagem prática:

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

Notes:

  • Pode produzir FPs raros se fontes não padronizadas incluírem opcodes desconhecidos; valide com ferramentas secundárias

DNG/TIFF – CVE‑2025‑43300

Target: DNG/TIFF image metadata VS actual component count in encoded stream (e.g., JPEG‑Lossless SOF3).

Structural signals:

  • Inconsistência entre os campos EXIF/IFD (SamplesPerPixel, PhotometricInterpretation) e a contagem de componentes analisada a partir do cabeçalho do fluxo de imagem usado pelo 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")

Triagem prática:

  • Analisar IFD primário e tags EXIF
  • Localizar e analisar o cabeçalho JPEG‑Lossless embutido (SOF3) e comparar contagens de componentes

Notas:

  • Registrado como explorado no mundo real; excelente candidato para verificações de consistência estrutural

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

Alvo: imagens DNG (derivadas de TIFF) que contêm um arquivo ZIP embutido anexado no EOF para carregar payloads nativos após RCE no parser.

Sinais estruturais:

  • A magic do arquivo indica TIFF/DNG (II*\x00 ou MM\x00*) mas o nome do arquivo mimetiza JPEG (e.g., .jpg/.jpeg nomeação do WhatsApp).
  • Presença de um ZIP Local File Header ou magic EOCD perto do EOF (PK\x03\x04 ou PK\x05\x06) que não é referenciado por nenhuma região de dados IFD do TIFF (strips/tiles/JPEGInterchangeFormat).
  • Dados finais inusitadamente 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)")

Practical triage:

  • Identify format vs name:
  • file sample; exiftool -s -FileType -MIMEType sample
  • Locate ZIP footer/header near EOF and 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
  • Sanity‑check TIFF data regions don’t overlap the carved ZIP region:
  • 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

Notas:

  • Explorado in the wild contra Samsung’s libimagecodec.quram.so (CVE‑2025‑21042). O ZIP anexado continha módulos nativos (por ex., loader + editor de políticas SELinux) extraídos/executados após RCE.

Implementation patterns and performance

Um scanner prático deve:

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

Exemplo de fluxo de trabalho com ElegantBouncer (implementação open‑source em Rust dessas verificações):

# 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 dicas e casos-limite

  • Objetos embutidos: PDFs podem embutir imagens (JBIG2) e fontes (TrueType); extrair e escanear recursivamente
  • Segurança na descompressão: use bibliotecas que imponham limites rígidos em tabelas/buffers antes da alocação
  • Falsos positivos: mantenha regras conservadoras, favorecendo contradições que sejam impossíveis segundo a especificação
  • Deriva de versão: reajuste os limites de referência (p.ex., tamanhos de tabela VP8L) quando parsers upstream mudarem os limites

  • 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 TIFF/DNG/EXIF metadata
  • dwebp/webpmux – parsear WebP metadata e chunks

References

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