Claude 워터마크를 문장 재구성 없이 제거하는 꼼수를 찾아냄
I figured out a loophole to remove Claude watermark WITHOUT rephrasing
핵심 요약
Claude의 텍스트 워터마크를 문장 수정 없이 유니코드 변형 선택자를 삽입해 무력화하는 방법을 공유함.
- 워터마크 무력화 — 유니코드 변형 선택자를 삽입하여 워터마크 점수를 45에서 1 미만으로 낮춤
- 기술적 한계 — 단순한 문장 수정이나 마크다운 제거는 워터마크 탐지를 피하기 어려움
- 코드의 특수성 — 코드는 엔트로피가 낮아 워터마크가 거의 남지 않음
- 오픈 소스 공개 — 공격 기법과 결과를 확인할 수 있는 레포지토리와 데모 사이트 제공
Claude가 쓴 텍스트 워터마크를 단순히 수정(재작성이나 의역 말고)하는 것만으로 지울 수 있는지 궁금해서 직접 실험해 봤다. Claude/OpenAI/Gemini 텍스트 워터마크 생성기랑 탐지기를 만들어서 gpt-oss-20b랑 Qwen 결과물에 온갖 공격을 다 퍼부어 봤거든. 이 기술은 Gumbel-max 샘플링 기반의 유명한 Tournament Sampling을 사용함.
결론부터 말하면 사람들이 효과 있을 거라 믿는 것들, 거의 다 쓸모없더라. 엠대시(em-dash)를 하이픈으로 바꾸거나, 마크다운 다 떼버리거나, 미국식 영어를 영국식으로 바꾸는 거? 다 해봤는데 수치상 변화가 전혀 없음. 거의 300번 가까이 테스트 돌렸는데 탐지 임계값을 넘긴 건 딱 하나, 단어마다 40%씩 삭제하는 거였는데 이건 뭐 텍스트가 걸레가 되니까 의미가 없지.
빡세게 벤치마크 돌려본 결과, 10번 중 10번 다 확실하게 뚫리는 유일한 방법은 텍스트 중간중간에 보이지 않는 유니코드 변형 선택자(이모지나 CJK 렌더링에 쓰는 그 문자들)를 집어넣는 거였음. 전체 문자의 30% 정도에 적용하니까 워터마크 점수가 45에서 1 밑으로 떡락하더라. 내가 해본 다른 보이지 않는 문자 트릭들이랑 다르게, 이건 정규화(normalization)를 거쳐도 살아남음. 왜냐면 정규화 도구가 함부로 지울 수 없는 진짜 의미 있는 코드 포인트거든.
재밌는 사실 하나 더. 애초에 코드는 워터마크가 거의 안 박힘. 워터마크 강도는 모델이 다음 토큰을 얼마나 확신하느냐에 따라 결정되는데, 코드는 엔트로피가 낮아서 공격을 하나도 안 해도 워터마크가 아예 없는 수준으로 나오는 샘플들이 꽤 있음.
이런 공격 시도한 레포가 처음은 아니라는 거 나도 알지만, 어설프게 대충 내놓기 싫어서 주말 내내 시간 갈아 넣으면서 여러 오픈 모델들로 제대로 테스트해 봤음.
코드랑 결과물 다 들어있는 레포: https://github.com/aloshdenny/claude-awm
직접 공격 테스트해 볼 수 있는 인터랙티브 데모: https://aloshdenny.com/claude-awm/
한번 확인해 보고 의견 좀 남겨줘!


