Paint de Windows graba un GUID en las imágenes de IA, aunque el prompt pasa antes por la nube

El desarrollador de software Xusheng Li, de Vector 35, publicó el 20 de agosto un análisis de ingeniería inversa según el cual Paint y Fotos, las aplicaciones nativas de Windows, al generar imágenes con IA codifican en los píxeles un GUID de 16 bytes procedente de un servidor de Microsoft, creando una marca de agua invisible a simple vista. El caso solo se difundió entre desarrolladores después de que The Register le diera seguimiento el 25 de agosto.

Según el desmontaje de Li, el proceso empieza en el instante en que el prompt sale del propio equipo. Al escribir una descripción en el Cocreator de Paint, el programa envía primero ese prompt a un endpoint de Azure Front Door de Microsoft para su revisión; el servidor responde con tres cosas: un prompt revisado, un promptGenerationId y un valor llamado watermarkId. El watermarkId es precisamente el GUID que después se graba en los píxeles.

Cómo se incrusta la marca de agua

El componente encargado de la codificación se llama Watermarker.dll, de 1,67 MB, junto con un archivo de modelo cifrado de 302,4 MB llamado mager.onnxe. Al GUID de 16 bytes se le añade un marcador 0x4c al principio y una suma de comprobación al final, hasta sumar 18 bytes, que se expanden en 144 bits. Cada bit necesita al menos un bloque de píxeles de 8×8 para transportarse, así que una imagen solo admite marca de agua si mide como mínimo 192×192 píxeles.

El coste no es pequeño. Li contabilizó en una imagen de 512×512 que, de 262.000 píxeles, unos 193.000 resultaron modificados, en torno al 74%. La modificación usa un algoritmo tipo SVD por bloques, adaptativo al contenido, imperceptible a simple vista, pero que en la práctica reescribe más de la mitad de la imagen.

Ese mismo GUID también se graba, mediante soft-binding, en los metadatos C2PA Content Credentials, con el identificador de algoritmo com.microsoft.invismark.1, firmado por Microsoft. Una copia queda en los píxeles y otra en los metadatos; ambas se respaldan mutuamente: si se elimina el metadato C2PA, la marca de agua en los píxeles sigue intacta.

Los formatos admitidos son PNG, JPEG, GIF y el propio formato .paint de Paint. El BMP queda excluido; Li cree que es porque el BMP no puede almacenar un manifiesto C2PA completo.

Dos actitudes distintas

Paint y Fotos manejan de forma diferente un fallo al aplicar la marca de agua, y esa diferencia revela bastante:

  • Paint: si la marca de agua falla, toda la generación se considera fallida y la imagen ni siquiera se entrega al usuario.
  • Fotos: solo registra un error en el log y aun así entrega la imagen sin marca de agua con normalidad.

El Image Creator y el Restyle Image de Fotos usan la misma Watermarker.dll. La postura de Paint —"mejor no generar que generar sin marca de agua"— muestra que, en la lógica de producto de Microsoft, la marca de agua es un paso necesario del proceso de generación, no un añadido opcional posterior.

Li también notó otro detalle: Paint envía el promptGenerationId de la generación anterior como lastPromptGenerationId junto con la siguiente solicitud de revisión. Así, generaciones consecutivas quedan explícitamente encadenadas por el servidor.

El asunto de la conexión a internet

El punto más fácil de malinterpretar está en los Copilot+ PC. Estos equipos tienen una NPU local y la generación de imágenes efectivamente corre en el propio dispositivo; Microsoft siempre ha usado la "generación local" como argumento de venta. Pero tanto la revisión del prompt como la firma de procedencia ocurren en la nube: el GUID hay que pedirlo al servidor y la firma C2PA tiene que firmarla Microsoft. La imagen se dibuja en local, pero el pase de entrada se pide por la red.

En materia de privacidad, la inferencia no es complicada: si Microsoft logra vincular cada prompt con la cuenta que lo envió, en teoría, al obtener una imagen filtrada bastaría rastrear la marca de agua para saber quién la generó y en qué generación. La crítica de Li no apunta a la tecnología de marca de agua en sí, sino a lo insuficiente de la divulgación: Microsoft ha hablado públicamente de sus medidas de seguridad de IA, pero nunca ha aclarado que el GUID del manifiesto C2PA está vinculado al prompt del usuario. The Register contactó a Microsoft para pedir comentarios y, al cierre de esta edición, no había recibido respuesta.

La línea entre trazabilidad y seguimiento

Los requisitos de transparencia de la UE para contenido generado por IA se centran en "hacer saber a las personas que esto lo generó una IA". Estándares como C2PA se diseñaron precisamente para eso: señalar el origen y la forma de generación. El enfoque de Microsoft va un paso más allá del simple etiquetado: asigna a cada generación un número único.

La implementación técnica de ambas cosas es casi idéntica, pero su propósito es muy distinto. Haciendo cuentas: para distinguir información binaria del tipo "generado por IA o no" bastaría con 1 bit; un GUID de 16 bytes, en cambio, tiene 2^128 valores posibles, y ese ancho de bits sobrante solo sirve para codificar algo mucho más granular. El propio ancho de bits ya delata la intención del diseño: no es una etiqueta de contenido, es un documento de identidad para cada evento de generación.

Para el usuario común de Windows, el impacto inmediato es limitado; la mayoría no usará imágenes generadas en Paint para algo que requiera anonimato. Pero para quien usa Paint como herramienta cotidiana, hay algo que ahora es seguro: generación local no equivale a ausencia de rastro local, y cada imagen sale con un número que solo Microsoft puede explicar.

Fuentes: informe de ingeniería inversa publicado por Xusheng Li, The Register, CocoLoop; se verificaron la longitud en bytes del GUID, el número de bits de la marca de agua, la cantidad de píxeles modificados en una imagen de 512×512 y la forma de escribir el identificador del algoritmo C2PA.