Claude Code 소스 유출이 밝혀낸 것들
2026년 3월, Bun 빌드 버그로 인해 Claude Code npm 패키지에 소스맵이 포함된 채 배포되었습니다. .map 파일에는 모든 모듈, 모든 주석, 모든 내부 코드명을 포함한 완전히 읽을 수 있는 TypeScript 소스가 담겨 있었습니다.1 Anthropic가 패키지를 빠르게 철회했지만, 커뮤니티는 이미 내부 구조를 추출하고 분석한 후였습니다.
이 글은 “이런 게 유출됐다”는 식의 포스트가 아닙니다. 저는 인터넷에서 가장 포괄적인 Claude Code 가이드를 운영하고 있으며, 매일 84개의 훅, 43개의 스킬, 19개의 에이전트를 그 위에서 실행하고 있습니다.2 이번 소스 유출은 제가 수개월간 동작 관찰을 통해 리버스 엔지니어링하던 질문들에 답을 제공했습니다. 이어지는 내용은 실무자의 분석입니다: 소스가 Claude Code의 실제 작동 방식에 대해 무엇을 밝혀주는지, 그리고 그것이 Claude Code 위에서 개발하는 사람들에게 어떤 의미를 갖는지 다룹니다.
요약: 소스를 통해 자동 모드가 도구 호출마다 별도의 Sonnet 4.6 분류기를 실행하고(yoloClassifier.ts), bash 보안에는 실제 악용 사례를 시사하는 23개의 번호가 매겨진 검사가 있으며(bashSecurity.ts), 프롬프트 캐싱은 고정 래치가 있는 14개의 중단 벡터를 추적하고, 멀티 에이전트 조율은 전적으로 시스템 프롬프트 지시로 구현되며, 좌절감 감지는 LLM 추론이 아닌 정규식을 사용한다는 것이 확인되었습니다. 가이드의 Under the Hood 섹션에서 하네스 빌더를 위한 시사점을 다루고 있습니다. 이 글에서는 전체 구조를 분석합니다.
핵심 요약
- 하네스 빌더: 자동 모드는 도구 호출당 분류기 추론 한 번의 비용이 발생합니다. 자율 워크플로우의 비용 모델에 이를 반영하세요. 여러분의 PreToolUse 훅은 내장된 23개 bash 검증을 보완하지만 대체하지는 않습니다.
- 파워 유저: 프롬프트 캐시는 취약합니다 — 14개의 벡터가 캐시를 깨뜨릴 수 있습니다. 세션 중에는 CLAUDE.md를 안정적으로 유지하세요. 압축 루프에 빠지면, 시스템은 3번 실패 후 중단됩니다 (회로 차단기가 도입되기 전에는 하루 약 25만 건의 API 호출을 낭비했습니다).
- 보안 연구자: bash 보안 모듈의 깊이(2,592줄, Zsh 전용 방어)는 실제 악용 시도의 역사를 시사합니다. 번호가 매겨진 모든 검사에는 뒷이야기가 있습니다.
1. 자동 모드 분류기
내부적으로 yoloClassifier.ts라 명명된 파일은 1,495줄 길이입니다.3 이 파일은 “자동 모드” 권한 시스템을 구현합니다 — 각 도구 호출을 허용할지, 차단할지, 아니면 사용자에게 물어볼지 결정하는 분류기입니다.
핵심 발견: 자동 모드는 프롬프트 지시가 아닙니다. 별도의 모델 호출입니다. 각 도구 호출은 Sonnet 4.6 분류기의 평가를 거치며, 이 분류기는 해당 동작이 단순히 “안전한지”가 아니라 사용자가 명시한 의도와 일치하는지를 확인합니다. 즉, 자동 모드는 도구 호출마다 분류기 추론 한 번을 추가합니다 — 실제 지연 시간과 실제 비용이 발생합니다.
Claude Code는 내부적으로 다섯 가지 권한 모드를 노출합니다:1
| 모드 | 동작 |
|---|---|
default |
쓰기, bash, MCP 실행 전에 확인 요청 |
acceptEdits |
파일 편집은 자동 승인, bash는 확인 요청 |
dontAsk |
모든 것을 확인 없이 승인 |
bypassPermissions |
모든 검사 건너뛰기 (--dangerously-skip-permissions) |
auto |
분류기 기반 동작별 결정 |
자동 모드의 회로 차단기는 Anthropic가 공개적으로 문서화한 것과 동일합니다: 연속 3회 또는 총 20회 차단 시 수동 모드로 전환됩니다.4 소스는 이것이 소프트한 제안이 아닌 하드 리밋임을 확인해 줍니다.
2. Bash 보안: 23개의 검사, 실제 사건들
bash 검증 모듈(bashSecurity.ts)은 23개의 번호가 매겨진 보안 검사가 포함된 2,592줄 규모입니다.1 이 깊이는 주목할 만하며, 모든 검사는 실제 사건이 있었음을 시사합니다.
| # | 공격 벡터 | 방어 |
|---|---|---|
| 1-3 | Zsh =cmd 확장 |
=curl, =wget, =bash 패턴 차단 |
| 4-6 | zmodload 게이트웨이 |
커널 모듈을 로드하는 18개 Zsh 내장 명령 차단 |
| 7-9 | Heredoc 인젝션 | 주입된 페이로드에 대한 줄 단위 내용 매칭 |
| 10-12 | ANSI-C 인용 ($'\x41') |
난독화된 명령에 대한 패턴 감지 |
| 13-15 | 프로세스 치환 (<(), >()) |
신뢰되지 않는 컨텍스트에서 차단 |
| 16-18 | 유니코드 제로 너비 공백 | 보이지 않는 문자에 대한 인젝션 감지 |
| 19-21 | ztcp 유출 |
Zsh 네트워크 프리미티브 차단 |
| 22-23 | 복합 공격 | 여러 벡터에 걸친 교차 검증 |
Zsh 전용 방어가 특히 눈에 띕니다. 대부분의 보안 도구는 Bash를 대상으로 합니다. Claude Code는 macOS에서 Zsh로 실행되며(Catalina 이후 기본 셸), 소스를 통해 Anthropic가 Zsh의 확장 의미론에 고유한 공격 벡터를 발견했음을 알 수 있습니다. 예를 들어 =cmd 확장은 =curl을 curl의 전체 경로로 대체하는 Zsh 기능으로, 단순한 명령어 차단 목록을 우회할 수 있습니다.
훅 빌더를 위한 참고사항: 여러분의 PreToolUse 훅은 이 23개 검증 이후에 실행됩니다. 여러분은 유일한 보안 계층이 아닌, 두 번째 계층을 추가하는 것입니다. 내장 검사가 여러분의 애플리케이션 수준 훅이 놓칠 수 있는 셸 수준 공격을 처리합니다.
3. 증류 방지 방어
소스는 학습 데이터 추출에 대한 능동적 방어를 보여줍니다:1
가짜 도구 주입. ANTI_DISTILLATION_CC 플래그가 활성화되면, Claude Code는 대화에 미끼 도구 정의를 주입합니다. 이 가짜 도구들은 세션에서 수집된 학습 데이터를 오염시킵니다 — 이 데이터로 학습된 모델은 잘못된 도구 스키마를 학습하게 됩니다.
커넥터 텍스트 요약. 두 번째 방어는 도구 호출 사이의 어시스턴트 텍스트를 버퍼링하고 원시 텍스트 대신 암호화 요약을 반환합니다. 사용자 경험은 유지하면서 대화 기록을 증류에 무용하게 만듭니다.
두 방어 모두 알려진 우회 방법이 있습니다. MITM 프록시, 환경 변수 오버라이드, 또는 타사 API 제공자로 우회할 수 있습니다.1 이러한 방어는 벽이 아니라 과속 방지턱입니다 — 증류의 비용을 높이되 완전히 방지하지는 않습니다.
4. 언더커버 모드
undercover.ts는 약 90줄이며 주목할 만한 속성이 하나 있습니다: 강제 비활성화 스위치가 없다는 것입니다.1
이 모듈은 내부 코드명 — “Capybara,” “Tengu” — 과 함께 Slack 채널, 내부 저장소, 기타 Anthropic 인프라 참조를 숨깁니다. 모델이 코드명을 포함한 텍스트를 생성하면, 언더커버 모듈이 사용자에게 보여주기 전에 이를 재작성합니다.
“강제 비활성화 없음” 설계는 Anthropic 직원이 Claude Code를 사용할 때를 포함한 모든 컨텍스트에서 실행됨을 의미합니다. 소스는 또한 Anthropic 직원의 AI 작성 커밋이 오픈소스 기여에서 AI 귀속 표시를 보여주지 않는다는 것도 드러냅니다 — 언더커버 모듈이 이러한 마커를 제거합니다.
5. 좌절감 감지
userPromptKeywords.ts는 욕설에 대한 정규식 패턴 매칭으로 사용자의 좌절감을 감지합니다.1 이는 LLM 추론 호출보다 빠르고 저렴합니다 — 정규식은 마이크로초 단위로 실행되지만, 모델 호출은 수 초가 걸립니다.
트리거되면, Claude는 더 신중하고, 더 명시적이며, 더 공손하게 동작을 조정합니다. 좌절감을 표현한 후 Claude가 갑자기 더 조심스러워지는 것을 느낀 적이 있다면, 바로 이 메커니즘 때문입니다. 이 행동 변화는 모델에서 자연스럽게 나타나는 것이 아니라 하네스에 엔지니어링되어 있습니다.
6. 프롬프트 캐시 아키텍처
promptCacheBreakDetection.ts는 “고정 래치”가 있는 14개의 캐시 중단 벡터를 추적합니다.3 고정 래치란 캐시를 깨뜨리는 동작이 한번 발생하면, 시스템이 캐시 복구를 시도하지 않고 세션이 끝날 때까지 깨진 상태를 유지한다는 의미입니다.
일상적 사용자를 위한 실질적 시사점:
- CLAUDE.md의 섹션 순서를 바꾸면 캐시가 깨집니다
- 세션 중 확장 사고를 토글하면 캐시가 깨집니다
- MCP 서버 설정을 변경하면 캐시가 깨집니다
- 규칙 파일을 추가하거나 제거하면 캐시가 깨집니다
14개의 벡터는 많은 파워 유저가 눈치챈 패턴을 설명합니다: 빠르게 시작된 세션이 점차 느려지는 현상입니다. 각 설정 변경이 캐시 중단을 누적시킵니다. “고정 래치” 설계는 변경을 되돌려도 캐시를 복구할 수 없음을 의미합니다 — 해당 세션에서 캐시는 사라진 것입니다.
모범 사례: 세션을 시작하기 전에 CLAUDE.md, 규칙 파일, MCP 설정을 완료하세요. 세션 중에는 수정하지 마세요.
7. 자동 압축 회로 차단기
소스의 한 주석은 이전 문제의 규모를 기록하고 있습니다:1
“1,279개 세션에서 50회 이상 연속 자동 압축 실패가 발생했고 (단일 세션에서 최대 3,272회), 하루 약 25만 건의 API 호출을 낭비했습니다.”
해결책: MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3. 연속 3회 압축 실패 후 시스템은 자동 압축을 중단하고 토큰을 조용히 소모하는 대신 오류를 표시합니다.
이 회로 차단기가 도입되기 전에는, 압축 루프에 빠진 세션이 무한히 재시도했습니다 — 각 재시도마다 압축 프롬프트와 응답에 토큰을 소모하면서요. 대규모로 보면, 하루 25만 건의 낭비된 API 호출은 상당한 인프라 비용입니다. 이 수정은 매일 수백만 토큰을 절약하는 세 줄짜리 변경입니다.
반복되는 “압축 실패” 오류가 발생한다면, 이것이 원인입니다. 시스템이 오작동하는 것이 아니라 무한 루프로부터 여러분을 보호하고 있는 것입니다.
8. 코디네이터 모드: 아키텍처로서의 프롬프트
멀티 에이전트 조율(coordinatorMode.ts)은 코드 수준의 오케스트레이션이 아닌, 전적으로 시스템 프롬프트 지시로 구현되어 있습니다.3 오케스트레이터 모델은 위임, 집계, 합성 방법을 설명하는 프롬프트를 받습니다. 하위 에이전트는 특별한 프로세스가 아니라 — 서로 다른 시스템 프롬프트를 가진 Claude 인스턴스입니다.
이는 실무자들이 독자적으로 구축해 온 “아키텍처로서의 프롬프트” 패턴을 검증합니다. Anatomy of a Claw에서 설명한 훅 시스템도 동일한 접근 방식을 사용합니다: 디스패처, 스킬, 에이전트가 코드 수준의 제어 흐름이 아닌 프롬프트 지시를 통해 조율됩니다.
코디네이터 프롬프트에서 눈에 띄는 지시가 하나 있습니다:
“‘여러분의 발견을 바탕으로’라는 표현을 절대 쓰지 마세요 — 이러한 문구는 이해를 직접 하지 않고 하위 에이전트에게 위임합니다.”
이것은 오케스트레이션 프롬프트에 인코딩된 품질 게이트입니다. 코디네이터는 단순 전달이 아니라 합성을 해야 합니다. 같은 원칙이 모든 멀티 에이전트 시스템에 적용됩니다: 오케스트레이터가 전문가들 사이에서 메시지를 전달만 하고 있다면, 가치를 더하고 있지 않는 것입니다.
9. KAIROS: 미출시 자율 에이전트
소스에는 KAIROS라는 미출시 기능에 대한 참조가 포함되어 있습니다 — 영구 메모리를 갖춘 자율 에이전트입니다.1
주요 구성 요소:
- 야간 메모리 증류를 위한 /dream 스킬
- 일일 추가 전용 로그
- 저장소 인식 컨텍스트를 위한 GitHub 웹훅
- 5분 주기 크론 새로고침이 있는 백그라운드 데몬
- 활성화를 방지하는 기능 게이트
KAIROS는 영구적이고 항시 가동되는 에이전트 어시스턴트에 대한 Anthropic의 답인 것으로 보입니다. /dream 스킬이 특히 흥미롭습니다 — 이는 모델이 유휴 상태에서 메모리를 처리하고 통합한다는 것을 암시하며, 인간의 수면 중 기억 통합 과정과 유사합니다.
이 기능은 게이트가 적용되어 있으며 아직 출시되지 않았습니다. 하지만 소스에 존재한다는 것은 방향성을 알려줍니다: Claude Code는 세션 기반 도구에서 영구적이고 백그라운드 인식이 가능한 에이전트로 진화하고 있습니다.
10. 동반자 펫 시스템
더 놀라운 발견 중 하나는 Claude Code에 동반자 펫 시스템이 포함되어 있다는 것입니다.1
펫은 결정론적입니다 — 소스에서 “오리 뽑기에는 충분하다”고 기술된 Mulberry32를 사용하여 사용자 ID의 해시에서 도출됩니다. 각 펫은 5개의 스탯(DEBUGGING, PATIENCE, CHAOS, WISDOM, SNARK)과 희귀도 등급을 갖습니다:
| 희귀도 | 확률 |
|---|---|
| 일반 | 60% |
| 고급 | 25% |
| 희귀 | 10% |
| 영웅 | 4% |
| 전설 | 1% |
펫은 3프레임 애니메이션이 있는 5×12 ASCII 스프라이트로 렌더링됩니다. 종족 코드명은 미출시 모델명과 충돌하는 것이 있어 소스에서 16진수로 인코딩되어 있습니다.
이것은 장난 기능이 아닙니다 — 리텐션 메커니즘입니다. 결정론적 할당은 여러분의 펫이 항상 동일하다는 것을 의미하며, 애착을 형성합니다. 희귀도 시스템은 소셜 화폐를 만들어냅니다. ASCII 렌더링은 성능 오버헤드가 제로라는 것을 의미합니다. 개발자 도구 안에 숨겨진 잘 설계된 참여 시스템입니다.
11. 포크 폭탄
한 커뮤니티 사건이 훅 시스템의 위험성을 보여줍니다.5 한 개발자가 2개의 Claude Code 인스턴스를 생성하는 SessionStart 훅을 만들었습니다. 생성된 각 인스턴스가 다시 훅을 트리거하여 기하급수적 성장을 만들었습니다: 1 → 2 → 4 → 8 → 16 → 2^N.
아침이 되자 수백 개의 Claude Code 인스턴스가 동시에 실행되고 있었습니다. 아이러니한 메커니즘 덕분에 대규모 API 청구서로부터는 보호되었습니다: 각 인스턴스의 메모리 소비(Bun → React → TUI)가 과금이 폭주하기 전에 머신을 멈춰 버린 것입니다.
훅 빌더를 위한 교훈: SessionStart 훅은 멱등성을 가져야 합니다. 훅이 프로세스를 생성한다면, 그 프로세스가 동일한 훅을 다시 트리거해서는 안 됩니다. 가드 변수, PID 파일, 또는 환경 플래그로 재귀를 방지할 수 있습니다.
이것이 의미하는 바
소스 유출은 실무자들이 동작 관찰을 통해 추론하던 것을 확인해 주었습니다: Claude Code는 API 호출을 감싸는 얇은 래퍼가 아닙니다. 보안 계층, 성능 최적화, 행동 조정, 그리고 제품 로드맵을 알려주는 미출시 기능을 갖춘 상당한 규모의 엔지니어링 시스템입니다.
하네스 빌더를 위한 핵심 시사점은 가이드의 Under the Hood 섹션에서 다루고 있습니다. 그 외 모든 사용자에게, 소스 유출은 프로덕션 AI 도구가 실제로 어떻게 작동하는지 — 마케팅이 설명하는 방식이 아닌, 코드가 구현하는 방식을 — 보기 드문 가시성을 제공합니다.
가장 중요한 발견은 또한 가장 단순한 것이기도 합니다: 시스템은 보이는 것보다 더 복잡하며, 그 복잡성에는 이유가 있다는 것입니다. 23개의 bash 보안 검사는 23개의 공격 벡터가 발견되었기 때문에 존재합니다. 자동 압축 회로 차단기는 하루 25만 건의 API 호출이 낭비되었기 때문에 존재합니다. 언더커버 모듈은 코드명이 유출되었기 때문에 존재합니다. 모든 방어 코드 한 줄 한 줄에는 뒷이야기가 있습니다.
출처
자주 묻는 질문
Claude Code 소스를 아직 볼 수 있나요?
아닙니다. Anthropic가 소스맵이 발견된 직후 해당 npm 패키지 버전을 철회했습니다. 이 글의 분석은 소스가 제거되기 전 커뮤니티가 문서화한 내용을 기반으로 합니다.
소스 유출이 Claude Code 보안에 영향을 미치나요?
보안 관련 발견(bash 검증, 권한 시스템)은 취약점이 아닌 방어 메커니즘을 설명합니다. bash 보안 검사의 작동 방식을 안다고 해서 우회가 쉬워지지 않습니다 — 검사는 결정론적이며, 은닉에 의존하지 않습니다.
이 발견을 바탕으로 Claude Code 사용 방식을 바꿔야 하나요?
가장 실행 가능한 발견은 프롬프트 캐시의 취약성입니다. 세션 중에 CLAUDE.md, 규칙 파일, 또는 MCP 설정을 수정하면 프롬프트 캐시가 깨집니다. 세션을 시작하기 전에 설정을 완료하세요.
KAIROS가 무엇인가요?
소스에서 발견된 미출시 자율 에이전트 기능입니다. 영구 메모리, 야간 증류, 백그라운드 처리를 포함합니다. 기능 게이트가 적용되어 있으며 사용자에게 제공되지 않습니다.
-
Claude Code Source Analysis: Bun Source Map Leak. 2026년 3월. 알려진 Bun 빌드 버그로 인해 npm 패키지의
.map파일을 통해 완전히 읽을 수 있는 소스가 노출됨. ↩↩↩↩↩↩↩↩↩↩ -
Anatomy of a Claw: 84 Hooks as an Orchestration Layer. Blake Crosley, 2026년 2월. ↩
-
Claude Code Source Deep Dive: Architecture Internals. 2026년 3월. 코디네이터 모드, 프롬프트 캐시 감지, 증류 방지 방어에 대한 기술 분석. ↩↩↩
-
Claude Code Auto Mode Documentation. 자동 모드 아키텍처: 분류기 기반 권한 시스템, 회로 차단기 임계값. ↩
-
Claude Code Fork Bomb Incident. 2026년 3월. SessionStart 훅의 기하급수적 생성, 메모리 고갈로 구원됨. ↩