
Research-only AI watermark robustness toolkit: local reverse proxy strips C2PA/EXIF/XMP, Unicode, image/audio stego, OOXML/PDF metadata, and scans Trojan Source.
Middleware universal de procedencia y saneamiento de marcas de agua para IA Artefacto de investigación: solo para evaluación de robustez de marcas de agua.
NullOrigin es un artefacto de investigación. Se publica para apoyar el estudio académico e independiente de la robustez de las marcas de agua, y para ningún otro fin.
Los esquemas de marcas de agua son afirmaciones de seguridad, y las afirmaciones de seguridad solo tienen sentido una vez que alguien ha intentado romperlas. La literatura que este proyecto implementa — Kirchenbauer et al. sobre KGW, Krishna et al. sobre ataques de paráfrasis, Boucher & Anderson sobre Trojan Source — existe porque los investigadores publicaron ataques funcionales para que los defensores pudieran medir la robustez real en lugar de asumirla. Esa es la tradición a la que pertenece este repositorio.
Usos previstos
No previsto, y no compatible
Nada de esto es un control técnico sobre cómo se ejecuta el código. Es una declaración de los términos bajo los cuales se ofrece, y de lo que su autor apoyará y no apoyará. El software se proporciona "TAL CUAL, sin garantía de ningún tipo" — consulte LICENSE.
Lea Alcance y limitaciones honestas antes de sacar ninguna conclusión de un número que esta herramienta imprima. Varios de los esquemas a los que se dirige no pueden verificarse contra un detector público, y el README lo dice en lugar de dar a entender lo contrario.
Lea esto antes de sacar conclusiones de cualquier número que esta herramienta imprima.
| Capa | Lo que realmente hace |
|---|---|
| Caracteres invisibles | Totalmente eficaz. Las cargas útiles de ancho cero, control bidi, selectores de variación y bloques Unicode Tags se eliminan por completo, con un recuento informado. Los confusables homoglifos entre escrituras (cirílico/griego que se muestran como ASCII) se normalizan. |
| Metadatos de documento (.docx) | Totalmente eficaz. Autor, último editor, recuento de revisiones, marcas de tiempo, plantilla y versión de la aplicación se eliminan de docProps, conservando el formato byte a byte. |
| C2PA / EXIF / XMP | Totalmente eficaz. La imagen se reconstruye a partir de muestras de píxeles sin procesar en un contenedor nuevo, por lo que los manifiestos JUMBF firmados y todos los metadatos desaparecen. Verificado mediante pruebas contra muestras etiquetadas. |
| Marca de agua estadística KGW | Depende por completo del backend de reescritura. Sin un modelo local configurado, la marca de agua estadística sobrevive — la herramienta lo dice en lugar de dar a entender lo contrario. |
| SynthID-Text / SynthID-Image / Tree-Ring | No verificable aquí. Estos usan claves privadas y decodificadores propietarios. NullOrigin aplica las perturbaciones que la literatura describe, pero no se afirma que derroten a los detectores reales, porque no hay un detector público contra el que medir. |
| AudioSeal / SynthID-Audio | No verificable aquí, por la misma razón. |
KGWStatisticalDetector es una implementación matemáticamente fiel y autoconsistente
del esquema de lista verde/roja de Kirchenbauer et al. sobre tokens de espacios en blanco. No es un
decodificador para la marca de agua de producción de ningún proveedor — esas dependen de un secreto privado y
del propio vocabulario BPE del modelo.
Su propósito es hacer que el benchmark sea real: KGWWatermarkEmbedder planta una marca de agua genuina,
la canalización la ataca, y el detector correspondiente mide la reducción real. Esa es una medición verdadera
del ataque contra este esquema. No se transfiere a la marca de agua de un proveedor.
El vocabulario $V$ se particiona en cada paso $t$ mediante un hash con semilla basado en el contexto precedente:
$$s_t = \text{Hash}(w_{t-k}, \dots, w_{t-1})$$
en una lista verde $G_t$ de tamaño $\gamma|V|$ y una lista roja $R_t$. Se añade un sesgo $\delta > 0$ a los logits verdes:
$$\tilde{l}{t,v} = \begin{cases} l{t,v} + \delta, & v \in G_t \\ l_{t,v}, & v \in R_t \end{cases}$$
La detección cuenta los aciertos verdes. Bajo $H_0$ son $\text{Binomial}(T, \gamma)$, por lo que:
$$z = \frac{|S_G| - \gamma T}{\sqrt{T\gamma(1-\gamma)}}$$
con $z > 4.0$ ($p < 3\times10^{-5}$) marcado como sintético.
Por qué la paráfrasis lo ataca: la marca de agua reside por completo en transiciones locales de n-gramas. Reescribir la forma superficial con un modelo sin marcar re-simienta cada posición. Este es el ataque de robustez estándar en la literatura de marcas de agua.
Por qué importa la longitud: $z$ crece como $\sqrt{T}$. Un pasaje de 100 tokens con una fracción verde de 0,70 solo alcanza $z \approx 3.9$ — por debajo del umbral. La detección necesita unos pocos cientos de tokens, y también los fixtures de benchmark significativos.