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
- 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ó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:
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*\x00ouMM\x00*) mas o nome do arquivo mimetiza JPEG (e.g.,.jpg/.jpegnomeação do WhatsApp). - Presença de um ZIP Local File Header ou magic EOCD perto do EOF (
PK\x03\x04ouPK\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
Related tools
- 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
- 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
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.


