Gemini의 SynthID 워터마크 역공학 및 제거 도구
Reverse engineering Gemini's SynthID detection
TL;DR Highlight
Google Gemini가 AI 생성 이미지에 삽입하는 보이지 않는 워터마크 SynthID를 신호 처리와 스펙트럼 분석만으로 탐지하고 제거하는 프로젝트가 공개됐다. AI 생성 이미지 식별 기술의 취약성을 보여준다는 점에서 논란이 되고 있다.
Who Should Read
AI 생성 이미지 탐지 기술이나 디지털 워터마킹의 보안성에 관심 있는 개발자, 혹은 SynthID 같은 콘텐츠 인증 기술을 서비스에 적용하거나 우회 가능성을 평가해야 하는 연구자 및 보안 엔지니어.
Core Mechanics
- 이 프로젝트는 Google의 SynthID 워터마킹 시스템을 역공학한 것으로, Gemini가 생성하는 모든 이미지에 삽입되는 비가시적 워터마크를 독점 인코더/디코더 없이 순수 신호 처리와 스펙트럼 분석만으로 분석했다.
- 워터마크 탐지기를 만들어서 SynthID 워터마크를 90% 정확도로 식별하는 데 성공했다고 주장하는데, 이 수치는 자체 제작 탐지기 기준이고 Google 공식 SynthID 탐지기로 검증한 것은 아니다.
- 핵심 발견은 SynthID 워터마크가 '해상도에 따라 달라지는 캐리어 주파수(carrier frequency) 구조'를 가진다는 점이다. 즉, 이미지 해상도마다 다른 주파수 대역에 워터마크가 삽입되는 패턴이 있다.
- 제거 기법으로 'V3 멀티 해상도 스펙트럼 바이패스'를 개발했으며, 캐리어 에너지 75% 감소, 위상 일관성 91% 감소, PSNR(화질 손실 지표) 43dB 이상을 달성했다고 주장한다. PSNR 43dB 이상이면 사람 눈으로는 거의 구분이 안 되는 수준이다.
- pip로 설치 가능한 CLI 도구로 배포됐고, 워터마크 제거 강도 설정에 'aggressive', 'maximum' 같은 옵션이 있어서 사실상 턴키(turnkey) 워터마크 제거 도구 성격이 강하다.
- 커뮤니티에서 수집 방식도 독특한데, Gemini(Nano Banana Pro)에 순수 검정(#000000)이나 흰색(#FFFFFF) 이미지를 붙여넣고 '그대로 재현해줘'라고 프롬프트를 넣어 생성된 이미지를 레퍼런스로 모아 워터마크 패턴 추출에 활용하고 있다.
- README와 코드 품질에 대한 지적이 많은데, 검증 이미지 88장, CI 없음, 테스트 스위트 없음 상태에서 '탐지율 90%'를 배지로 달았고, 코드 예시에서 import 방식이 두 가지가 혼재해 ImportError가 날 수 있는 상태다.
- 한 댓글에서 언급한 것처럼 단순히 이미지를 다운스케일 후 업스케일하면 워터마크가 제거된다는 주장도 있어, 이 정도 수준의 취약성이면 SynthID 자체의 실용성에 의문이 제기된다.
Evidence
- Google이 실제로는 두 가지 워터마크를 운용할 가능성이 있다는 의견이 나왔다. 하나는 공개 오라클로 제공하는 '느슨한' 버전이고, 다른 하나는 법 집행 요청 등을 위해 내부적으로만 보유하는 버전일 수 있다는 것이다. 또한 Google이 생성된 모든 이미지(또는 그 뉴럴 해시)를 계정과 연동해서 저장하고 있을 가능성도 높다는 지적이 있었다.
- 이 프로젝트가 자체 제작한 탐지기로만 테스트했고 Google의 공식 SynthID 탐지 앱으로 검증하지 않았다는 결정적인 비판이 있었다. 즉, 실제로 Google의 탐지 시스템을 속이는지 전혀 증명하지 못했다는 것이다. 한 댓글에서는 브라우저 인스턴스나 Gemini 접근 없이도 네트워크 요청을 역공학해서 SynthID 탐지를 직접 호출하면 ground truth를 얻을 수 있는데 그걸 안 했다고 지적했다.
- README가 AI가 작성한 텍스트의 흔적이 역력하다는 비판이 상세하게 나왔다. V1, V2는 표와 다이어그램에만 등장하고 설명이 없고, 같은 내용이 Overview·Architecture·Technical Deep Dive에 세 번 반복되며, 약 1600단어가 논문처럼 보이도록 패딩됐지만 실제 리거(rigor)가 없다는 것이다. 심지어 테이블 정렬이 어긋나있는 게 Claude가 작성한 흔적이라는 아이러니한 댓글도 달렸다.
- '연구 목적'이라고 명시하면서 동시에 pip 설치 가능한 'aggressive', 'maximum' 강도 설정의 워터마크 제거 CLI를 배포하는 것은 이율배반적이라는 불편함을 토로하는 댓글이 있었다. AI 생성 이미지를 사람이 만든 것처럼 오인하게 하는 유일한 수단 중 하나를 왜 굳이 제거하려 하느냐는 윤리적 문제 제기도 있었다.
- 단순히 이미지를 다운스케일 후 업스케일하는 것만으로도 워터마크가 제거된다는 경험담이 공유됐다. 이에 대해 '그게 이렇게 쉽게 제거된다면 SynthID 자체가 애초에 좋은 솔루션이 아니었던 것'이라는 반응도 나왔다. 별도 블로그 포스트(deepwalker.xyz)에서도 유사한 우회 방법을 설명한 글이 링크됐다.
How to Apply
- 자사 서비스에서 AI 생성 이미지 판별 기능을 구현하려고 SynthID에 의존하고 있다면, 이 프로젝트를 통해 단순 스펙트럼 처리만으로 워터마크가 제거될 수 있다는 점을 인지하고 단일 워터마크 탐지에만 의존하지 않는 다층 인증 전략(뉴럴 해시 + 메타데이터 + 생성 이력)을 병행하는 것이 안전하다.
- 보안 감사나 레드팀 작업을 하는 경우, 이 레포의 방법론(순수 이미지 집합으로 캐리어 주파수 패턴 추출)을 참고해서 조직 내에서 사용하는 워터마킹 시스템의 스펙트럼 분석 취약성을 자체 평가하는 데 활용할 수 있다.
- AI 생성 이미지 진위 검증 파이프라인을 설계 중이라면, 이 사례를 근거로 클라이언트 사이드 워터마크 탐지보다 Google 계정 연동 생성 이력이나 C2PA(콘텐츠 출처 및 진위 연합) 메타데이터 같은 서버 사이드 검증을 우선적으로 고려하는 아키텍처를 채택하는 것이 권장된다.
Code Example
snippet
# 레포 기본 사용법 (README 기준)
pip install huggingface_hub
# 레퍼런스 이미지 다운로드
python generate_references.py
# 워터마크 탐지
python src/detect.py --image path/to/image.png
# 워터마크 제거 (V3 멀티 해상도 스펙트럼 바이패스)
python src/remove.py --image path/to/image.png --strength aggressive
# strength 옵션: normal | aggressive | maximumTerminology
SynthIDGoogle DeepMind가 개발한 AI 생성 이미지 워터마킹 시스템으로, 사람 눈에 보이지 않는 신호를 픽셀에 삽입해서 AI가 만든 이미지인지 식별할 수 있게 한다.
캐리어 주파수(carrier frequency)워터마크 신호를 실어 나르는 주파수 성분. 라디오 방송에서 음성을 특정 주파수에 실어 보내는 것처럼, 이미지 워터마크도 특정 주파수 대역에 정보를 숨긴다.
PSNRPeak Signal-to-Noise Ratio의 약자로, 원본 이미지와 변형된 이미지 간의 화질 차이를 dB 단위로 표현한 수치. 40dB 이상이면 사람 눈으로 거의 구분할 수 없는 수준이다.
스펙트럼 분석(spectral analysis)이미지나 신호를 주파수 영역으로 변환(주로 푸리에 변환)해서 어떤 주파수 성분이 얼마나 있는지 분석하는 기법. 이미지에서는 엣지, 텍스처, 패턴 등이 특정 주파수로 표현된다.
뉴럴 해시(neural hash)신경망을 이용해 이미지의 의미적 특징을 고정 길이 해시값으로 변환한 것. 이미지가 약간 수정되거나 크기가 바뀌어도 같은 이미지이면 유사한 해시값이 나오는 특성이 있다.
C2PACoalition for Content Provenance and Authenticity의 약자로, 콘텐츠가 어디서 언제 누가 만들었는지 메타데이터로 기록하고 검증하는 업계 표준 규격이다.