MS 페인트, AI 이미지마다 비가시 GUID 삽입

Vector 35 소속 소프트웨어 개발자 쉬성 리(Xusheng Li)는 8월 20일, 윈도우 기본 앱인 페인트(Paint)와 사진(Photos)이 AI 이미지를 생성할 때 마이크로소프트 서버에서 받은 16바이트 GUID를 픽셀에 인코딩해 육안으로는 보이지 않는 워터마크를 만든다는 리버스 엔지니어링 분석 결과를 공개했다. 더 레지스터(The Register)가 8월 25일 후속 보도를 내놓으면서 이 소식이 개발자 커뮤니티에 퍼지기 시작했다.

리의 분석에 따르면 이 과정은 프롬프트가 기기를 벗어나는 순간부터 시작된다. 사용자가 페인트의 Cocreator에 설명을 입력하면, 앱은 먼저 그 프롬프트를 마이크로소프트의 애저 프런트 도어(Azure Front Door) 엔드포인트로 보내 검수를 받는다. 서버는 세 가지를 돌려준다. 수정된 프롬프트, promptGenerationId, 그리고 watermarkId라는 값이다. 이 watermarkId가 바로 이후 픽셀에 기록되는 GUID다.

워터마크는 어떻게 삽입되나

인코딩을 담당하는 구성 요소는 Watermarker.dll로, 용량은 1.67MB이며 302.4MB 규모의 암호화된 모델 파일 mager.onnxe와 짝을 이룬다. 16바이트 GUID 앞에는 0x4c 마커가 붙고 뒤에는 체크섬이 붙어 총 18바이트가 되며, 이를 펼치면 144비트가 된다. 각 비트를 담으려면 최소 8×8 픽셀 블록이 필요해, 워터마크를 삽입할 수 있는 최소 이미지 크기는 192×192다.

비용이 만만치 않다. 리가 512×512 이미지를 분석한 결과, 전체 26만 2000픽셀 중 19만 3000픽셀이 변경돼 비율로는 약 74%에 달했다. 사용된 기법은 콘텐츠 적응형 블록 SVD 계열 알고리즘으로, 육안으로는 구분할 수 없지만 실제로는 이미지 대부분을 다시 쓴다.

동일한 GUID는 C2PA 콘텐츠 자격 증명(Content Credentials) 메타데이터에도 소프트 바인딩(soft-binding) 형태로 기록된다. 알고리즘 식별자는 com.microsoft.invismark.1로 표기되며 마이크로소프트가 서명한다. 픽셀 쪽에 하나, 메타데이터 쪽에 하나씩 존재해 서로를 백업하는 구조다. C2PA 메타데이터를 제거해도 픽셀 워터마크는 그대로 남는다.

지원 형식은 PNG, JPEG, GIF, 그리고 페인트 자체 포맷인 .paint다. BMP는 제외됐는데, 리는 BMP가 완전한 C2PA 매니페스트를 담을 수 없기 때문으로 분석했다.

두 앱의 대응 방식이 다르다

페인트와 사진은 워터마크 삽입에 실패했을 때 대응 방식이 서로 다르며, 이 차이가 많은 것을 말해준다.

  • 페인트: 워터마크를 삽입하지 못하면 생성 자체가 실패로 처리되어 이미지가 사용자에게 아예 반환되지 않는다.
  • 사진: 오류 로그를 남긴 뒤에도 워터마크 없는 이미지를 그대로 건네준다.

사진 앱의 Image Creator와 Restyle Image 기능은 모두 같은 Watermarker.dll을 사용한다. 페인트의 '워터마크가 없으면 이미지도 없다'는 설계는, 마이크로소프트의 제품 논리에서 워터마크가 생성 파이프라인의 필수 요소이지 나중에 붙이는 선택 사항이 아님을 보여준다.

리는 또 하나의 세부 사항도 짚었다. 페인트는 직전 생성의 promptGenerationId를 lastPromptGenerationId로 삼아 다음 검수 요청과 함께 전송한다. 이 때문에 연속된 여러 번의 생성이 서버 측에서 명시적으로 하나의 체인으로 묶인다.

네트워크에 연결돼 있다는 사실

이 구조가 가장 오해받기 쉬운 지점은 Copilot+ PC다. 이런 기기에는 로컬 NPU가 탑재돼 있어 이미지 생성이 실제로 기기 안에서 이뤄지며, 마이크로소프트도 줄곧 '로컬 생성'을 판매 포인트로 내세워 왔다. 하지만 프롬프트 검수와 출처 서명 두 단계는 모두 클라우드에서 이뤄진다. GUID는 서버에서 발급받아야 하고, C2PA 서명도 마이크로소프트가 직접 해야 한다. 그림은 로컬에서 그려지지만, 통행증은 네트워크를 통해 발급된다.

프라이버시 측면의 추론은 단순하다. 마이크로소프트가 각 프롬프트를 이를 전송한 계정과 대응시키고 있는 한, 유출된 이미지 한 장에서 워터마크를 역추적하면 이론상 누가, 어느 생성에서 만들었는지 특정할 수 있다. 리의 비판은 워터마크 기술 자체가 아니라 공개의 충분성을 겨냥한다. 마이크로소프트는 자사의 AI 안전 조치에 대해 공개적으로 언급해 왔지만, C2PA 매니페스트 속 GUID가 사용자의 프롬프트와 연결돼 있다는 점은 명확히 밝히지 않았다. 더 레지스터는 마이크로소프트에 논평을 요청했으나 보도 시점까지 답변을 받지 못했다.

출처 증명과 추적 사이의 경계선

AI 생성 콘텐츠에 대한 EU의 투명성 요구는 '이것이 AI로 생성됐다는 사실을 사람들이 알게 하는 것'에 방점이 찍혀 있다. C2PA 같은 표준도 출처와 생성 방식을 표시하기 위해 설계됐다. 마이크로소프트의 이번 방식은 단순 표시를 넘어선 한 걸음을 더 내디딘다. 생성할 때마다 고유 번호를 발급하는 것이다.

두 가지의 기술적 구현은 거의 동일하지만 용도는 크게 다르다. 대략 계산해 보면 'AI 생성 여부'라는 이진 정보를 구분하는 데는 1비트면 충분하다. 16바이트 GUID는 2^128가지 값을 가지며, 남는 비트 폭은 훨씬 더 세밀한 정보를 인코딩하는 데만 쓰일 수 있다. 이 비트 폭 자체가 설계 의도를 말해준다. 이것은 콘텐츠 라벨이 아니라 생성 이벤트의 신분증이다.

일반 윈도우 사용자에게 단기적인 영향은 제한적이다. 대부분은 페인트로 생성한 이미지를 익명성이 필요한 용도로 쓰지 않을 것이다. 다만 페인트를 가볍게 자주 쓰는 사람이라면 이제 한 가지는 분명해졌다. 로컬 생성이 곧 흔적이 남지 않는다는 뜻은 아니라는 것이다. 모든 이미지는 마이크로소프트만이 설명할 수 있는 번호를 지닌 채 세상에 나간다.

참고 출처: 쉬성 리가 공개한 리버스 엔지니어링 분석 보고서, The Register, CocoLoop. GUID 바이트 길이, 워터마크 비트 수, 512×512 이미지의 픽셀 변경 수치, C2PA 알고리즘 식별자 표기를 확인했다.