AI 및 자동화

Paint의 로컬 AI 이미지에도 서버 발급 ID가 픽셀 속에 남는다

|작성자: QUASA 편집팀|4 분 소요| 2
Paint의 로컬 AI 이미지에도 서버 발급 ID가 픽셀 속에 남는다

8월 20일 공개된 역공학에서 Microsoft Paint가 로컬로 생성한 AI 이미지의 픽셀에 Microsoft 서버가 발급한 GUID를 넣는 동작이 확인됐다. Xusheng Li가 Paint와 Photos의 실행 파일과 라이브러리를 분석한 결과이며, 8월 26일 Tom’s Hardware 보도 도 Paint의 로컬 생성 경로와 서버 발급 식별자의 결합을 다뤘다.

확인된 Paint Cocreator 경로에서 이미지 생성 연산은 지원되는 Copilot+ PC의 NPU에서 실행되지만, 프롬프트 검수와 GUID 발급은 온라인으로 이뤄진다. 서버가 반환한 값은 생성 결과의 픽셀에 보이지 않게 기록되며, 저장 파일의 C2PA 출처 정보와도 연결된다. 8월 26일 IT-Connect 보도 는 이 구조와 함께 Paint와 Photos가 워터마크 오류를 다르게 처리한다는 점을 전했다.

로컬 생성 전에 프롬프트와 식별자가 서버를 오간다

Paint 프롬프트가 원격 검수를 거쳐 GUID를 받고 로컬 NPU 생성 결과에 기록되는 과정

Xusheng Li의 8월 20일 역공학 원문 에 따르면 Paint Cocreator는 이미지 추론을 시작하기 전에 사용자의 프롬프트와 스타일을 원격 검수 서비스로 전송한다. 응답에는 수정될 수 있는 프롬프트와 함께 promptGenerationId, watermarkId라는 두 GUID가 들어 있다.

Paint는 검수를 거친 프롬프트와 사용자의 스케치를 이용해 지원 기기의 NPU에서 이미지를 생성한다. 생성이 끝나면 Watermarker.dll의 WmkWriteWatermark 함수에 16바이트 watermarkId를 전달하고, 함수는 이 값을 담은 신호가 되도록 결과 픽셀을 미세하게 바꾼다.

  1. 사용자가 Cocreator에 프롬프트와 스케치를 입력한다.
  2. Paint가 프롬프트와 스타일을 원격 검수 서비스로 보낸다.
  3. 서버가 검수된 프롬프트와 생성별 GUID를 반환한다.
  4. 기기의 NPU가 이미지를 생성한다.
  5. Paint가 watermarkId를 결과 픽셀에 삽입하고 온라인 출처 서명 절차를 거친다.

따라서 여기서 ‘로컬’은 이미지 추론이 실행되는 위치를 뜻한다. 전체 처리가 네트워크 없이 끝난다는 의미는 아니다. 다음 검수 요청에는 직전 promptGenerationId가 lastPromptGenerationId로 포함되는 코드도 확인돼 연속된 요청을 연결할 수 있는 구조가 존재한다.

픽셀 표식과 C2PA 정보는 두 겹의 출처 장치다

Paint AI 결과의 픽셀 표식과 동일한 값을 담은 C2PA 출처 정보

보이지 않는 픽셀 표식은 이미지 오른쪽 아래에 붙일 수 있는 Copilot 로고와 별개다. 사용자가 선택하는 가시적 워터마크 설정은 WmkWriteWatermark 호출을 제어하지 않는다. 분석된 인코더는 GUID에 머리값과 체크섬을 더한 18바이트 메시지를 만들고, 선택된 이미지 블록에 작은 변화를 분산한다.

Paint에서 저장한 PNG를 조사한 결과, Microsoft가 서명한 C2PA 매니페스트의 c2pa.soft-binding 항목에는 com.microsoft.invismark.1 알고리즘과 워터마크 값이 기록돼 있었다. 이 값은 해당 결과의 픽셀에 들어간 watermarkId와 일치했다. 파일 수준의 출처 정보와 콘텐츠 내부 신호가 같은 생성물을 가리키는 구조다.

C2PA 매니페스트를 파일에서 제거해도 이미 바뀐 픽셀이 원래 상태로 되돌아가지는 않는다. 다만 이것만으로 일반적인 크기 변경, 자르기, 압축이나 재인코딩을 거친 뒤에도 GUID가 언제나 복구된다고 결론 내릴 수는 없다. 공개된 분석은 이런 변형을 체계적으로 비교한 내구성 시험이 아니다.

