Este post é a continuação técnica de “64 bits decidem o que você pode subir na internet”. Se você não leu esse post, leia primeiro. Aqui assumimos que você entende o que é um hash perceptual e por que PhotoDNA, PDQ e NeuralHash são parentes próximos.

No dia 5 de agosto de 2021, a Apple anunciou o NeuralHash. No dia 18 de agosto —treze dias depois—, um pesquisador sob o pseudônimo Asuhariet Ygvar publicou no GitHub a engenharia reversa completa do modelo extraído de binários do iOS. Poucos dias depois, dois pesquisadores independentes —Brad Dwyer e outros— publicaram colisões: duas imagens visualmente distintas com o mesmo hash. O sistema que a Apple prometia com uma taxa de falsos positivos de “um por trilhão de contas por ano” provou ser vulnerável usando hardware comum.

A reação pública se concentrou em “A Apple errou feio”. A análise técnica subsequente mostrou que o erro não foi da Apple: a fragilidade adversarial é uma propriedade estrutural da família de hashes perceptuais. NeuralHash era, na verdade, dos designs mais sofisticados do mercado.

Cinco anos depois, a União Europeia está legislando sobre a implantação obrigatória dessa mesma tecnologia no WhatsApp, Signal e Telegram. A regulamentação presume que o algoritmo é uma primitiva invariável, como se fosse o SHA-256. Mas não é.

Colisão acidental versus colisão adversarial

Quem está familiarizado com hashes criptográficos tem um modelo mental: uma colisão é um evento raro, acidental, cuja probabilidade pode ser calculada como 2^(-n), onde n é o número de bits. Para o SHA-256, são necessárias 2^128 operações para encontrar uma colisão — inviável com a infraestrutura conhecida.

Os hashes perceptuais são outra classe de objeto. A distinção importa.

Colisão acidental. Duas imagens legítimas que, por acaso, produzem o mesmo hash. Com um hash perceptual de 64 bits, a probabilidade não é 2^(-64): é muito maior porque o espaço de imagens “razoáveis” (aquelas que um humano produz, não ruído aleatório) possui regularidades estatísticas. A probabilidade real depende da distribuição do dataset, mas é ordens de magnitude maior que o limite teórico.

Colisão adversarial. Duas imagens deliberadamente geradas para produzir o mesmo hash. Aqui a diferença é qualitativa. Num hash perceptual:

  • O espaço de hashes é pequeno (64-96 bits).
  • A função de hash é “suave” — pequenas perturbações nos pixels geram pequenas perturbações no hash. Essa é a propriedade que queremos (tolerância a reencodificação) e também faz o sistema vulnerável.
  • Hashes baseados em CNNs (como NeuralHash) são diferenciáveis. Um atacante pode usar o método do gradiente descendente para encontrar a colisão diretamente.
  • Hashes clássicos (como pHash, PDQ) não são diferenciáveis no mesmo sentido, mas ainda são atacáveis com busca local e heurísticas padrão de ML.

Em termos práticos: encontrar uma colisão adversarial em um hash perceptual é um problema de otimização que um estudante de mestrado em aprendizado de máquina resolve em uma tarde com PyTorch e uma GPU comum.

Três tipos de ataque, três consequências distintas

A literatura de 2021-2023 distingue três modalidades de ataque, cada uma com implicações operacionais específicas.

Colisão arbitrária

Dado o algoritmo de hash H, encontrar duas imagens x₁ e x₂ visualmente distintas tais que H(x₁) = H(x₂). É o ataque mais fácil: ocorre por construção se o espaço de hashes for pequeno. As colisões publicadas por Ygvar em agosto de 2021 são desse tipo: um cachorro e uma paisagem cinza, visualmente sem relação, produzem o mesmo NeuralHash.

Uso operacional: degradar a credibilidade do sistema. Se for possível demonstrar publicamente colisões, a premissa “o hash é um identificador confiável” desmorona.

Pré-imagem direcionada

Dado um hash alvo h₀ (por exemplo, um retirado da base do NCMEC ou adivinhado), gerar uma imagem x visualmente inocente tal que H(x) = h₀. Este é o ataque mais operacionalmente preocupante.

Uso operacional: envio de imagens para vítimas. Um atacante gera uma foto de gatos que possui o mesmo hash de um material conhecido de CSAM, enviando-a via WhatsApp. O sistema dispara alertas. Mesmo que haja revisão humana posterior confirmando a inocência da foto, o processo gera custos, desgaste e estigmatização da vítima. Em escala — milhares de vítimas simultâneas — o sistema torna-se inutilizável.

A Apple argumentou em 2021 que este ataque não era viável porque a base do NCMEC é fechada e o atacante não conhece os hashes-alvo. Prokos et al. (USENIX Security 2023) demonstraram que o argumento é insuficiente: o atacante não precisa dos hashes individuais, basta acesso a uma imagem de referência do conjunto alvo, algo trivial de obter na prática para atores sofisticados.

Evasão

Dada uma imagem x conhecida (por exemplo, material de CSAM presente na base de hashes), gerar uma modificação x’ visualmente idêntica que produza um hash diferente. Este é o ataque que compromete a utilidade do sistema para seu propósito declarado.

Uso operacional: distribuidores reais de CSAM aplicam o ataque em seu material. O sistema de escaneamento não detecta as cópias modificadas, embora sejam indistinguíveis para observadores humanos. A quantidade de material novo adicionado às bases do NCMEC cresce mais lentamente que as variações adversárias, deteriorando a cobertura do sistema com o tempo.

O caso NeuralHash em detalhe

A cronologia do colapso do NeuralHash é didática.

5 de agosto de 2021. Apple anuncia o pacote CSAM Detection. A documentação técnica inclui afirmação de 1 falso positivo por trilhão de contas por ano, baseada em testes internos contra um dataset de referência.

18 de agosto de 2021. Asuhariet Ygvar publica AppleNeuralHash2ONNX no GitHub. O projeto extrai o modelo NeuralHash do binário do iOS 14.7, convertendo-o para o formato ONNX, permitindo sua execução em qualquer máquina. O código não requer acesso privilegiado: os modelos CoreML são extraíveis por qualquer usuário com um iPhone desbloqueado ou análise estática do kernel.

19 de agosto de 2021. Usuários do repositório publicam a primeira colisão: duas imagens distintas (collision1.png, collision2.png) que produzem o mesmo hash de 96 bits sob NeuralHash. A técnica consistiu em busca por gradiente sobre o modelo extraído, aproximadamente 50 linhas de código em PyTorch.

20-27 de agosto de 2021. A Apple confirma que as colisões são reais, mas argumenta que não representam risco operacional em razão de (a) a base do NCMEC ser secreta; (b) existir um limiar de 30 coincidências antes de alertas serem acionados. Críticos respondem: (a) a base não precisa ser revelada, basta acesso a referências; (b) com capacidade de gerar N colisões, superar o limiar é trivial.

[TO BE CONTINUED…]

Este artigo foi publicado originalmente em espanhol e traduzido com a ajuda de IA.