注目

AIセキュリティ / AI SECURITY / WATERMARK

Microsoft PaintのAI画像に不可視の透かしを強制挿入 — サーバ発行GUIDを画素へ埋め込み

ソフト開発者のXusheng Li氏が2026年8月20日、WindowsのPaintとPhotosがローカル生成したAI画像に、Microsoftサーバが発行したGUIDを不可視の透かしとして画素へ埋め込んでいることをリバースエンジニアリングで明らかにした。生成前にプロンプトをサーバで審査し、返却されたGUIDを144ビット化して画像へ書き込む。C2PAメタデータにも同一IDが記録される。

ソフトウェア

要点

  • ソフトウェア開発者のXusheng Li氏は2026年8月20日、Windowsの PaintPhotos がローカルで生成したAI画像に、Microsoftサーバが発行した 16バイトのGUID を不可視の透かし(blind watermark)として画素へ埋め込んでいることを解析結果として公開した。
  • 画像生成の前にPaintはプロンプトとスタイルをAzure上の審査エンドポイントへ送信し、サーバが返した watermarkId(GUID)を 0x4c || GUID || チェックサムの144ビット に展開して画素へ書き込む。研究者が512×512のBGRA画像で検証したところ 262,144画素中193,376画素 が微細に変化した。
  • 同一のGUIDは C2PA Content Credentials の署名付きマニフェストにも記録される。Li氏は「C2PAを削除しても画素内の透かしは残るため、スクリーンショットやトリミングでは完全には消去できない」と指摘している。

背景 — ローカル生成に見えるAI画像の裏側

Li氏は、PaintのAI機能「Image Creator」がCopilot+ PCではローカルのStable Diffusionモデル(NPUで推論)を用いる点に注目し、実際の処理が完全にオフラインかを検証した。対象は C:\Program Files\WindowsApps\Microsoft.Paint_11.2605.71.0_x64__8wekyb3d8bbwe\PaintApp\ にあるPaint本体と、seg.onnxe など4つの .onnxe モデルファイル、1.67MBの Watermarker.dll だ。

同氏は seg.onnxe が既知のXOR鍵 Microsoft_2023 で復号できる一方、残り3ファイルは segapi.dll 内の鍵レジストリ ps_enc_key.1.0.81-main(4,096バイトの英数字)に置き換わっていたことを確認し、復号後はONNXモデルとして検証できることを示した。mager.onnxe は15,284ノードを持つ最大のモデルだった。

Paintには従来から、生成画像の右下にCopilotロゴを付与する「可視の透かし」設定がある。Li氏は「可視の透かしに1.67MBのDLLは過大だ」との違和感から Watermarker.dll を解析し、不可視の透かしを書き込む WmkWriteWatermark 関数を発見した。

何が分かったか

不可視の透かしは画素へ直接書き込まれる

Li氏の解析によると、Paintの生成フローは次の順序で進む。

  1. ローカル生成前に AIServices.dll!ModerateAsync がプロンプトとスタイルを https://apsaiservices-a0fqcjc6bzbhgdcd.b02.azurefd.net/v1/paint-cocreator/moderate-prompt へHTTPS POSTする。送信内容は promptstylelastPromptGenerationId だ。
  2. サーバは revisedPromptpromptGenerationId(GUID)、watermarkId(GUID)、containsHumanReference を返す。Li氏が a cobalt blue circle above a tiny orange square で試したところ watermarkId83424621-03cb-40e3-9808-a9fae837156d が返却された。
  3. ローカルのStable DiffusionがNPUで画像を生成した後、Paint::AI::AddWatermark(bitmap, watermarkId)Watermarker.dll!WmkWriteWatermark を呼び出す。

WmkWriteWatermark はペイロード長が16バイトでなければエラー(-5や-6)を返し、内部では 0x4c(1バイト)+GUID(16バイト)+GUID各バイトの合計を256で割った剰余(1バイト)の 18バイト=144ビット を生成して埋め込む。画像の有効領域を8画素単位に丸め、144個のカウンタで各ビットが少なくとも3回配置されることを要求する。埋め込み自体は3×5行列演算や行列分解を含むブロック領域への量子化で、定数 24.0 0.25 0.5 0.2 が用いられる。Li氏は「SVD的なブロックドメインの透かしに見える」と説明している。

制約として、幅または高さが192px未満では透かし付与が失敗 する。Paintでは失敗時に生成全体をエラーとして扱い、透かし無しの画像は返さない。Photosではエラーをログに残しつつ画像は返すという違いがある。

同一GUIDがC2PAにも記録される

Paintは画素への埋め込みに加え、ProvenanceHelper.dllprovenancesdk.dll を用いて C2PA Content Credentials を付与する。ローカル生成後は AIServices.dll!SignIngredientOnlineAsyncPromptGenerationId や生成シード、創造性レベルなどを伴って /v1/paint-cocreator/image-sign へ画像を送信し、サーバが署名したC2PAマニフェストを返却する。Li氏が実際に保存したPNGのマニフェストには c2pa.soft-binding アサーションとして Microsoft InvisMark の名称と、画素へ埋め込まれたものと同一の watermarkId が記録されていた。

この二層構造により、ユーザーがC2PAメタデータを削除してもMicrosoftは画素解析で同一GUIDを検出できる。PaintはC2PAを保持する形式として PNG・JPEG・GIF・.paint に保存を限定している。

オンライン審査は必須

Li氏は、Paintが連続する生成で前回の promptGenerationIdlastPromptGenerationId として次回リクエストに含めることで、サーバ側でリクエストを紐付けられる点も指摘した。C2PA署名時にも PromptGenerationId が送られるため、サーバは画素内の watermarkId と署名要求を関連付けられる。

MicrosoftはドキュメントでPaintがリモートでのコンテンツフィルタリングとC2PA付与を行うことは開示しているが、画素への不可視透かしの詳細は説明していなかった。Li氏はMicrosoftがこのGUIDをアカウントやデバイス、IPアドレス、プロンプトと紐付けているかは確認できていないとしつつ、透明性の不足を問題視している。

日本の利用者への示唆

日本でもCopilot+ PCの普及に伴い、PaintやPhotosのローカルAI生成を「完全オフライン」と誤解して利用するケースが想定される。本解析が示すとおり、プロンプト送信とGUID発行はオンラインが必須 であり、社内情報や個人情報を含むプロンプトを入力する際は、外部送信が発生することを前提に運用ポリシーを定める必要がある。

生成画像を社外へ提供する際は、画素にGUIDが残留し、C2PAにも同一IDが署名付きで残ることを理解しておくことが重要だ。Li氏が示すように、スクリーンショットやトリミングでは透かしを完全に除去できない。

出典

この記事は、公開情報と編集部の調査・知見をもとに構成しています。内容は公開時点の情報に基づく解説であり、個別の環境への診断・対応を保証するものではありません。重要な判断では、記事内の出典や各提供元の最新情報もご確認ください。