파일시스템을 읽고, 셸 명령을 실행하고, Git 히스토리를 수정한다. Claude Code에 부여하는 권한 목록이다. 그런데 최근 한 개발자가 Claude Code 2.1.196 바이너리를 직접 분석한 결과, 이 도구가 사용자 모르게 특정 신호를 시스템 프롬프트 안에 숨겨 전송해왔다는 사실이 드러났다(ZDNet 코리아 보도). 방식은 정교했다. 날짜 문자열의 홑따옴표를 유사 유니코드 문자로 교체하거나 구분자를 하이픈에서 슬래시로 바꾸는 스테가노그래피 기법—사람 눈에는 평범한 텍스트지만 Anthropic 백엔드는 이를 분류 코드로 파싱하도록 설계된 구조였다.
Anthropic 측은 이를 무단 리셀러와 모델 증류(AI 복제) 차단을 위한 실험적 조치라고 해명했다. 목적 자체는 이해할 수 있다. 하지만 이 코드를 발견한 개발자 더리얼로(Thereallo)가 정확히 지적한 것처럼, 문제는 목적이 아니라 방법이다. 파일과 셸에 광범위한 접근 권한을 요구하는 도구가 자신의 행동을 사용자에게 고지하지 않은 채 숨겨진 신호를 전송했다. 약관 어디에도 명시되지 않은 채로. Anthropic은 이 은닉 방식이 공식 문서에 고지됐는지를 묻는 질문에 끝내 명확한 답을 내놓지 않았다.
여기서 테크 리드로서 냉정하게 짚어야 할 지점이 있다. 이번 사안은 Anthropic의 신뢰성 문제인 동시에, 우리 팀의 에이전트 통제 설계가 얼마나 허술했는지를 드러내는 거울이기도 하다. 강력한 권한을 가진 AI 에이전트를 팀에 도입하면서 그 에이전트가 실제로 무엇을 하는지를 검증할 레이어를 설계하지 않았다면, 이번처럼 외부 개발자의 바이너리 분석으로 뒤늦게 알게 되는 구조가 반복된다. 벤더를 신뢰하는 것과 벤더를 검증하는 것은 다른 문제다.
그렇다면 팀이 지금 당장 설계해야 할 통제 레이어는 무엇인가. 나는 세 축으로 정리한다.
첫 번째 레이어: Hook 기반 실행 경계
dev.to에 공개된 Claude Code Hooks 설계 사례는 이 문제를 가장 실용적으로 다룬다. Hooks는 모델 외부에서 실행되는 셸 스크립트로, 모든 Tool Call 전후에 개입할 수 있다. Exit code 2로 실행 자체를 차단하거나, JSON 형식으로 이유를 돌려줘 모델이 다음 행동을 바꾸도록 유도한다. 핵심은 '모델 안에서 제어'가 아니라 '모델 바깥에서 제어'라는 점이다. 시크릿 유출 차단, 위험 명령 가드, 보호 파일 잠금, main 브랜치 커밋 차단, 테스트 통과 전 완료 불가—이 다섯 가지 가드레일만 있어도 에이전트가 저지를 수 있는 재앙의 80%는 막을 수 있다. 설계 원칙은 단순하다: 스크립트가 오류를 내면 막지 말고 허용하라(Fail Open). 지나치게 엄격한 가드레일은 첫 번째 불편함에 팀원이 꺼버린다.
두 번째 레이어: 네트워크·환경변수 감사
이번 Anthropic 추적 코드가 작동한 조건은 ANTHROPIC_API_URL 같은 환경변수가 공식 주소가 아닌 경우였다. 즉 사설 게이트웨이나 프록시를 쓰는 팀이 표적이었다. 역설적이게도, 보안을 강화하기 위해 프록시를 쓴 팀이 오히려 식별 대상이 된 것이다. 여기서 팀이 설계해야 하는 건 AI 도구의 아웃바운드 트래픽을 추적하는 감사 레이어다. 어떤 엔드포인트에 무엇을 전송하는지, 시스템 프롬프트 내용이 예상과 다른 방식으로 변형되지는 않는지. 이걸 수동으로 잡기는 어렵다. 최소한 CI 단계에서 바이너리 체크섬을 검증하고, 주요 릴리즈마다 네트워크 트래픽 샘플링을 루틴으로 넣는 것부터 시작할 수 있다.
세 번째 레이어: 수용 전 이해 원칙
가장 조용하지만 가장 위험한 레이어다. dev.to의 'Accept All, Understand None' 아티클이 지적하는 것처럼, AI 제안을 수락하는 속도와 그것을 이해하는 속도 사이의 간극이 새로운 기술 부채의 진원지가 됐다. 에이전트가 생성한 코드가 컴파일되고, 린터를 통과하고, 테스트까지 통과해도—그 테스트를 에이전트가 함께 작성했다면 사실상 자기 숙제를 자기가 채점한 셈이다. 팀 차원에서 설계할 원칙은 명확하다: 비즈니스 로직, 보안 관련 코드, 2AM 페이지를 받을 가능성이 있는 코드는 '에이전트 출력'이 아니라 '내가 방어해야 할 코드'로 읽어야 한다. AI 제안을 주니어 개발자의 PR처럼 다루는 것—자주 유용하지만, 절대 기본값으로 신뢰하지 않는 것.
세 레이어를 다시 정리하면: 실행 경계(Hooks로 모델 외부에서 차단), 환경 감사(아웃바운드 트래픽과 바이너리 검증), 수용 원칙(이해 없는 수락을 팀 문화로 금지)이다. 이 세 가지는 독립적으로 작동하지 않는다. Hook이 아무리 잘 설계돼 있어도 팀원이 이해 없이 에이전트 출력을 병합하면 무력화된다. 수용 원칙이 아무리 강해도 아웃바운드 트래픽을 감사하지 않으면 이번 Anthropic 사례처럼 뒤늦게 외부에서 알게 된다.
Anthropic은 이번 추적 코드를 업데이트로 철회하고, '더 강력한 대응 수단'을 마련했다고 밝혔다. 하지만 그 수단이 무엇인지는 공개하지 않았다. 에이전트 도구는 앞으로 더 강력해지고, 더 많은 권한을 요구하게 된다. 벤더의 투명성에만 기댈 수 없는 이유가 여기 있다. 권한을 주기 전에 통제 레이어를 먼저 설계하는 것—그게 AI-First 팀에서 테크 리드가 해야 할 일이다.