
2026/08/25 0:28
MS Paint および Photo がローカルで生成された出力にも GUID で目に見えない水印を追加する
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Microsoft は、デバイス上で AI イメージを生成する方法の根本的な変更を行っており、厳格かつインターネット依存型の検証プロセスを義務付けています。Paint や Photos などのアプリにおいてイメージが確定する前に、システムはサーバーサイドのモデレーション記録にリンクされた不可視のデジタルウォーターマークを埋め込みます。これにより、すべてのローカルで生成されたコンテンツに起源の義務的証拠が付与され、ローカルハードウェアがリモートの監督と直接結び付けられるようになります。以前の方法ではオフラインでの生成が可能でしたが、このアーキテクチャでは常時接続が必要であり、それを欠くと Paint では生成が停止し、Photos では沈黙して失敗するとともにウォーターマークなしのファイルを返します。
技術的な仕組みは、専門化されたモジュールによってピクセルデータを修飾し、C2PA コンテンツクレデンシャルと呼ばれる暗号学的署名を付与することで成り立っています。これらのクレデンシャルは、イメージの一意な識別子をデジタル署名することによりその真正性を保証します。さらに、システムは出力形式を PNG、JPEG、GIF、.paint などが埋め込むのに必要なこのマニフェストデータを保持できるものだけに制限し、任意のマニフェストデータを外部ファイルなしに保存できない BMP ファイルを明示的に除外しています。Microsoft は安全性のためにユーザー識別子を収集しますが、このシフトはデジタルプロヴェナンスがオプションではなくすべての AI 生成ビジュアルに対する必須要件となった新たな業界標準を強化します。ウォーターマーク自体は、画像ブロック全体で各ビットを複数回配置し厳格な完全性チェックを満たすためにコンテンツ適応型アルゴリズムを使用してイメージに符号化され、モデルファイル自体は Copilot+ PC 上で推論を行う前に XOR 符号化されます。
本文
Microsoft Paint と Photos の「目に見えない透かし」調査レポート
TL;DR(まとめ)
- Microsoft Paint は、ローカルな画像生成とクラウド上の画像生成の両方をサポートしています。
- Paint と Photos アプリには、ローカルの AI モデルも同梱されています。
- どちらのアプリも、プロンプト(指示文)を検査する目的でリモートサーバーに送信します。
- サーバーからは検査済みのプロンプトと連番付きの識別子(GUID)が返されます。
- この GUID は、ローカルで生成された画像内に「目に見えない透かし」として埋め込まれます。
- 「透かしを表示/非表示」の設定は、この目に見えない透かしには影響しません。
- Copilot+ PC では画像生成自体はローカルで行われますが、プロンプトの検査(モデレーション)は引き続きリモートで行われます。
- Microsoft は Paint が AI 生成画像に C2PA メタデータを付与することを明言しています。
- **AI 生成画像の保存には、C2PA メタデータを保持できる形式(PNG, JPEG, GIF, .paint)**のみが制限されています。
Microsoft Paint の「不思議な側面」への探求
この調査は、Paint アプリに対する好奇心から始まり、Windows 内の未解明な AI 機能への探求へと発展しました。当初は単純なリモート API 呼び出しだと思われていましたが、Binary Ninja MCPとCodexによる分析を通じて、Microsoft が Copilot の一部として Windows にローカルのモデルを実装していることが判明しました。
アプリケーションの場所とモデル
Paint アプリは以下のパスに配置されています(すべて新しいタイプの「Windows アプリ」です):
C:\Program Files\WindowsApps\Microsoft.Paint_11.2605.71.0_x64__8wekyb3d8bbwe\PaintApp\
ここには、
.onnxe 拡張子を持つ以下の4 つの明らかなモデルファイルが存在します:
| ファイル名 | サイズ |
|---|---|
| 23.1 MB |
| 28.0 MB |
| 16.5 MB |
| 302.4 MB |
の形式は既知であり、文字列seg.onnxe
と XOR することで通常の ONNX ファイルになります。Microsoft_2023- 他の 3 つのファイルも同様に解読可能であることが確認されました。
- 重要: Microsoft はアルゴリズムを変更するのではなく、鍵(キー)のみを変更していたことが発覚しています。
暗号化を解除後、すべてのモデルに対して
onnx.checker.check_model() が正常に動作します。
| モデル | ノード数 | 入力/出力 |
|---|---|---|
| 1,094 ノード | 入力: , 出力: |
| 1,014 ノード | 出力: |
| 1,133 ノード | 入力: embeddings, points, masks; 出力: masks |
| 15,284 ノード | 入力: image/mask; 出力: |
目に見える透かしと「目に見えない透かし」の発見
画像生成プロセス中に、生成される画像に小さな Copilot ロゴが埋め込まれていることが確認されました。これに対し、同様に**「目に見えない透かし」**も埋め込んでいるかどうかを調査しました。
コード解析
透かし追加は
Watermarker.dll 内で処理されています。主要なフローは以下の通りです:
- 目に見える透かし (
):AddPerceptibleWatermark- ユーザーが「はい/いいえ」を回答するか、常に表示する場合に Copilot ロゴを追加します。
- 画像生成後の処理 (
):WmkWriteWatermark- ローカルでの Stable Diffusion 画像生成後に呼び出されます。
- もしこの関数が失敗すると、Paint は透かしなしの画像を返すのではなく、生成全体をエラーとして処理し直します。
// 透かしエンコーダーサマリー WmkWriteWatermark(output, guid, 16, width, height, stride, input, format) | +-- ポインタ、形式、stride、およびペイロード長を検証する +-- 幅 >= 192 かつ高さ >= 192 を要求する +-- ペイロードを構築する `-- 0x4c || GUID || バイト合計チェックサム (合計 18 バイト) +-- 18 バイトを 144 つの個別のビットに展開する +-- 利用可能な dimension を 8 ピクセルの境界まで切り捨てる +-- 適切な画像ブロックをスキャン/選択する +-- 各ビットについて少なくとも 3 つの成功した配置を要求する | `-- 容量が不十分 -> エラー (-8) を返す `-- RGB ピクセルを出力バッファーに再構築する
- ペイロード解析: 入力されるペイロードは常に16 バイトであり、これは GUID です。
- ペイロード長が 16 バイト未満の場合:エラーコード
-6 - ペイロード長が 16 バイトを超える場合:エラーコード
-5
- ペイロード長が 16 バイト未満の場合:エラーコード
テスト結果では、262,144 ピクセルのうち193,376 ピクセルが変更されており、これは明確な「目に見えない透かし」の適用を証明しています。
リモートプロンプトモデレーションからの GUID
ローカルで生成された画像にもかかわらず、埋め込まれる透かしの識別子は(GUID)、ネットワークリクエストから取得されていることが判明しました。
コールフロー
Paint がローカル画像モデルを実行する前に、
AIServices.dll は以下のアドレスにプロンプトとスタイルを送信します:
https://apsaiservices-a0fqcjc6bzbhgdcd.b02.azurefd.net/v1/paint-cocreator/moderate-prompt
リクエスト(送信側):
{ "prompt": "...", "style": "...", "lastPromptGenerationId": "..." }
レスポンス(返却側):
{ "revisedPrompt": "...", "promptGenerationId": "...", "watermarkId": "...", "containsHumanReference": false }
: サーバーサイドによる「プロンプトに人間の言及が含まれているか」の分類結果。containsHumanReference- 重要:
(GUID) は、このレスポンスから取得され、後にローカル画像に埋め込まれます。watermarkId
フロー図:
PaintUI.dll `-- IPromptModerationService `-- PaintAIManager.dll `-- AIServices.dll!ModerateAsync(...) | +-- JSON を構築する (prompt, style, lastPromptGenerationId) | +-- HTTPS POST /v1/paint-cocreator/moderate-prompt | `-- AIServices.dll!ParseModerateResponse(response) +-- revisedPrompt +-- promptGenerationId -> GUID として解析する +-- watermarkId -> GUID として解析する (後で使用) `-- containsHumanReference | `-- PaintUI が WatermarkId を保存する `-- StableDiffusionHelpers::GenerateAsync(...) `-- ローカル Stable Diffusion 結果実行 `-- Paint::AI::AddWatermark(bitmap, winrt::guid) `-- WmkWriteWatermark(...) `-- 変更された RGB ピクセル
C2PA コンテンツクレデンシャル
Paint はピクセルを変更するだけでなく、保存されたファイルにC2PA コンテンツクレデンシャルを付与します。これは
ProvenanceHelper.dll と provenancesdk.dll によってサポートされています。
署名プロセスは以下の通りです:
- ローカル Stable Diffusion が画像を生成する。
でサーバーに送信され、C2PA マニフェストが取得される。AIServices.dll!SignIngredientOnlineAsync- サーバーのレスポンスに含まれる GUID を透かし処理に使用し、ローカルで埋め込みを行う。
保存された画像(PNG)内の C2PA チャンク:
{ "c2pa.soft-binding": { "alg": "com.microsoft.invismark.1", "blocks": [ { "scope": "the entire image", "value": "83424621-03cb-40e3-9808-a9fae837156d" // watermarkId と一致 } ] }, "c2pa.actions.v2": { "actions": [ { "action": "c2pa.watermarked", "description": "Content watermarked by Microsoft Responsible AI" } ] } }
- 生成元: Microsoft Responsible AI Provenance
- AI システム: Azure OpenAI ImageGen
- アルゴリズム: com.microsoft.invismark.1
- 透かし値: サーバーから発行された
と一致。watermarkId
重要: C2PA はこれを「ソフトバインド」と呼び、ファイルレベルのマニフェストが削除された後も、コンテンツ自体に埋め込まれた値と照合可能であることを保証しています。
なぜ Paint はローカルで透かしを適用するのか?
Paint には大きく分けて2 つの生成パスがあります。
パス 1: Image Creator(クラウド)
- Azure OpenAI ImageGen を使用し、生成・透かし処理・パッケージングがすべてクラウドで行われます。
- Paint は完了した画像を単に受け取るだけであり、目に見えない透かしと C2PA マニフェストは既に含まれています。
パス 2: Cocreator(ハイブリッド)
- Copilot+ PC などで利用可能。NPU がローカルで画像生成を行い、Azure オンラインサービスが安全チェックを行う。
- プロンプト検査 → リビジョンされたプロンプト取得 → ローカル NPU による画像生成 → ローカルでの透かし埋め込み。
ローカル透かし実装の必要性:
- クラウドジェネレータは出力前に透かしを追加できるが、ローカルジェネレーター(NPU)はそのような依存関係を持たない。
- そのため、Paint はローカルで生成されたピクセル自体を変更(透かし追加)する必要があります。
セキュリティ上の懸念点
C2PA マニフェストを保持できない形式(BMP など)は保存できません。これは意図的な設計なのか、それともセキュリティ脆弱性(透かしステップを迂回する API の存在など)かは不明です。
Photos アプリも同じことをしています
Microsoft Photos アプリも
Watermarker.dll を使用しており、同様のローカル Stable Diffusion 処理を行っています。
- Photos Image Creator: テキストから画像への変換モデルをローカル実行し、
を GUID に変換して透かしを追加。promptGenerationId - Photos Restyle Image: スケッチから画像への変換を行い、同様に透かしを追加。
エラー動作の違い:
- Paint: 透かし処理が失敗すると生成全体をエラーとし、画像は返さない。
- Photos: 透かし処理が失敗してもログには記録されますが、生成された画像(透かしなし)をそのまま返り続けます。
Microsoft が公開している情報
Microsoft は Image Creator サポートページで以下のように明言しています:
- 「画像生成を防ぐためにコンテンツフィルタリングを適用しています。」
- 「C2PA マニフェストを含み、ユーザーがそれがAI 生成の画像であることを認識できるように助けます。」
しかし、以下の点は公式ドキュメントには記載されていません:
- C2PA マニフェストに目に見えない透かし用の GUID が含まれている事実。
- ローカル生成パスにおいて、透かし GUID をリモートプロンプトモデレーションから受け取る仕組み。
- プロンプト固有の識別子をユーザーに明示的に提供していない点。
結論
この調査により、Paint と Photos の「目に見えない透かし」動作が文書化されました。
- ローカルとクラウドの役割分担: クラウドでは完了済みの透かし済み画像を返しますが、ローカル生成(Cocreator)ではサーバー発行の識別子を埋め込む必要があります。どちらも完全なオフライン動作ではなく、プロンプト検査や署名プロセスはオンラインで行われます。
- EU AI 法との関連: 2026 年 8 月 2 日以降、AI 生成コンテンツには検出可能なマークを付与する必要があります(ただし、プロンプト固有の GUID 自体は必須ではありません)。
- プライバシーと透明性: サーバー発行の透かし GUID や、それがプロンプトモデレーションとどう関連するかについては、Microsoft は明言していません。これらにはプライバシーと知る権利の問題が存在します。
Paint または Photos を修正して両方のプロセスを迂回することも可能ですが、それは新しい機能を提供するものではなく、既存の Stable Diffusion エンジンを直接使うのと本質的に変わりません。