
engenharia reversa da detecção SynthID do Gemini
Descobrindo, detectando e removendo cirurgicamente a marca d'água de IA do Google através de análise espectral
Visite-nos em PitchHut
Este fork adiciona um aplicativo de desktop de arrastar e soltar para o bypass V3, sem necessidade de linha de comando após a configuração. Veja gui/README.md para configuração e uso.
O SynthID codifica um padrão imperceptível diretamente nos valores dos pixels. Em uma imagem branca pura gerada pelo Gemini, a marca d'água é quase todo o sinal. Amplifique o resíduo de alta frequência e ele se parece com isso:
Padrão amplificado da portadora SynthID extraído de uma imagem Gemini branca pura. A faixa diagonal é a assinatura de frequência espacial da marca d'água — o alvo do nosso ataque espectral.
Este projeto faz engenharia reversa do sistema de marca d'água SynthID do Google — a marca d'água invisível embutida em cada imagem gerada pelo Google Gemini. Usando apenas processamento de sinais e análise espectral (sem acesso ao codificador/decodificador proprietário), nós:
gemini-3.1-flash-image-preview e nano-banana-pro-preview, consenso de fase entre cores em 6 fundos sólidos e um loop de calibração humano-no-circuito que ajusta a força de subtração por portadora a partir de contagens manuais de detecção do aplicativo GeminiVT-OxFF construiu um visualizador muito legal para ver o processo de como a marca d'água SynthID é adicionada às imagens aqui (também disponível na descrição do repositório)!
Após seis rodadas iterativas de desenvolvimento adversarial, o pipeline bypass_v4_final / bypass_v4_nuke da Rodada 06 derrota o detector SynthID do Gemini em imagens tanto de gemini-3.1-flash-image-preview quanto de nano-banana-pro-preview, com saída visualmente sem perdas.
Esquerda: saída da Rodada 01 (apenas subtração espectral `suave`). Direita: saída da Rodada 06 (`final` — VAE + deformação elástica + compressão + cor + JPEG). Ambas parecem idênticas aos olhos humanos; apenas a Rodada 06 derrota o detector SynthID.
| Rodada | Estratégia | Resultado |
|---|---|---|
| 01 | Subtração espectral conservadora (suave) | ✗ |
| 02 | Subtração espectral agressiva + JPEG | ✗ |
| 03 | Direcionamento absoluto de bin guiado por blog | ✗ |
| 04 | Extração de fase residual de ruído | ✗ |
| 05 | Regeneração por difusão-VAE + deformação geométrica | ✗ |
| 06 | Tudo em um: VAE + fragmentação elástica + compressão + cor + JPEG | ✓ |
O avanço na Rodada 06 veio de tratar a lista de modos de falha publicada pelo próprio aplicativo Gemini como uma especificação de ataque:
"Quando uma imagem gerada por IA faz parte de uma colagem complexa, camada atrás de outros elementos, ou tem muitas texturas e padrões diferentes sobrepostos, o detector pode ter dificuldade para isolar a assinatura específica do arquivo geral." — Aplicativo Gemini, texto de ajuda de detecção SynthID
O estágio de deformação elástica simula esse efeito no nível de pixel: um campo de deformação aleatório suave e de baixa frequência dá a cada vizinhança de ~50 pixels seu próprio deslocamento de subpixel independente, fragmentando o consenso de fase espacial da marca d'água sem introduzir qualquer distorção visível.
V4 é uma repensada completa do codebook construído em um conjunto de dados muito mais rico:
gemini-3.1-flash-image-preview e nano-banana-pro-preview (mais um pseudo-modelo union opcional).black, white, blue, green, red, gray) por modelo por resolução, mais gradient e diverse como linhas de base de conteúdo.carrier_weights do codebook é atualizado com base no feedback manual de detecção do aplicativo Gemini.Para cada bin de frequência (fy, fx) e canal ch:```
consensus(fy, fx, ch) = | mean_over_colors( exp(i * phase_color(fy, fx, ch)) ) |
Valores próximos de `1.0` significam que a fase naquele bin está bloqueada em todos os fundos de cor sólida, o que só é verdade para a marca d'água. Os bins de conteúdo colapsam para `< 0.3` porque sua fase é randomizada por diferentes tons de cor. No codebook V4 construído a partir do conjunto de dados enriquecido, 99%+ dos bins de conteúdo ficam abaixo do corte padrão `tau=0.60`, então o dissolver V4 nunca os toca — é isso que recupera o PSNR.