見出し画像

MS Paintで作った画像に埋まったGUIDは、メタデータを消しても残る。怖くなって手持ちの画像3,000枚をMacでスキャンした

この記事でわかること

  • MS Paint と Windows フォトが、生成した画像に「見えない」ウォーターマークを埋めていること

  • そこに16バイトのGUID(識別子)が入っていて、可視ウォーターマークの設定では止まらないこと

  • オフラインのローカル生成(Cocreator)でも埋まること

  • 手持ちの画像に何か入っていないかを、追加インストールなしでMacから調べるやり方

  • そして、その調べ方では見つからないものが残るという話

先に結論を書きます。メタデータを消すタイプの「透かし除去」では、この透かしは落ちません。 画素そのものが書き換えられているからです。

何が見つかったのか

きっかけは、Windowsの Paint と フォト をリバースエンジニアリングした技術記事です(2026年8月20日公開)。検証されたバージョンは Paint 11.2605.71.0、フォト 2026.11060.2004.0。

対象になっているのは、この4つの機能です。

  • Paint の Image Creator(クラウド生成)

  • Paint の Cocreator(Copilot+ PC のローカル生成)

  • フォト の Image Creator

  • フォト の Restyle Image

そしてここが本題なのですが、埋め込まれるウォーターマークは2種類あります

ひとつは目に見えるほう。画像の右下に Copilot のロゴが乗るやつです。これは設定から「常に付ける/付けない/毎回聞く」を選べます。

もうひとつが見えないほう。こちらは上の設定に一切従いません。 ロゴを「付けない」にしても、独立した仕組みとして埋め込まれます。

埋まっているものの中身

解析されたのは `Watermarker.dll` の `WmkWriteWatermark` という関数です。方式は content-adaptive な block-domain の SVD 系ウォーターマークと説明されています。要するに、画像をブロックに割って、ブロックごとの画素の値を量子化しながらずらしていくタイプです。

記事の実測では、262,144ピクセルのうち 193,376ピクセルが書き換えられていました。 全体の7割以上です。見た目にはわかりませんが、ファイルの中身としては別物になっています。

そこに何が入るか。サーバーが発行した16バイトのGUID です。記事に出ている実例はこんな値でした。

watermarkId: "83424621-03cb-40e3-9808-a9fae837156d"

このGUIDは「そのプロンプトの生成リクエスト」に紐づく識別子として機能します。つまり、画像だけを見て「これはどの生成リクエストで作られたものか」を後から突き合わせられる、ということです。

さらに、PNG に保存すると C2PA(コンテンツクレデンシャル)のマニフェスト側にも `com.microsoft.invismark.1` というアルゴリズム名で同じGUIDが soft binding として記録されます。画素側とメタデータ側の両方に同じ値が入っている状態です。

オフラインでも埋まる

「クラウドで作ったからサーバーが埋めているだけでしょ」で終わらないのがこの話のポイントです。

Copilot+ PC の Cocreator は NPU を使ってローカルで画像を生成します。サーバーから完成画像が返ってくるわけではないので、サーバー側で埋めようがありません。ではどうしているかというと、Paint 自身がローカルで生成された画素を書き換えています。 記事にも "Paint actually has to alter the locally generated pixels itself" とあります。

ローカル生成=どこにも出ていない、という感覚は、この機能に関しては成立していません。

自分の画像を調べてみる

ここからが自分の環境の話です。Macで、追加インストールなしで、手持ちの画像にC2PA由来の痕跡があるかを見ます。

まず1枚だけ調べる場合。

LC_ALL=C strings -a ~/Pictures/sample.png | grep -iE "c2pa|jumbf|invismark|contentauth"

何も出なければ、その画像のメタデータ側にはコンテンツクレデンシャルが入っていません。

フォルダごと一気にやるならこうです。

find ~/Downloads ~/Desktop ~/Documents ~/Pictures -type f \
  \( -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.heic" -o -iname "*.webp" \) \
  2>/dev/null | while IFS= read -r f; do
    LC_ALL=C grep -a -q -m1 -E "c2pa|jumbf|invismark" "$f" 2>/dev/null && echo "HIT: $f"
  done

`exiftool` も Homebrew も要りません。`strings` と `grep` はmacOSに最初から入っています。

自分のMacで3,000枚に対して回した結果は、ヒット0件でした。ダウンロードした写真も、スクリーンショットも、書類に貼った画像も、C2PA のマニフェストは持っていませんでした。

ついでに、どこから来たファイルかは macOS の標準コマンドでも見られます。

mdls -name kMDItemWhereFroms ~/Pictures/sample.png

これはダウンロード元URLが残っている項目です。実際に試すと、拾ってきた画像には配布元のURLがそのまま2行入っていました。透かしとは別の話ですが、人に渡す画像では気にしたほうがいい情報です。

この調べ方で見つからないもの

ここが一番大事なところです。

上のコマンドで見ているのはメタデータ側だけです。C2PA のマニフェストはファイルの中に文字列として入っているので `grep` で当たります。

一方、Paint が埋めている不可視ウォーターマークの本体は画素側にあります。文字列として存在しないので、この方法では原理的に検出できません。

そして、メタデータを剥がすタイプのツール(いわゆるC2PA除去ツールの多く)が消せるのも、メタデータ側だけです。画素に埋まったほうは残ります。 ブロック単位で画素値を量子化して埋める方式は、軽い再圧縮やリサイズで壊れることを前提にしていません。むしろ壊れにくくするための方式です。

「メタデータを消したから匿名」という理解は、この機能に関しては危ないです。

で、どうするか

現実的な線を3つ挙げます。

1つめ。Windows の Paint / フォト の生成AI機能で作った画像は、身元と切り離したい用途に使わない。 ロゴを消す設定にしても不可視のほうは残ります。匿名で出す素材なら、そもそもこの経路で作らないのが確実です。

2つめ。手元のMacに何が入っているかは把握しておく。 上のワンライナーで一度スキャンしておけば、少なくともメタデータ側の状況はわかります。0件なら0件で、それが確認できているのとできていないのとでは全然違います。

3つめ。C2PA そのものは敵ではない。 出所を証明する仕組みとしては真っ当で、Adobe Firefly、DALL-E、Gemini、Pixel のカメラなど、多くの生成物や機器がすでに埋めています。問題は「設定で切ったつもりのものが、別経路で残っている」という状態のほうです。

まとめ

  • MS Paint / Windows フォト の生成AI機能は、可視ロゴとは別に不可視ウォーターマークを埋めている

  • 中身はサーバー発行の16バイトGUID。C2PA側にも同じ値が `com.microsoft.invismark.1` として記録される

  • 可視ロゴの設定では止まらない。Copilot+ PC のローカル生成(Cocreator)でも Paint 自身が画素を書き換えて埋める

  • Macから調べるなら `strings` + `grep` で追加インストール不要。手元の3,000枚は0件だった

  • ただしこの方法で見えるのはメタデータ側だけ。画素に埋まったほうはメタデータを消しても残る

次にやることとして、まずは自分のフォルダに対して上のワンライナーを1回流してみてください。0件だったという事実を持っておくだけで、あとから画像を配布するときの判断が速くなります。


生成AI周りで「勝手に入っていた」ものを追いかけていくと、最終的に自分の開発環境の権限設定に行き着きます。実際に14社が侵入された事例をたどりながら、Claude Code側で先に閉じておくべき箇所を整理しました。



いいなと思ったら応援しよう!