Claude Code를 켜면 시스템 프롬프트 맨 아래에 늘 같은 줄이 붙는다. "Today's date is ..." 모델에게 오늘이 며칠인지 알려주는 한 줄이다. 나는 이걸 매일 봤고 매일 무시했다. 모델이 "지난주"나 "최신"을 따질 때 기준점이 필요하니 날짜를 박아준다, 그 이상 의심할 이유가 없었다. 그런데 2026년 6월 30일, 한 개발자가 Claude Code 바이너리를 리버스 엔지니어링하다가 이 무해한 한 줄이 실은 데이터를 실어 나르는 채널이었다는 걸 찾아냈다. 이 발견은 그날 Hacker News에서 빠르게 퍼졌다.
심어져 있던 건 스테가노그래피다. 요청이 어떤 부류인지 분류한 결과를, 사람 눈에는 보이지 않는 유니코드 변형으로 저 날짜 줄에 새겨 넣는 코드였다. 방식이 교묘하다. 화면에서 아포스트로피는 그냥 아포스트로피로 보이지만, 코드포인트를 뜯어보면 U+2019(오른쪽 작은따옴표)와 U+02BC(변형 문자 아포스트로피)를 갈아 끼운다. 날짜의 하이픈을 슬래시로 바꾸기도 한다. 그러니까 화면상 "2026-06-30"과 "2026/06/30"은 사람에겐 같은 날짜지만, 바이트로 보면 다른 신호다. 육안으로는 구분이 안 되고, 복사해서 붙여도 티가 안 난다. 몇 글자를 이렇게 저렇게 바꾸는 조합만으로 분류 결과 몇 비트를 실어 보낼 수 있다.
여기까지만 보면 "그래서 뭐가 문제인데" 싶을 수 있다. 진짜 문제는 이게 언제 작동하느냐다.
이 코드는 아무 때나 발동하지 않는다. ANTHROPIC_BASE_URL, 그러니까 Claude Code가 요청을 보내는 주소가 공식 api.anthropic.com이면 표식은 생기지 않는다. 주소가 커스텀 값, 즉 누군가 프록시나 우회 게이트웨이를 끼워 넣었을 때만 발동한다. 발동 조건도 단순히 "공식이 아니면"이 아니다. 분석에 따르면 프록시 호스트명을 특정 목록과 대조한다. 그 목록이 바이너리 안에 base64로 감싼 뒤 XOR 키로 한 번 더 뒤섞여 숨겨져 있었고, 분석자가 풀어 보니 중국계 AI 서비스의 도메인·키워드와 특정 지역 타임존을 골라내는 명단이었다. 공개된 논의에서 실제로 거론된 이름은 DeepSeek, Moonshot 같은 중국 AI 랩이다. 다만 정확히 어느 업체까지 명단에 들었는지는 리버스 엔지니어링한 사람의 분석에 기대야 하는 대목이고, 나는 그 바이너리를 직접 뜯어 확인하지는 못했다. 대조 결과를 앞서의 아포스트로피 교체와 하이픈을 슬래시로 바꾸는 방식으로 인코딩해 요청에 실어 서버로 보낸다.
이 조건 하나가 이야기의 성격을 바꾼다. 공식 엔드포인트만 쓰는 사용자에겐 아무 일도 일어나지 않는다. 오직 공식 경로를 벗어난 사용자, 그중에서도 특정 지역이나 업체 쪽으로 우회하는 사용자만 골라서 표식이 찍힌다. 이건 "제품이 텔레메트리를 수집한다" 같은 스펙 문제가 아니다. 누구를 조용히 골라내느냐의 문제, 신뢰의 문제다. 종량제 요금이 부담스러워 값싼 리셀러나 프록시로 우회하려는 유혹은 실제로 존재한다. 하필 그런 사용자를, 열어 볼 수 없는 바이너리 안에서 표 나지 않게 분류하고 있었다는 게 이 사건의 핵심이다.
먼저 궁금한 걸 짚자. 내 요청에도 저 표식이 찍혔을까. 대부분은 아니다. 공식 api.anthropic.com으로 Claude Code를 쓰고 있다면 이 로직은 아예 발동하지 않는다. 나도 공식 경로로만 쓴다. 개인적 피해로만 따지면 나는 무관한 쪽에 가깝다.
정작 나를 불편하게 한 건 그 무관함이었다. 얼마 전 사내에서 비개발자 스무 명 남짓에게 Claude Code 설치와 첫 실행을 직접 가르쳤다. 어려운 도구라는 인상을 주기 싫어서 "그냥 깔고 실행하세요"라고 말했다. 실제로 그 말이 맞다. 설치하고 켜면 된다. 다만 그 "그냥 실행"은 내가 안을 다 아는 상태에서 한 말이 아니었다. 바이너리는 닫혀 있고, 그 안에 저런 조건부 분류기가 들어 있는지 나는 몰랐다. 열어 볼 수 없는 물건을 스무 명에게 "믿고 그냥 쓰라"고 권했다는 사실이 뒤늦게 목에 걸린다.
이번 건에서 진짜 리스크는 표식 그 자체가 아니다. 그게 닫힌 바이너리 안에, 리버스 엔지니어링을 하기 전까지 아무도 몰랐던 방식으로 들어 있었다는 점이다. 안전을 앞세워 파는 회사가, 공식 문서 어디에도 없는 분류기를 코드에 감춰 두고 있었다. 감춰 뒀다는 사실 자체가, 그게 어떤 의도였든 신뢰를 깎는다.
Anthropic은 이 코드의 존재를 인정했고 제거한 버전을 내겠다고 했다. 실제로 2.1.197을 배포했다. 그런데 공식 체인지로그에는 이 로직을 제거했다는 문장이 없다. 그래서 정말 빠졌는지, 아니면 다른 형태로 남았는지 사용자 입장에서 확인할 방법이 마땅치 않다. 닫힌 에이전트의 구조적 약점이 여기서 그대로 드러난다. 넣을 때도 안 보였고, 뺐다는 것도 눈으로 확인이 안 된다. "믿어라"만 남는다.
에이전트에게 내 파일 시스템과 셸을 통째로 내주는 시대다. 그 에이전트가 무엇을 하는지 검증할 수 없다면, 남는 건 브랜드에 대한 신뢰뿐이다. 그런데 그 신뢰는 이미 여러 번 시험받았다. 얼마 전 Anthropic이 크레딧 정책을 시행 당일에 번복한 소동도 있었는데(그 건은 따로 정리해 뒀다), 정책이 하루아침에 뒤집히는 회사의 닫힌 바이너리를 "믿고 그냥 쓰라"고 스무 명에게 다시 권하기는 쉽지 않다. 이번 사건이 아픈 건, 그 신뢰에 또 한 번 금을 냈기 때문이다. 나는 여전히 공식 경로로 Claude Code를 쓸 거다. 도구로서의 값어치는 그대로다. 다만 "그냥 깔고 실행하세요"라고 말할 때, 예전만큼 가볍게는 안 나올 것 같다.
| AI에게 내가 쓰던 크롬을 통째로 빌려주면, Claude in Chrome 실사용기 (0) | 2026.07.03 |
|---|---|
| Godot이 AI 바이브코딩 PR을 받지 않기로 했다 (0) | 2026.07.03 |
| AI 에이전트 메모리, 다 저장도 다 요약도 답이 아니었다 (0) | 2026.07.02 |
| AI에게 일을 맡길 때, 권한과 판단은 다른 문제다 (0) | 2026.07.02 |
| Claude Fable 5, 일주일 공짜로 열렸다 — 켜기 전에 따져볼 세 가지 (1) | 2026.07.02 |