NetCatTest

Zero-Day & Exploits

iOS zero-click: BLASTPASS, ImageIO e a cadeia de ataque

BLASTPASS explicado: CVEs, processamento de anexos, fronteiras de segurança e validação de imagens em laboratório local.

Por Daniel Felipe 7 min leitura

Um zero-click explora processamento que acontece antes de o usuário decidir abrir um arquivo ou tocar em um link. O caso BLASTPASS mostrou como uma mensagem aparentemente passiva podia alcançar componentes complexos do iPhone. A investigação pública identifica uma cadeia histórica de 2023; este texto não a apresenta como uma descoberta nova de 2026.

BLASTPASS: fatos, versões e limites da divulgação

Em setembro de 2023, o Citizen Lab documentou BLASTPASS, associado à instalação de Pegasus em um iPhone com iOS 16.6. A cadeia envolvia anexos PassKit com imagens enviados por iMessage. Os identificadores relacionados são CVE-2023-41064 e CVE-2023-41061.

No boletim do iOS 16.6.1, a Apple distingue um buffer overflow em ImageIO de um problema de validação em Wallet. A atualização foi publicada em 7 de setembro de 2023. As descrições não expõem todos os detalhes do exploit. Não há base para preencher essas lacunas com o funcionamento de outra cadeia famosa, como FORCEDENTRY.

Camada Informação documentada O que não se deve inferir
Entrega Anexos PassKit em iMessage Qualquer mensagem instala spyware
ImageIO Processamento de imagem e execução arbitrária Payload completo disponível neste artigo
Wallet Problema de validação Toda a cadeia é uma única falha
Correção iOS 16.6.1 em 2023 Essa é a versão atual recomendada

Por que uma mensagem alcança tantos parsers

Um serviço de mensagens precisa produzir miniaturas, identificar formatos, apresentar notificações e encaminhar conteúdos a componentes especializados. Cada transformação acrescenta código que interpreta dados externos. A extensão do arquivo e o tipo MIME são sinais de roteamento, não uma prova de que o conteúdo é seguro.

Um arquivo pode combinar estruturas válidas, valores extremos e dados que exercitam caminhos raros. A complexidade relevante não está apenas no tamanho em disco. Um objeto pequeno pode declarar dimensões gigantes, tabelas numerosas ou representações que exigem grande quantidade de memória após a expansão.

Essa é uma razão para tratar validação de formato, consumo de recursos e isolamento como controles independentes. Validar um cabeçalho não garante que todos os índices internos sejam seguros. Limitar memória reduz alguns efeitos, mas não corrige um erro que escreve fora de um buffer dentro desse limite.

Entrega, execução e persistência são etapas diferentes

Uma análise de zero-click deve acompanhar as fronteiras cruzadas: recepção de dados, parser, processo isolado, serviços com maior privilégio e efeitos posteriores. Uma cadeia pode exigir várias vulnerabilidades para passar de um parser comprometido ao controle duradouro do aparelho. A composição exata de BLASTPASS além dos fatos divulgados não será inventada aqui.

Também não se deve usar a ausência de clique como medida automática de acesso obtido. Zero-click descreve a interação exigida para a entrada. O privilégio final depende dos passos seguintes. Esse cuidado muda a qualidade do relatório: “processamento sem interação” e “persistência comprovada” precisam ter evidências próprias.

Laboratório local: orçamento de imagem antes da alocação

O programa abaixo demonstra validação de dimensões e orçamento de um buffer. É uma construção didática, não código do iOS nem reprodução das CVEs. Não contém imagens maliciosas e não envia mensagens a ninguém.

import json

def dimensoes_validas(largura, altura, canais, limite):
    if not all(type(v) is int for v in (largura, altura, canais, limite)):
        return False
    if min(largura, altura, canais, limite) <= 0 or canais > 4:
        return False
    return largura * altura * canais <= limite

