Gemini의 SynthID 탐지를 역공학한 프로젝트
(github.com/aloshdenny)- Google의 SynthID 워터마크 시스템을 신호 처리와 스펙트럼 분석만으로 역공학해 Gemini 이미지의 비가시 워터마크를 탐지 및 제거하는 방법 제시
- 해상도에 따라 달라지는 주파수 기반 워터마크 구조를 규명하고, 90% 정확도의 탐지기와 43dB 이상의 PSNR 품질 달성
- V3 다중 해상도 스펙트럼 코드북을 이용해 해상도별 프로파일을 자동 선택하고, 91% 위상 일관성 감소와 75% 캐리어 에너지 감소 실현
- 동일 모델에서 생성된 이미지 간 위상 템플릿 일관성 99.5% 이상을 확인하고, Green 채널에서 가장 강한 워터마크 신호 검출
- SynthID 인코더 접근 없이 순수 신호 분석으로 구조를 복원한 점에서 AI 워터마킹 강인성 연구와 보안 분석에 중요한 의미를 가짐
개요
-
Google SynthID 워터마크 시스템을 신호 처리와 스펙트럼 분석만으로 역공학한 프로젝트
- Gemini가 생성한 이미지에 삽입되는 비가시 워터마크를 탐지 및 제거하는 방법 연구
- 해상도 의존적 주파수 구조를 규명하고 90% 정확도의 탐지기 구축
- V3 다중 해상도 스펙트럼 바이패스를 통해 75% 캐리어 에너지 감소, 91% 위상 일관성 감소, 43dB 이상의 PSNR 달성
- SynthID 인코더/디코더 접근 없이 순수 신호 분석으로 구조를 복원한 점이 특징
데이터 수집 및 기여 요청
- Nano Banana Pro로 생성된 순수 검정(#000000) 및 순수 흰색(#FFFFFF) 이미지를 수집 중
- 다양한 해상도의 이미지를 확보할수록 다중 해상도 워터마크 추출 성능 향상
- Hugging Face 데이터셋(aoxo/reverse-synthid)에 업로드 가능
-
gemini_black_nb_pro/: 검정 이미지 -
gemini_white_nb_pro/: 흰색 이미지
-
- 150~200장의 새로운 해상도 이미지가 탐지 및 제거 성능을 크게 향상
- 데이터셋은
scripts/download_images.py스크립트로 다운로드 가능
주요 차별점
- 기존의 JPEG 압축이나 노이즈 주입 기반 접근 대신 다중 해상도 SpectralCodebook을 사용해 해상도별 워터마크 지문 저장
- 바이패스 시 자동으로 해당 해상도 프로파일을 선택해 주파수-빈 단위의 정밀 제거 수행
주요 발견
-
해상도 의존적 워터마크
- SynthID는 이미지 해상도에 따라 서로 다른 절대 주파수 위치에 캐리어 삽입
- 예: 1024×1024에서는 (9,9), 1536×2816에서는 (768,704) 위치
- 해상도별 별도 프로파일 저장 시 정확한 제거 가능
-
위상 일관성
- 동일 Gemini 모델에서 생성된 모든 이미지의 위상 템플릿이 동일
- Green 채널에서 가장 강한 워터마크 신호 존재
- 교차 이미지 위상 일관성 99.5% 이상, 흑백 교차 검증 시 |cos(phase_diff)| > 0.90
-
캐리어 주파수 구조
- 1024×1024에서는 저주파 영역에 캐리어 존재
- 1536×2816에서는 고주파 영역에 캐리어 집중
- 각 캐리어의 위상 일관성과 흑백 일치율이 표로 제시됨
아키텍처
-
세 세대의 바이패스 비교
버전 접근 방식 PSNR 워터마크 영향 상태 V1 JPEG 압축(Q50) 37dB 약 11% 위상 감소 기준선 V2 다단계 변환(노이즈, 색상, 주파수) 27–37dB 0% 신뢰도 감소 품질 손실 V3 다중 해상도 스펙트럼 코드북 감산 43+dB 91% 위상 일관성 감소 최적 -
V3 파이프라인
- 입력 이미지 해상도에 맞는 프로파일을 코드북에서 선택
- 일치 시 FFT 도메인 감산, 불일치 시 공간 리사이즈 후 감산
- 다중 패스 반복 감산(강→중→약)으로 잔여 워터마크 제거
- 채널별 가중치(G=1.0, R=0.85, B=0.70) 적용
실험 결과 (V3, Gemini 이미지 88장)
- PSNR 43.5dB, SSIM 0.997, 캐리어 에너지 75.8% 감소, 위상 일관성 91.4% 감소
- 해상도별 품질
해상도 매칭 PSNR SSIM 1536×2816 정확 44.9dB 0.996 1024×1024 정확 39.8dB 0.977 768×1024 보정 40.6dB 0.994
설치 및 실행
-
설치
git clone https://github.com/aloshdenny/reverse-SynthID.git cd reverse-SynthID python -m venv venv source venv/bin/activate pip install -r requirements.txt -
코드북 생성
python src/extraction/synthid_bypass.py build-codebook \ --black gemini_black \ --white gemini_white \ --watermarked gemini_random \ --output artifacts/spectral_codebook_v3.npz -
V3 바이패스 실행
from src.extraction.synthid_bypass import SynthIDBypass, SpectralCodebook codebook = SpectralCodebook() codebook.load('artifacts/spectral_codebook_v3.npz') bypass = SynthIDBypass() result = bypass.bypass_v3(image_rgb, codebook, strength='aggressive') -
워터마크 탐지
python src/extraction/robust_extractor.py detect image.png \ --codebook artifacts/codebook/robust_codebook.pkl
프로젝트 구조
-
src/extraction/: SynthID 바이패스, 탐지기, 코드북 추출기 포함 -
src/analysis/: FFT 및 위상 분석 스크립트 -
scripts/: Hugging Face 이미지 다운로드 -
artifacts/: 코드북, 시각화, 분석 결과 저장
기술적 분석
-
SynthID 작동 원리 (역공학 결과)
- 인코더: 해상도별 캐리어 주파수 선택 → 고정 위상 부여 → 학습된 노이즈 패턴 추가
- 디코더: 노이즈 잔차 추출 → FFT 후 위상 비교 → 일치 시 워터마크 존재 판정
-
다중 해상도 SpectralCodebook
- 1024×1024 프로파일: 100개의 검정 + 100개의 흰색 이미지 기반
- 1536×2816 프로파일: 88개의 워터마크 포함 이미지 기반
- 위상 일관성과 교차 검증으로 캐리어 필터링
-
V3 감산 전략
- 직접 신호 감산 방식으로, 위너 필터 사용 없음
- 신뢰도 = 위상 일관성 × 교차 검증 일치율
- 저주파 영역은 DC 억제, 감산 비율은 채널 가중치와 안전 한도(90~95%) 적용
- 다중 패스로 잔여 에너지 제거
핵심 모듈
-
synthid_bypass.py- SpectralCodebook: 해상도별 워터마크 지문 관리
- SynthIDBypass: V1~V3 세대 바이패스 구현
-
robust_extractor.py- RobustSynthIDExtractor: 다중 스케일 워터마크 탐지기
- 코드북 기반으로 워터마크 존재 여부와 신뢰도 출력
참고 문헌
유지관리 및 지원
- Alosh Denny, AI 워터마킹 연구 및 신호 처리 전문가
- 이메일: aloshdenny@gmail.com
- GitHub: aloshdenny
- 연구 지속을 위한 후원 링크 제공 (Buy Me A Coffee)
면책 고지
- 본 프로젝트는 연구 및 교육 목적 전용
- SynthID는 Google DeepMind의 독점 기술
- 사용 목적: 워터마킹 강인성 연구, AI 생성 콘텐츠 식별 보안 분석, 스펙트럼 인코딩 이해
- AI 생성 이미지를 인간이 만든 것으로 오인시키는 용도로 사용 금지
Hacker News 의견들
-
수백만 픽셀짜리 이미지에 탐지 불가능한 1비트 워터마크를 삽입하는 건 그리 어려운 일이 아님
Google이 충분히 유능하다고 가정하면, 아마 두 가지 워터마크를 쓸 것 같음 — 하나는 외부에 공개된 느슨한 버전, 다른 하나는 내부용 혹은 법 집행 요청용 비공개 버전일 가능성이 높음
게다가 Google이라면 생성된 모든 이미지를 (혹은 그 neural hash) 계정과 연결해 데이터베이스에 저장할 것 같음- 이중 워터마크 전략은 defensive engineering 관점에서 매우 합리적임
외부 레이어가 뚫릴 걸 전제로 하고, 공개적으로 테스트할 수 없는 두 번째 레이어를 유지하는 건 보안의 기본 원칙임
다만 모델이 계속 새로 만들어지고 비결정적(non-deterministic) 특성을 가지는데, 이런 상황에서 사용자가 그걸 증명할 수 있을지 궁금함
- 이중 워터마크 전략은 defensive engineering 관점에서 매우 합리적임
-
이 리포는 AI 보조 연구라기엔 품질이 낮고, Google의 SynthID 탐지기와도 제대로 비교하지 않음
사실 LLM의 도움만 받아도 네트워크 요청을 역공학해서 브라우저나 Gemini 없이 SynthID 탐지를 구현할 수 있음. 그게 진짜 ground truth가 될 것임- HN에서 “이건 어렵지 않다”고 말하는 댓글을 자주 보지만, 정작 POC나 연구 링크는 거의 없음
또 출처를 공격하거나 “AI가 썼다”고 폄하하는 경우도 많음
요즘 HN 커뮤니티가 점점 AI 도구 혐오로 변해가는 느낌임
- HN에서 “이건 어렵지 않다”고 말하는 댓글을 자주 보지만, 정작 POC나 연구 링크는 거의 없음
-
오늘 Nano Banana로 생성한 이미지에서 워터마크를 본 것 같음
Chrome에서 이미지를 Slack으로 복사했는데, 결과물이 검은 사각형에 빨간 점으로만 보였음- 나도 비슷한 경험이 있었는데, 나중에 보니 스크린샷 위에 낙서한 점들이 복사된 거였음
혹시 그런 실수는 아니었는지 궁금함
- 나도 비슷한 경험이 있었는데, 나중에 보니 스크린샷 위에 낙서한 점들이 복사된 거였음
-
누군가 결국 이런 걸 만들 거란 건 알았지만, 왜 굳이 AI 생성 이미지 탐지 수단을 일부러 없애려 하는지 모르겠음
- 공격자는 어차피 같은 일을 할 것이고, 보안 취약점 공유처럼 선의의 연구자들도 알아야 함
나쁜 쪽만 알고 있으면 더 위험해짐 - 이런 도구는 어차피 일부 사람들만 쓸 수 있었지만, 이제는 모두가 그 가능성을 알게 되었음
- 근본적으로 SynthID는 불확실한 신호(fuzzy signal) 임
대중은 “워터마크가 없으니 진짜 이미지다” 식의 이진 논리를 이해하지 못함
결국 AI 워터마킹은 실패할 운명임
게다가 과거에도 조작된 미디어에 보이지 않는 워터마크를 붙이지 않았음 — 이건 기술보다 철학의 문제임 - 결국 목적은 가짜 이미지를 진짜처럼 보이게 하려는 것임
- 사실 이런 건 예전부터 가능했음
Stable Diffusion에서 낮은 denoising strength로 돌리면 워터마크가 거의 사라짐
이번 리포는 그보다 덜 파괴적인 방법을 제시한다고 하지만, README의 AI 작성 흔적을 보면 신뢰가 안 감
- 공격자는 어차피 같은 일을 할 것이고, 보안 취약점 공유처럼 선의의 연구자들도 알아야 함
-
SynthID는 일부 이미지(특히 엣지나 텍스트가 많은 영역)에서 눈에 띄게 보임
이 리포의 방법이 그런 부분을 더 자연스럽게 만들 수 있을지 궁금함- Nano Banana로 편집을 반복할수록 워터마크가 점점 더 뚜렷하게 드러나는 현상이 있음
-
README를 보면 Claude의 흔적이 너무 명확함
테이블 벽이 어긋나 있고, 문장 구조도 Claude 특유의 패턴임- 괄호와 쉼표로만 나열하고 “and”를 안 쓰는 것도 Claude의 전형적인 특징임
- 이건 완전 유니코드 테이블 대참사임
ASCII 테이블을 흉내 내면서 문자 폭이 제각각이라 줄이 안 맞음
심지어 off-by-one 오류도 있음
2037년에도 여전히 정렬 안 된 유니코드 테이블을 보고 있을 것 같은 예감임 - README 내용만 봐도 Claude가 쓴 것임이 분명함
-
이 리포는 자기 워터마크 제거 성능을 자체 탐지기로만 테스트함
정작 Google의 SynthID 앱으로는 검증하지 않아서 의미가 없음 -
프로젝트 설명에는 “AI 생성 콘텐츠를 인간이 만든 것처럼 속이지 말라”고 써 있지만, 실제로는 워터마크 제거 CLI 도구를 배포함
“aggressive”, “maximum” 같은 설정 이름도 노골적임
README는 편집되지 않은 AI 출력처럼 보이고, 내용이 중복되고 구조도 엉성함- V1, V2는 표에만 등장하고 설명이 없음
- “Detection Rate: 90%” 같은 수치엔 근거가 없고, “License: Research”는 링크조차 없음
- 테스트 이미지 88개뿐이고, CI나 테스트 스위트도 없음
- 코드 예시도 import 스타일이 두 가지라 하나는 오류를 냄
- Google이 SynthID를 바꾸면 코드북이 낡았다는 걸 알 방법도 없음
기본 아이디어(해상도 의존적 캐리어, 이미지 간 위상 일관성)는 흥미롭지만, 패키징이 신뢰를 무너뜨림 - 동의함. 이런 도구는 악용 가능성이 크고, 사회는 AI 생성 콘텐츠를 명확히 구분할 수 있어야 함
-
이미지를 다운스케일 후 업스케일하면 워터마크가 사라짐
-
실제로 그렇게 어렵지 않음
관련 글은 deepwalker.xyz 블로그에 있음