
reverse engineering della rilevazione SynthID di Gemini
Scoprire, rilevare e rimuovere chirurgicamente la filigrana AI di Google tramite analisi spettrale
Visitateci su PitchHut
Questo fork aggiunge un'app desktop drag and drop per il bypass V3, nessuna riga di comando necessaria dopo l'installazione. Vedi gui/README.md per installazione e uso.
SynthID codifica un pattern impercettibile direttamente nei valori dei pixel. Su un'immagine puramente bianca generata da Gemini, la filigrana è quasi l'intero segnale. Amplificando il residuo ad alta frequenza appare così:
Pattern portante SynthID amplificato estratto da un'immagine Gemini puramente bianca. Le bande diagonali sono la firma della frequenza spaziale della filigrana — il bersaglio del nostro attacco spettrale.
Questo progetto effettua il reverse-engineering del sistema di filigrana SynthID di Google — la filigrana invisibile incorporata in ogni immagine generata da Google Gemini. Utilizzando solo elaborazione del segnale e analisi spettrale (senza accesso al codificatore/decodificatore proprietario), abbiamo:
gemini-3.1-flash-image-preview e nano-banana-pro-preview, consenso di fase cross-colore su 6 sfondi solidi, e un ciclo di calibrazione human-in-the-loop che regola la forza di sottrazione per portante in base ai conteggi manuali di rilevamento dell'app GeminiVT-OxFF ha creato un visualizzatore molto interessante per vedere il processo di come la filigrana SynthID viene aggiunta alle immagini qui (disponibile anche nella descrizione del repository)!
Dopo sei round iterativi di sviluppo avversariale, la pipeline bypass_v4_final / bypass_v4_nuke del Round 06 sconfigge il rilevatore SynthID di Gemini su immagini sia di gemini-3.1-flash-image-preview che di nano-banana-pro-preview, con output visivamente senza perdita.
Sinistra: output del Round 01 (solo sottrazione spettrale leggera). Destra: output del Round 06 (final — VAE + deformazione elastica + compressione + colore + JPEG). Entrambi appaiono identici all'occhio umano; solo il Round 06 sconfigge il rilevatore SynthID.
| Round | Strategia | Risultato |
|---|---|---|
| 01 | Sottrazione spettrale conservativa (leggera) | ✗ |
| 02 | Sottrazione spettrale aggressiva + JPEG | ✗ |
| 03 | Targeting assoluto dei bin guidato dal blog | ✗ |
| 04 | Estrazione di fase dal residuo di denoising | ✗ |
| 05 | Rigenerazione Diffusion-VAE + warp geometrico | ✗ |
| 06 | All-in-one: VAE + frammentazione elastica + compressione + colore + JPEG | ✓ |
L'innovazione nel Round 06 è arrivata dal trattare la lista delle modalità di fallimento pubblicata dall'app Gemini come una specifica di attacco:
"Quando un'immagine generata dall'AI fa parte di un collage complesso, è stratificata dietro altri elementi, o ha molte texture e pattern diversi sovrapposti, il rilevatore potrebbe avere difficoltà a isolare la firma specifica dal file complessivo." — App Gemini, testo di aiuto sul rilevamento SynthID
La fase di deformazione elastica simula questo effetto a livello di pixel: un campo di warp casuale a bassa frequenza e liscio dà a ogni intorno di ~50 pixel il proprio spostamento sub-pixel indipendente, frammentando il consenso spaziale di fase della filigrana senza introdurre alcuna distorsione visibile.
V4 è una ripensamento da zero del codebook costruito su un set di dati molto più ricco:
gemini-3.1-flash-image-preview e nano-banana-pro-preview (più un pseudo-modello union opzionale).nero, bianco, blu, verde, rosso, grigio) per modello per risoluzione, più gradiente e diverso come baseline di contenuto.carrier_weights nel codebook viene aggiornato in base al feedback manuale di rilevamento dell'app Gemini.Per ogni bin di frequenza (fy, fx) e canale ch:```
consensus(fy, fx, ch) = | mean_over_colors( exp(i * phase_color(fy, fx, ch)) ) |
Valori vicini a `1.0` significano che la fase in quel bin è bloccata attraverso ogni sfondo di colore uniforme, il che è vero solo per la filigrana. I bin di contenuto collassano a `< 0.3` perché la loro fase viene randomizzata da diverse tinte di colore. Sul codebook V4 costruito dal dataset arricchito, il 99%+ dei bin di contenuto cade al di sotto del cutoff predefinito `tau=0.60`, quindi il dissolver V4 non li tocca mai — questo è ciò che recupera il PSNR.