casos = [(64,
    64,
    4,
    True),
    (4096,
    4096,
    4,
    False),
    (-1,
    64,
    4,
    False),
    (0,
    0,
    4,
    False),
    (True,
    64,
    4,
    False),
    (64,
    64,
    8,
    False)]
for largura, altura, canais, esperado in casos:
    assert dimensoes_validas(largura, altura, canais, 1024 * 1024) is esperado
print(json.dumps({'casos': len(casos),
    'aprovados': True,
    'parser_real_exercitado': False},
    ensure_ascii=False))

O uso de type(valor) is int impede que um booleano seja aceito apenas porque, em Python, bool deriva de int. Largura e altura devem ser positivas; o número de canais fica restrito a uma pequena lista; o produto precisa caber no orçamento. Os seis casos exercitam valores normais, excessivos e inválidos.

Python possui inteiros de precisão arbitrária. Em C ou C++, a mesma validação exige operações verificadas para não permitir overflow na multiplicação antes da comparação. Também é necessário conferir o tamanho efetivamente recebido, alinhamento, stride, metadados e limites da biblioteca. O modelo não substitui uma revisão de parser.

Como investigar sem gerar falsas certezas

Uma suspeita de spyware exige preservação de contexto e coleta apropriada. Registre versão e build, período dos eventos, origem da suspeita e alterações já feitas no aparelho. Uma atualização pode ser urgente, mas o processo de coleta precisa considerar o que ela modifica. Em casos de alto risco, envolva uma equipe com experiência em perícia móvel.

Logs podem estar incompletos, ser rotacionados ou não conter o evento que iniciou a cadeia. Um resultado negativo em uma ferramenta de triagem é limitado à cobertura daquela ferramenta e aos dados disponíveis. Não é um certificado de que nunca houve comprometimento.

Em um laboratório autorizado, use contas e dispositivos descartáveis, dados inventados e um plano explícito de recuperação. Testes de robustez de parsers não precisam ser entregues por uma plataforma real de mensagens. Começar por entradas locais, instrumentação e testes de limites produz evidências mais controladas e evita atingir terceiros.

Mitigação e critérios para uma equipe de segurança

A documentação do Modo de Bloqueio da Apple descreve restrições voltadas a ataques sofisticados. O Citizen Lab relatou sua eficácia no contexto de BLASTPASS. Isso não significa garantia universal contra todo zero-click futuro. A medida deve acompanhar atualização, proteção de conta e resposta a incidentes.

Controle Verificação prática
Atualizações Build instalada e política de prazo
Redução de superfície Recursos restringidos e impacto no trabalho
Isolamento Parser e serviços com permissões mínimas
Telemetria Retenção, origem e cobertura conhecida
Resposta Canal de escalonamento e preservação de dados

Para desenvolvedores, priorize fuzzing de componentes que interpretam anexos, corpus pequeno bem classificado e testes de regressão para cada correção. Registre seed, versão do parser e limites de execução. Um crash novo merece triagem; muitos crashes idênticos não representam muitas vulnerabilidades diferentes.

Perguntas frequentes

Preciso clicar para ser afetado por um zero-click? A característica do vetor é dispensar essa interação, embora outras condições ainda possam existir.

Todo PassKit é perigoso? Não. O tipo de conteúdo foi parte da cadeia documentada, mas isso não torna todos os anexos desse formato maliciosos.

O exemplo acima detecta Pegasus? Não. Ele verifica uma propriedade simples de alocação em dados sintéticos. A distinção preserva o valor didático sem prometer uma capacidade que o código não tem.

BLASTPASS ensina a mapear a superfície de processamento automático e a documentar cada fronteira separadamente. O risco está na combinação de componentes, dados e privilégios, mesmo quando a interface não pede nenhuma ação ao usuário.

Escrito por

Daniel Felipe é criador do NetCatTest e produz conteúdos sobre cibersegurança, privacidade digital, OSINT, laboratórios autorizados e ferramentas para estudo técnico responsável.

Compartilhar

Enviar este artigo