Claude Code 소스 유출이 밝혀낸 것들
2026년 3월, Bun 빌드 버그로 인해 Claude Code npm 패키지에 소스맵이 포함되어 배포되었습니다. .map 파일에는 TypeScript의 전체 가독 소스가 담겨 있었습니다. 모든 모듈, 모든 주석, 모든 내부 코드네임이 노출된 것입니다.1 Anthropic는 해당 패키지를 빠르게 내렸지만, 커뮤니티는 이미 내부 구조를 추출하고 분석한 뒤였습니다.
Claude Code 소스 유출은 auto 모드가 각 도구 호출마다 별도의 Sonnet 4.6 분류기를 실행한다는 사실, bash 보안이 실제 취약점 공격 사례를 시사하는 23개의 번호가 매겨진 검사를 사용한다는 점, 그리고 프롬프트 캐싱이 스티키 래치와 함께 14개의 캐시 무효화 벡터를 추적한다는 점을 드러냈습니다. 소스는 또한 가짜 도구 주입을 사용한 지식 증류 방지 기능, 강제 해제 스위치 없이 내부 코드네임을 제거하는 언더커버 모듈, 전용 프로토콜 코드가 아닌 시스템 프롬프트 지시문만으로 구현된 멀티 에이전트 조정 체계를 드러냈습니다.
저는 “유출된 것을 보라” 식의 글을 쓰려는 게 아닙니다. 저는 인터넷에서 가장 철저한 Claude Code 가이드를 유지 관리하고 있으며, 그 위에서 매일 84개의 후크, 43개의 skill, 19개의 agent를 운영합니다.2 이번 소스 유출은 제가 수개월간 동작 관찰을 통해 역공학으로 추정해 온 질문들에 답을 주었습니다. 다음은 소스가 Claude Code의 실제 작동 방식에 대해 드러낸 것과, 그 위에서 빌드하는 사람들에게 이 발견이 어떤 의미를 갖는지에 대한 실무자의 분석입니다.
TL;DR: 소스는 auto 모드가 도구 호출마다 별도의 Sonnet 4.6 분류기를 실행하고(yoloClassifier.ts), bash 보안에 실제 취약점 공격 사례를 시사하는 23개의 번호가 매겨진 검사가 있으며(bashSecurity.ts), 프롬프트 캐싱이 스티키 래치와 함께 14개의 무효화 벡터를 추적하고, 멀티 에이전트 조정이 전적으로 시스템 프롬프트 지시문 안에 존재하며, 좌절 감지가 LLM 추론이 아닌 정규식을 사용한다는 사실을 확인시켜 줍니다. 가이드의 Under the Hood 섹션은 빌더를 위한 시사점을 다룹니다. 아래 글에서는 전체 구조를 다룹니다.
핵심 요약
- 빌더를 위해: auto 모드는 도구 호출마다 분류기 추론 비용이 한 번씩 발생합니다. 자율 워크플로의 비용 모델에 이 오버헤드를 반영하세요. 여러분의 PreToolUse 후크는 내장된 23개 검사 bash 검증을 보완할 뿐 대체하지는 않습니다.
- 파워 유저를 위해: 프롬프트 캐시는 14개 벡터에 걸쳐 쉽게 깨집니다. 세션 내에서는 CLAUDE.md를 안정적으로 유지하세요. 압축 루프에 빠지면 시스템은 실패 3회 이후 중단됩니다(회로 차단기는 압축 재시도가 하루에 API 호출을 25만 건 낭비한 이후 만들어졌습니다).
- 보안 연구자를 위해: bash 보안 모듈의 깊이(2,592줄, Zsh 특화 방어)는 실제 공격 시도의 이력을 시사합니다. 번호가 매겨진 모든 검사에는 그 뒤에 사연이 있습니다.
1. Auto 모드 분류기
내부적으로 yoloClassifier.ts라고 불리는 파일은 1,495줄입니다.3 이 파일은 각 도구 호출에 대해 허용, 차단, 질의를 결정하는 “auto 모드” 권한 시스템의 분류기를 구현합니다.
핵심 발견은 이것입니다. auto 모드는 프롬프트 지시문이 아닙니다. 별도의 모델 호출입니다. 각 도구 호출은 Sonnet 4.6 분류기에 의해 평가되며, 분류기는 명령이 단독으로 “안전한지”가 아니라 그 동작이 사용자가 밝힌 의도와 일치하는지를 확인합니다. 따라서 auto 모드는 도구 호출마다 분류기 추론을 한 번씩 추가하며, 실제 지연과 실제 비용을 발생시킵니다.
Claude Code는 내부적으로 5가지 권한 모드를 노출합니다.1
| 모드 | 동작 |
|---|---|
default |
쓰기, bash, MCP 전에 질의 |
acceptEdits |
파일 편집은 자동 승인, bash는 질의 |
dontAsk |
모든 것을 묻지 않고 승인 |
bypassPermissions |
모든 검사 건너뛰기 (--dangerously-skip-permissions) |
auto |
분류기 기반 동작별 결정 |
auto 모드의 회로 차단기는 Anthropic가 공개적으로 문서화한 것과 동일합니다. 연속 3회 또는 누적 20회 차단 시 수동 모드로 일시 중지됩니다.4 소스는 이것이 부드러운 권고가 아닌 하드 제한임을 확인시켜 줍니다.
2. Bash 보안: 23개 검사, 실제 사건들
bash 검증 모듈(bashSecurity.ts)은 2,592줄에 걸쳐 있으며 번호가 매겨진 23개의 보안 검사를 담고 있습니다.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 정규식은 마이크로초 단위로 실행되고, 모델 호출은 초 단위가 걸립니다. 속도와 비용 차이가 이 설계 선택을 설명합니다.
트리거되면 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에서 제가 설명한 후크 시스템은 동일한 접근 방식을 사용합니다. 디스패처, skill, agent는 코드 레벨 제어 흐름이 아닌 프롬프트 지시문을 통해 작동합니다.
코디네이터 프롬프트의 한 지시문이 눈에 띕니다.
“‘당신의 발견에 근거하여’라고 절대 쓰지 마세요. 이런 표현은 이해를 스스로 하는 대신 작업자에게 위임하는 것입니다.”
이 지시문은 오케스트레이션 프롬프트에 인코딩된 품질 게이트로 기능합니다. 코디네이터는 종합해야지 중계해서는 안 됩니다. 동일한 원칙이 모든 멀티 에이전트 시스템에 적용됩니다. 오케스트레이터가 전문가들 사이에서 메시지만 전달한다면 아무 가치도 더하지 못합니다.
9. KAIROS: 미출시 자율 에이전트
소스에는 KAIROS라는 미출시 기능에 대한 참조가 포함되어 있습니다. 이는 영구 메모리를 가진 자율 에이전트입니다.1
주요 구성 요소:
- 야간 메모리 증류를 위한 /dream skill
- 일일 추가 전용 로그
- 저장소 인식 컨텍스트를 위한 GitHub 웹후크
- 5분 cron 새로 고침을 수행하는 백그라운드 데몬
- 활성화를 막는 기능 게이트
KAIROS는 영구적이고 항상 켜져 있는 에이전트 어시스턴트에 대한 Anthropic의 답변으로 보입니다. /dream skill은 특히 흥미로운데, 유휴 상태에서 메모리를 처리하고 통합하는 모델을 암시하기 때문입니다. 이는 수면 중 인간 기억의 통합 방식과 유사합니다.
기능 게이트가 활성화를 막고 있으며, Anthropic는 KAIROS를 출시하지 않았습니다. 하지만 소스 내 존재는 방향을 시사합니다. Claude Code는 세션 기반 도구에서 영구적이고 백그라운드를 인식하는 에이전트로 진화하고 있습니다.
10. 컴패니언 펫 시스템
더 놀라운 발견 중 하나는 Claude Code에 컴패니언 펫 시스템이 포함되어 있다는 것입니다.1
각 펫은 결정론적으로 사용자 ID 해시에서 Mulberry32를 사용해 도출되며, 소스에서는 “오리를 고르기에 충분한” 수준으로 묘사됩니다. 각 펫은 5개의 스탯(DEBUGGING, PATIENCE, CHAOS, WISDOM, SNARK)과 희귀도 등급을 가집니다.
| 희귀도 | 확률 |
|---|---|
| Common | 60% |
| Uncommon | 25% |
| Rare | 10% |
| Epic | 4% |
| Legendary | 1% |
이 시스템은 펫을 3프레임 애니메이션이 있는 5x12 ASCII 스프라이트로 렌더링합니다. 소스는 종 코드네임을 16진수로 인코딩합니다. 한 종의 코드네임이 미출시 모델명과 충돌하기 때문입니다.
컴패니언 시스템은 농담 기능이 아닙니다. 유지(리텐션) 메커니즘입니다. 결정론적 할당은 여러분의 펫이 항상 같다는 것을 의미하며, 이는 애착을 형성합니다. 희귀도 시스템은 사회적 화폐를 만듭니다. ASCII 렌더링은 성능 오버헤드가 제로임을 의미합니다. Anthropic는 잘 설계된 참여 시스템을 개발자 도구 안에 숨겨 두었습니다.
11. 포크 폭탄
한 커뮤니티 사건은 후크 시스템의 위험을 보여줍니다.5 한 개발자가 2개의 Claude Code 인스턴스를 생성하는 SessionStart 후크를 만들었습니다. 각 생성된 인스턴스는 후크를 다시 트리거했으며, 지수적 성장을 만들어 냈습니다. 1 → 2 → 4 → 8 → 16 → 2^N.
아침이 되자 수백 개의 Claude Code 인스턴스가 동시에 실행되고 있었습니다. 시스템은 아이러니한 메커니즘을 통해 막대한 API 청구서를 피했습니다. 각 인스턴스의 메모리 소비(Bun, React, TUI)가 청구가 걷잡을 수 없이 커지기 전에 머신을 잠가 버린 것입니다.
후크 빌더를 위한 교훈: SessionStart 후크는 멱등(idempotent)이어야 합니다. 후크가 프로세스를 생성한다면, 그 프로세스는 같은 후크를 트리거해서는 안 됩니다. 가드 변수, 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. Auto 모드 아키텍처: 분류기 기반 권한 시스템, 회로 차단기 임계값. ↩
-
Claude Code Fork Bomb Incident. 2026년 3월. SessionStart 후크 지수적 생성, 메모리 고갈로 구제됨. ↩