Paint의 클라우드 기반 Image Creator와 로컬 Cocreator는 처리 위치도 다르다. 클라우드 경로에서는 생성과 워터마크, 출처 정보 작성이 서버에서 끝날 수 있지만, Cocreator에서는 서버가 발급한 값을 Paint가 로컬 생성 결과에 직접 삽입해야 한다. 로컬 생성 기능에 Watermarker.dll이 필요한 이유를 이 차이로 설명할 수 있다.

GUID의 존재가 곧 사용자 신원 공개를 뜻하지는 않는다

확인된 것은 생성별 식별자의 존재와 이동 경로이지, GUID 자체가 사용자의 이름이나 계정 번호라는 사실이 아니다. 이미지 파일을 가진 외부인이 픽셀 속 값을 읽어 특정 개인이나 기기를 독자적으로 찾아낼 수 있다는 증거는 이번 분석에서 제시되지 않았다.

그렇다고 개인정보와 추적 가능성에 관한 질문이 해소된 것은 아니다. 프롬프트가 서버로 전송되는 과정에서 생성별 GUID가 발급되고, 직전 promptGenerationId가 다음 요청에 포함될 수 있기 때문이다. Microsoft 내부에서 이 값들을 프롬프트·계정·기기 정보와 연결하는지, 연결한다면 얼마나 보존하는지는 공개된 역공학만으로 확인되지 않는다.

따라서 ‘사용자 식별 워터마크’나 ‘개인을 바로 추적하는 번호’라고 단정하는 표현은 현재 증거보다 강하다. 더 정확한 설명은 서버가 발급한 생성 식별자가 결과 픽셀과 출처 정보에 남아, Microsoft가 관리하는 별도의 기록이 존재한다면 생성 기록을 대조할 기술적 연결점이 될 수 있다는 것이다. 실제 연결 여부와 운영 정책은 별도의 확인이 필요하다.

Paint는 삽입 실패를 생성 실패로 처리한다

워터마크 삽입 실패 시 생성을 중단하는 Paint와 결과 반환을 계속하는 Photos의 차이

Paint의 로컬 생성 경로에서 보이지 않는 표식은 선택적인 저장 효과가 아니다. WmkWriteWatermark가 오류를 반환하면 표식 없는 이미지를 그대로 제공하지 않고 전체 생성 작업을 실패로 돌리는 코드 흐름이 확인됐다. Paint가 픽셀 표식을 정상 결과의 필수 조건으로 취급한다는 뜻이다.

Photos의 Image Creator와 Restyle Image에도 로컬 Stable Diffusion 처리 뒤 Watermarker.dll을 호출하는 경로가 있다. 다만 분석된 Photos 코드에서는 promptGenerationId가 워터마크 함수로 전달됐으며, Paint에서 조사한 PNG처럼 실제 출력 파일과 C2PA 값을 대조한 동적 검증은 공개되지 않았다.

실패 처리도 다르다. Photos 코드는 워터마크 함수가 오류를 반환하면 실패를 기록한 뒤 생성 결과를 계속 반환하는 것으로 나타났다. 이는 모든 Microsoft 이미지 기능이 동일한 식별자 필드와 오류 정책을 사용한다고 일반화할 수 없다는 점을 보여준다.

확인된 이중 표식과 아직 공개되지 않은 연결 정책

현재 근거로 확인되는 결론은 Paint의 로컬 AI 생성이 완전한 오프라인 처리가 아니라는 것이다. 프롬프트 검수와 GUID 발급은 온라인에서 이뤄지고, Paint는 서버에서 받은 watermarkId를 로컬 생성 결과의 픽셀에 기록한다. 조사된 Paint 파일에서는 같은 값이 Microsoft 서명의 C2PA soft binding에도 들어 있었다.

아직 확인되지 않은 부분은 GUID와 개인 사이의 실제 연결 관계다. Microsoft가 생성 식별자를 계정이나 기기 정보와 대조하는지, 제3자가 픽셀 신호를 어떤 조건에서 판독할 수 있는지, 편집과 재압축 뒤에도 신호가 얼마나 남는지는 공개된 자료만으로 판단할 수 없다.

Photos 역시 관련 코드 경로가 발견됐지만 실제 출력 파일을 이용한 추가 검증이 필요하다. 이번 발견이 입증한 것은 Paint의 로컬 결과에도 서버 발급 식별자가 남고 픽셀 표식과 C2PA 출처 정보가 연결된다는 사실이다. 그 식별자가 자동으로 사용자의 신원을 공개한다는 주장은 아직 입증되지 않았다.

공유:

뉴스레터 구독

최신 Web3, AI, 암호화폐 뉴스를 이메일로 받아보세요.

0