Paint de Windows insère un GUID dans les images IA, même si le prompt passe d'abord par le cloud

Le développeur Xusheng Li, de Vector 35, a publié le 20 août une analyse d'ingénierie inverse concluant que Paint et Photos, les applications intégrées à Windows, encodent dans les pixels des images générées par IA un GUID de 16 octets provenant d'un serveur Microsoft, créant un filigrane invisible à l'œil nu. L'affaire ne s'est vraiment répandue chez les développeurs qu'après que The Register a repris le sujet le 25 août.

Selon la reconstitution de Li, le processus démarre dès que le prompt quitte la machine de l'utilisateur. En tapant une description dans Cocreator, l'outil de Paint, le programme envoie d'abord ce prompt à un point de terminaison Azure Front Door de Microsoft pour vérification ; le serveur répond avec trois éléments : un prompt révisé, un promptGenerationId, et une valeur appelée watermarkId. Ce watermarkId est précisément le GUID inscrit ensuite dans les pixels.

Comment le filigrane est intégré

Le composant chargé de l'encodage s'appelle Watermarker.dll, 1,67 Mo, accompagné d'un fichier de modèle chiffré de 302,4 Mo nommé mager.onnxe. Le GUID de 16 octets reçoit un marqueur 0x4c en tête et une somme de contrôle en fin, pour totaliser 18 octets, déployés sur 144 bits. Chaque bit nécessite au moins un bloc de pixels de 8×8 pour être porté, si bien qu'une image doit mesurer au minimum 192×192 pixels pour pouvoir recevoir un filigrane.

Le coût n'est pas négligeable. Li a comptabilisé, sur une image de 512×512, que sur 262 000 pixels, environ 193 000 avaient été modifiés, soit environ 74 %. La modification repose sur un algorithme de type SVD par blocs, adaptatif au contenu, imperceptible à l'œil nu, mais qui réécrit en réalité plus de la moitié de l'image.

Ce même GUID est aussi inscrit, par soft-binding, dans les métadonnées C2PA Content Credentials, sous l'identifiant d'algorithme com.microsoft.invismark.1, signé par Microsoft. Une copie réside dans les pixels, une autre dans les métadonnées — les deux se sauvegardent mutuellement : si les métadonnées C2PA sont retirées, le filigrane dans les pixels demeure.

Les formats pris en charge sont PNG, JPEG, GIF et le format .paint propre à Paint. Le BMP en est exclu ; selon Li, c'est probablement parce que le BMP ne peut pas contenir un manifeste C2PA complet.

Deux applications, deux attitudes

Paint et Photos gèrent différemment l'échec de l'application du filigrane, et cette différence en dit long :

  • Paint : si le filigrane échoue, toute la génération est considérée comme un échec, et l'image n'est tout simplement pas transmise à l'utilisateur.
  • Photos : une erreur est simplement consignée dans le journal, puis l'image sans filigrane est livrée normalement.

Image Creator et Restyle Image, dans Photos, utilisent la même Watermarker.dll. La règle de Paint — « pas d'image plutôt qu'une image sans filigrane » — montre que, dans la logique produit de Microsoft, le filigrane est une étape nécessaire du processus de génération, pas une option ajoutée après coup.

Li a aussi relevé un détail : Paint transmet le promptGenerationId de la génération précédente comme lastPromptGenerationId avec la requête de vérification suivante. Les générations successives se retrouvent ainsi explicitement chaînées côté serveur.

La question de la connexion au réseau

Le point le plus facilement mal compris concerne les Copilot+ PC. Ces machines disposent d'un NPU local, et la génération d'image tourne effectivement sur l'appareil — Microsoft met d'ailleurs constamment en avant la « génération locale » comme argument de vente. Mais la vérification du prompt et la signature de provenance se déroulent toutes deux dans le cloud : le GUID doit être obtenu auprès du serveur, et la signature C2PA doit être apposée par Microsoft. L'image est dessinée en local, mais le laissez-passer s'obtient en ligne.

Sur le plan de la vie privée, le raisonnement n'a rien de compliqué : si Microsoft parvient à associer chaque prompt au compte qui l'a envoyé, alors en théorie, à partir d'une image ayant fuité, remonter le filigrane suffirait à déterminer qui l'a générée et à quelle génération. La critique de Li ne vise pas la technologie du filigrane elle-même, mais l'insuffisance de la transparence : Microsoft a communiqué publiquement sur ses mesures de sécurité IA, mais n'a jamais précisé que le GUID inscrit dans le manifeste C2PA était lié au prompt de l'utilisateur. The Register a sollicité un commentaire de Microsoft, resté sans réponse au moment de la publication.

La frontière entre traçabilité et pistage

Les exigences de transparence de l'UE sur les contenus générés par IA visent à « faire savoir aux gens que ceci a été généré par une IA ». Des standards comme le C2PA ont justement été conçus pour ça : signaler l'origine et le mode de génération. L'approche de Microsoft va un cran plus loin que ce simple étiquetage : elle attribue à chaque génération un numéro unique.

La mise en œuvre technique des deux choses est presque identique, mais leur finalité diverge nettement. En gros, distinguer une information binaire du type « généré par IA ou non » ne demanderait qu'un seul bit ; un GUID de 16 octets, lui, offre 2^128 valeurs possibles, et cette largeur de bits excédentaire ne peut servir qu'à encoder quelque chose de bien plus granulaire. Cette largeur de bits révèle en elle-même l'intention de conception : ce n'est pas une étiquette de contenu, c'est une carte d'identité pour chaque événement de génération.

Pour l'utilisateur Windows ordinaire, l'impact immédiat reste limité — la plupart des gens n'utiliseront pas des images générées dans Paint pour des usages exigeant l'anonymat. Mais pour ceux qui utilisent Paint comme outil du quotidien, une chose est désormais certaine : génération locale ne signifie pas absence de trace locale, et chaque image repart avec un numéro que seule Microsoft peut expliquer.

Sources : rapport d'ingénierie inverse publié par Xusheng Li, The Register, CocoLoop ; vérifiés : la longueur en octets du GUID, le nombre de bits du filigrane, le nombre de pixels modifiés sur une image de 512×512 et la formulation de l'identifiant d'algorithme C2PA.