Microsoft Paint와 Photos, 로컬 생성 이미지에 보이지 않는 GUID 워터마크 삽입

📌 3줄 핵심 요약 (TL;DR)

  • Microsoft Paint는 로컬 및 클라우드 이미지 생성을 지원합니다.
  • Paint와 Photos는 로컬 AI 모델을 포함하고 있으며, 서버에서 발급된 GUID를 보이지 않는 워터마크로 삽입합니다.
  • AI로 생성된 이미지는 C2PA 메타데이터가 포함되며, PNG, JPEG, GIF, .paint 형식으로만 저장 가능합니다.

Microsoft Paint와 Photos의 보이지 않는 워터마크 삽입

리버스 엔지니어링을 통해 Paint와 Photos가 로컬에서 생성된 AI 이미지의 픽셀에 서버에서 발급된 GUID를 삽입하는 방법을 밝혀냈습니다.

요약

  • Microsoft Paint는 로컬 및 클라우드 이미지 생성을 지원합니다.
  • Paint와 Photos는 로컬 AI 모델을 포함하고 있습니다.
  • 두 앱은 프롬프트를 원격 서버로 보내 검토를 받습니다.
  • 서버는 검토된 프롬프트와 함께 GUID를 반환합니다.
  • GUID는 로컬에서 생성된 이미지에 보이지 않는 워터마크로 삽입됩니다.
  • 별도의 보이는 워터마크 설정은 이 보이지 않는 워터마크를 제어하지 않습니다.
  • Copilot+ PC에서는 이미지 생성이 로컬에서 이루어지지만 프롬프트 검토는 원격으로 진행됩니다.
  • Microsoft는 Paint가 AI로 생성된 이미지에 C2PA 메타데이터를 추가한다고 공개했습니다.
  • AI로 생성된 이미지는 C2PA를 보존하는 형식으로만 저장 가능합니다: PNG, JPEG, GIF, 및 .paint

Paint는 사용자 프롬프트를 Microsoft의 검토 서버로 보내고, 검토된 프롬프트와 워터마크 GUID를 받아 로컬에서 이미지를 생성하고 최종 이미지 픽셀에 GUID를 삽입합니다.

Microsoft Paint에 대한 호기심

이 연구는 Paint에 대한 호기심에서 시작되었습니다. 최근에 UCPD, WHESCVC와 같은 덜 탐구된 Windows 기능을 조사하는 데 성공했으며, Microsoft가 Paint 앱에 AI 기능을 추가했다는 것을 오래 전부터 알고 있었습니다. Paint와 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 확장자를 가진 네 개의 명백한 모델 파일이 있습니다:

seg.onnxe          23.1 MB
inseg_enc.onnxe    28.0 MB
inseg_dec.onnxe    16.5 MB
mager.onnxe       302.4 MB

seg.onnxe의 형식은 이전에 알려진 바와 같이, Microsoft_2023 문자열과 XOR 연산을 하면 일반 ONNX 파일이 됩니다. 그러나 나머지 세 개의 .onnxe 파일의 형식은 처음에는 다르게 보였습니다.

알고 보니 Microsoft는 알고리즘을 변경하지 않고 키만 변경했습니다. segapi.dll에는 작은 키 레지스트리가 포함되어 있습니다:

ps_enc_key.1.0.80-main -> "Microsoft_2023"
ps_enc_key.1.0.81-main -> a 4,096-byte alphanumeric string

복호화 후, onnx.checker.check_model()은 모든 파일에서 작동합니다:

모델 그래프
seg.onnx 1,094 노드, 입력 input_image, 출력 output
inseg_enc.onnx 1,014 노드, 출력 image_embeddings
inseg_dec.onnx 1,133 노드, 임베딩, 포인트 및 마스크 입력; 출력 masks
mager.onnx 15,284 노드, 이미지/마스크 입력; 출력 output

보이는 워터마크

이 파일들을 살펴보는 동안, Watermarker.dll을 발견했습니다:

Microsoft Paint에 포함된 Watermarker.dll의 속성

Paint 앱과 상호작용하면서 이미지를 생성할 때 보이는 워터마크를 삽입하는 설정이 있다는 것을 이미 발견했기 때문에 이는 그다지 놀랍지 않았습니다:

Paint는 보이는 AI 워터마크에 대해 '절대 안 함', '항상', '매번 묻기' 옵션을 제공합니다.

보이는 워터마크는 이미지의 오른쪽 하단에 있는 작은 Copilot 로고일 뿐이며, 이는 전혀 이상하지 않습니다.

그러던 중, AI에게 DLL을 분석하여 보이지 않는 워터마크도 삽입할 수 있는지 물어보기로 했습니다. 이는 리버스 엔지니어로서의 직감의 일부로, 파일의 크기가 1.67 MB로, 그러한 사소한 기능에 비해 비정상적으로 크기 때문입니다 (논쟁의 여지가 있지만, 보이는 워터마크는 별도의 DLL이 필요하지도 않습니다). 최근 Claude Code 텍스트 워터마크 발표도 이러한 가능성을 생각하게 하는 데 일조했습니다.

보이지 않는 워터마크

우선, 보이는 워터마크는 AddPerceptibleWatermark에 의해 추가됩니다:

CPBDoc::Save(...)
  |
  `-- perceptible-watermark save helper(bitmap, WatermarkSetting)
        |
        +-- WatermarkSetting::Never
        |     `-- return the original bitmap
        |
        +-- WatermarkSetting::AskEveryTime
        |     `-- show the Yes / No confirmation popup
        |           +-- No: return the original bitmap
        |           `-- Yes: continue
        |
        `-- Always or confirmed Yes

ℹ️ 본 포스팅은 Hacker News의 공식 릴리즈/아티클을 기반으로 한국 개발자를 위해 번역·가공된 콘텐츠입니다.
🔗 원문 출처: MS Paint and Photos inivisibly watermark even locally generated output with GUID