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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
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:
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*\x00orMM\x00*) mas o nome do arquivo imita JPEG (por exemplo,.jpg/.jpegnomenclatura do WhatsApp). - Presença de um ZIP Local File Header ou assinatura EOCD perto do EOF (
PK\x03\x04orPK\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
- ELEGANTBOUNCER: When You Can’t Get the Samples but Still Need to Catch the Threat
- ElegantBouncer project (GitHub)
- Researching FORCEDENTRY: Detecting the exploit with no samples
- Researching BLASTPASS – Detecting the exploit inside a WebP file (Part 1)
- Researching BLASTPASS – Analysing the Apple & Google WebP PoC file (Part 2)
- Researching TRIANGULATION – Detecting CVE‑2023‑41990 with single‑byte signatures
- CVE‑2025‑43300: Critical vulnerability found in Apple’s DNG image processing
- LANDFALL: New Commercial-Grade Android Spyware in Exploit Chain Targeting Samsung Devices
- CVE‑2024‑41311 analysis (libheif overlay OOB)
- CVE‑2025‑65586 libheif metadata iterator flaw
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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.


