Detección de exploits en formatos de archivo estructurales (0‑Click Chains)
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Esta página resume técnicas prácticas para detectar archivos exploit móviles 0‑click validando invariantes estructurales de sus formatos en lugar de confiar en firmas de bytes. El enfoque se generaliza entre muestras, variantes polimórficas y futuros exploits que abusen de la misma lógica del parser.
Idea clave: codificar imposibilidades estructurales e inconsistencias entre campos que solo aparecen cuando se alcanza un estado vulnerable del decoder/parser.
See also:
Por qué estructura, no firmas
Cuando no hay weaponized samples disponibles y los payload bytes mutan, los patrones IOC/YARA tradicionales fallan. La detección estructural inspecciona el layout declarado del contenedor frente a lo que es matemática o semánticamente posible para la implementación del formato.
Comprobaciones típicas:
- Validar tamaños de tablas y límites derivados de la especificación y de implementaciones seguras
- Marcar opcodes ilegales/no documentados o transiciones de estado en bytecode embebido
- Contrastar metadata VS componentes reales del stream codificado
- Detectar campos contradictorios que indiquen confusión del parser o set‑ups para integer overflow
A continuación hay patrones concretos, probados en el campo, para múltiples cadenas de alto impacto.
PDF/JBIG2 – FORCEDENTRY (CVE‑2021‑30860)
Target: JBIG2 symbol dictionaries embedded inside PDFs (often used in mobile MMS parsing).
Señales estructurales:
- Estado contradictorio del diccionario que no puede ocurrir en contenido benigno pero que es necesario para disparar el overflow en arithmetic decoding.
- Uso sospechoso de segmentos globales combinado con cuentas de símbolos anormales durante 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")
Triaje práctico:
- Identificar y extraer flujos JBIG2 del PDF
- pdfid/pdf-parser/peepdf para localizar y extraer flujos
- Verificar las flags de codificación aritmética y los parámetros del symbol dictionary contra la especificación de JBIG2
Notas:
- Funciona sin firmas de payload embebidas
- Baja tasa de FP en la práctica porque el estado marcado es matemáticamente inconsistente
WebP/VP8L – BLASTPASS (CVE‑2023‑4863)
Target: WebP lossless (VP8L) tablas de códigos prefijos de Huffman.
Señales estructurales:
- El tamaño total de las tablas de Huffman construidas excede el límite superior seguro esperado por las implementaciones de referencia/parcheadas, lo que implica la precondición de desbordamiento.
Pseudo‑lógica:
# 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")
Triaje práctico:
- Revisar los chunks del contenedor WebP: VP8X + VP8L
- Analizar los códigos de prefijo VP8L y calcular los tamaños reales de las tablas asignadas
Notas:
- Robusto contra el polimorfismo a nivel de bytes del payload
- El límite se deriva de los límites upstream / del análisis de parches
TrueType – TRIANGULATION (CVE‑2023‑41990)
Target: TrueType bytecode inside fpgm/prep/glyf programs.
Structural signals:
- Presencia de opcodes no documentados/prohibidos en el intérprete de Apple usado por el exploit chain.
Pseudo‑logic:
# Flag undocumented TrueType bytecode leveraged by TRIANGULATION
switch opcode:
case 0x8F, 0x90:
mark_malicious("Undocumented TrueType bytecode")
default:
continue
Practical triage:
- Volcar tablas de fuentes (p. ej., usando fontTools/ttx) y escanear programas fpgm/prep/glyf
- No es necesario emular completamente el intérprete para obtener valor de las comprobaciones de presencia
Notes:
- Puede producir raros falsos positivos si fuentes no estándar incluyen opcodes desconocidos; validar con herramientas secundarias
DNG/TIFF – CVE‑2025‑43300
Target: metadatos de imagen DNG/TIFF VS recuento real de componentes en el flujo codificado (p. ej., JPEG‑Lossless SOF3).
Structural signals:
- Inconsistencia entre los campos EXIF/IFD (SamplesPerPixel, PhotometricInterpretation) y el recuento de componentes analizado desde el encabezado del flujo de imagen utilizado por el 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")
Triage práctico:
- Analizar las IFD primarias y las etiquetas EXIF
- Localizar y analizar el encabezado JPEG‑Lossless embebido (SOF3) y comparar el número de componentes
Notas:
- Se ha reportado explotación en entornos reales; excelente candidato para comprobaciones de consistencia estructural
DNG/TIFF – Samsung libimagecodec.quram.so (CVE‑2025‑21042) + Appended ZIP payload (LANDFALL)
Target: DNG (TIFF‑derived) images carrying an embedded ZIP archive appended at EOF to stage native payloads after parser RCE.
Structural signals:
- File magic indicates TIFF/DNG (
II*\x00orMM\x00*) but filename mimics JPEG (e.g.,.jpg/.jpegWhatsApp naming). - Presence of a ZIP Local File Header or EOCD magic near EOF (
PK\x03\x04orPK\x05\x06) that is not referenced by any TIFF IFD data region (strips/tiles/JPEGInterchangeFormat). - Unusually large trailing data beyond the last referenced IFD data block (hundreds of KB to MB), consistent with a bundled archive of .so modules.
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
Notes:
- Explotado en entornos reales contra libimagecodec.quram.so de Samsung (CVE‑2025‑21042). El ZIP anexado contenía módulos nativos (p. ej., loader + SELinux policy editor) extraídos/ejecutados tras el RCE.
HEIF/AVIF – libheif & libde265 (CVE‑2024‑41311, CVE‑2025‑29482, CVE‑2025‑65586)
Target: contenedores HEIF/AVIF analizados por libheif (y builds de ImageIO/OpenImageIO que lo incluyen).
Structural signals:
- Overlay items (iloc/iref) whose source rectangles exceed the base image dimensions or whose offsets are negative/overflowing → triggers ImageOverlay::parse out‑of‑bounds (CVE‑2024‑41311).
- Grid items referencing non‑existent item IDs (ImageItem_Grid::get_decoder NULL deref, CVE‑2025‑43967) – verificación estructural sencilla, no se requiere decodificación.
- SAO/loop‑filter parameters or tile counts that force table allocations larger than the max allowed by libde265 (CVE‑2025‑29482): recuentos de bandas excesivamente grandes o dimensiones de slice.
- Box length/extent sizes that point past EOF (typical in CVE‑2025‑65586 PoCs discovered via fuzzing).
Pseudo‑logic:
# 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)")
Triaje práctico:
- Comprobación rápida de metadatos sin decodificación completa:
- heif-info sample.heic
- oiiotool –info –stats sample.heic
- Validar extents versus el tamaño del archivo:
- heif-convert –verbose sample.heic /dev/null | grep -i extent
- Carve cajas sospechosas para inspección manual:
- dd if=sample.heic bs=1 skip=$((box_off)) count=$((box_len)) of=box.bin
Notas:
- Estas comprobaciones detectan estructuras malformadas antes de una decodificación pesada; útiles para gateways de mail/MMS que solo necesitan decisiones de allow/deny.
- Los límites de libheif cambian entre versiones; re‑baseline las constantes cuando el upstream cambia (1.18.x → 1.21.x tightened overlay and grid validation).
Patrones de implementación y rendimiento
Un escáner práctico debería:
- Detectar automáticamente el tipo de archivo y despachar solo los analizadores relevantes (PDF/JBIG2, WebP/VP8L, TTF, DNG/TIFF, HEIF/AVIF)
- Hacer stream/partial‑parse para minimizar asignaciones y permitir terminación temprana
- Ejecutar los análisis en paralelo (thread‑pool) para triaje masivo
Ejemplo de flujo de trabajo con 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
Consejos de DFIR y casos límite
- Objetos embebidos: los PDFs pueden incrustar imágenes (JBIG2) y fuentes (TrueType); extraer y escanear recursivamente
- Seguridad en la descompresión: usar bibliotecas que limiten de forma estricta tablas/búferes antes de la asignación
- Falsos positivos: mantener reglas conservadoras, favorecer contradicciones que sean imposibles según la especificación
- Deriva de versión: reestablecer los límites de referencia (p. ej., tamaños de tablas VP8L) cuando los parsers upstream cambien los límites
Herramientas relacionadas
- ElegantBouncer – escáner estructural para las detecciones anteriores
- pdfid/pdf-parser/peepdf – extracción de objetos PDF y análisis estático
- pdfcpu – linter/sanitizador de PDF
- fontTools/ttx – volcar tablas TrueType y bytecode
- exiftool – leer metadatos TIFF/DNG/EXIF
- dwebp/webpmux – analizar metadatos y chunks de WebP
- heif-info/heif-convert (libheif) – inspección de la estructura HEIF/AVIF
- oiiotool – validar HEIF/AVIF mediante OpenImageIO
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
- CVE‑2024‑41311 analysis (libheif overlay OOB)
- CVE‑2025‑65586 libheif metadata iterator flaw
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.


