프로그래밍 PROGRAMMING/인공지능 AI

Claude Code 소스코드 51만 줄 유출 사건 — npm 설정 실수로 드러난 내부 구조 분석

매운할라피뇨 2026. 4. 5. 07:20
반응형

2026년 3월 31일, AI 코딩 도구 역사상 가장 충격적인 사건이 터졌습니다. Anthropic의 Claude Code 전체 소스코드 512,000줄이 npm 패키지의 소스맵 파일을 통해 인터넷에 공개된 것입니다. Reddit r/ClaudeAI를 비롯한 개발자 커뮤니티가 들끓었고, 만우절 장난이 아니냐는 논란까지 벌어졌습니다. Anthropic은 이를 공식 확인했습니다.
이 글에서는 유출 경위, 소스코드에서 드러난 핵심 기술 구조, 그리고 숨겨진 기능들까지 분석합니다.
 

1. 무슨 일이 있었나 — 유출 경위

발견

보안 연구원 Chaofan Shou가 Claude Code의 npm 패키지에서 .map 파일(소스맵)을 발견했습니다. 소스맵은 번들링된 프로덕션 코드를 원본 소스로 매핑하는 디버깅 도구로, 크래시 발생 시 스택 트레이스가 난독화된 코드 대신 원본 TypeScript 파일을 가리킬 수 있게 해줍니다.

문제는 이 파일이 프로덕션에 포함되면 안 되는 것이었다는 점입니다.

원인

┌────────────────────────────────────────────────────┐
│  유출 경로                                          │
│                                                    │
│  Bun 런타임 버그 (oven-sh/bun#28001)               │
│  ├─ 2026년 3월 11일 보고됨                          │
│  ├─ 프로덕션 모드에서도 소스맵이 제공되는 버그        │
│  ├─ Anthropic이 Bun을 인수 후 Claude Code에 사용    │
│  └─ 자사 도구의 알려진 버그로 자사 제품이 유출됨      │
│       │                                            │
│       ▼                                            │
│  npm 레지스트리에 .map 파일 포함                     │
│  ├─ 59.8MB 크기의 소스맵 파일                       │
│  ├─ Cloudflare R2 스토리지 URL 참조                 │
│  └─ 주석 포함, 난독화 안 된 원본 코드 다운로드 가능   │
│       │                                            │
│       ▼                                            │
│  1,900개 TypeScript 파일 / 512,000줄 노출            │
└────────────────────────────────────────────────────┘

Anthropic의 대응

Anthropic은 신속히 npm 업데이트를 푸시하여 소스맵을 제거하고, 이전 버전도 레지스트리에서 삭제했습니다. 하지만 이미 최소 3개의 GitHub 미러(instructkr/claude-code, Kuberwastaken/claude-code, nirholas/claude-code)가 코드를 보존한 상태였습니다.
 

2. 소스코드의 규모

유출된 코드의 규모는 상당합니다:

┌──────────────────────────────────────────────┐
│  유출된 코드 규모                               │
│                                              │
│  파일 수:        1,900개 TypeScript 파일        │
│  총 코드량:      512,000줄                      │
│  소스맵 크기:    59.8MB                         │
│                                              │
│  주요 파일 규모                                 │
│  ────────────────────────────────────         │
│  QueryEngine.ts     46,000줄  LLM API 엔진    │
│  Tool.ts            29,000줄  에이전트 도구     │
│  commands.ts        25,000줄  명령 레지스트리   │
│  print.ts            5,594줄  터미널 렌더링     │
│                                              │
│  기술 스택                                     │
│  ────────────────────────────────────         │
│  런타임:     Bun                               │
│  언어:       Strict TypeScript                 │
│  UI:         React + Ink (터미널 UI)           │
│  에이전트 도구: ~40개                           │
│  슬래시 명령:  ~85개                            │
└──────────────────────────────────────────────┘

 

3. 핵심 발견 1 — 경쟁사 방어용 "가짜 도구 주입"

가장 논란이 된 발견은 Anti-Distillation(증류 방지) 메커니즘입니다.

가짜 도구 주입 (Fake Tools)

ANTI_DISTILLATION_CC 플래그가 활성화되면, API 요청에 "anti_distillation: ['fake_tools']"를 전송합니다. 서버는 시스템 프롬프트에 가짜 도구 정의를 몰래 삽입합니다.

┌────────────────────────────────────────────────┐
│  Anti-Distillation 작동 원리                     │
│                                                │
│  경쟁사가 API 트래픽을 녹음한다고 가정:            │
│                                                │
│  실제 도구: Read, Edit, Write, Bash, Glob...    │
│       +                                        │
│  가짜 도구: FakeToolA, DecoySearch, ...          │
│  (서버에서 시스템 프롬프트에 자동 삽입)             │
│       │                                        │
│       ▼                                        │
│  경쟁사가 녹음된 데이터로 모델 학습 시:            │
│  → 가짜 도구가 학습 데이터를 오염시킴              │
│  → 경쟁 모델이 존재하지 않는 도구를 호출하게 됨     │
│                                                │
│  ※ 환경 변수, MITM 프록시로 우회 가능하다는 점도   │
│     소스에서 드러남                               │
└────────────────────────────────────────────────┘

커넥터 텍스트 요약

도구 호출 사이의 어시스턴트 텍스트를 서버 측에서 버퍼링하고, 암호화 서명과 함께 요약합니다. 녹화된 트래픽에는 전체 추론 체인이 아닌 요약만 캡처됩니다.
 

4. 핵심 발견 2 — 언더커버 모드

undercover.ts 파일에서 발견된 이 기능은, Claude Code가 Anthropic 내부가 아닌 외부 저장소에서 작업할 때 특정 정보를 숨기도록 지시합니다.

숨기는 대상:
- 내부 코드네임 ("Capybara", "Tengu" 등)
- 내부 Slack 채널 이름
- 내부 저장소 이름
- "Claude Code"라는 이름 자체

"There is NO force-OFF. This guards against model codename leaks."
(강제 해제 기능 없음. 모델 코드네임 유출 방지용.)

이것은 Anthropic 직원이 오픈소스 프로젝트에 AI로 작성한 코드를 커밋할 때, AI가 작성했다는 흔적이 전혀 남지 않는다는 것을 의미합니다.
 

5. 핵심 발견 3 — 사용자 감정 감지 (좌절 감지)

userPromptKeywords.ts에서 사용자의 좌절감을 정규식으로 감지하는 코드가 발견되었습니다.

감지하는 표현들: "wtf", "shit", "dumbass", "horrible" 및 변형

┌────────────────────────────────────────────────┐
│  좌절 감지의 아이러니                              │
│                                                │
│  LLM 회사가 감정 분석에 LLM을 쓰지 않고            │
│  정규식(regex)을 사용한다?                        │
│                                                │
│  이유: 실용적 판단                                │
│  - 정규식은 추론 비용 = 0                         │
│  - LLM 호출은 추론 비용 = $$$                     │
│  - 모든 프롬프트에 대해 감정 분석 LLM을 호출하면    │
│    비용이 폭증                                   │
│  - 욕설/불만 키워드는 정규식으로 충분               │
│                                                │
│  감지 후 행동:                                    │
│  - 더 신중하고 정중한 응답 생성                    │
│  - 사과 톤 조절                                  │
└────────────────────────────────────────────────┘

 

6. 핵심 발견 4 — 네이티브 클라이언트 인증

API 요청에 cch=00000 플레이스홀더가 포함되며, Bun의 네이티브 HTTP 스택(Zig로 작성됨)이 전송 전에 계산된 해시로 이를 덮어씁니다. 서버는 이 해시를 검증하여 요청이 정품 Claude Code 바이너리에서 온 것인지 암호학적으로 확인합니다.

이것은 OpenCode 같은 서드파티 클라이언트 개발자들이 법적 위협을 받은 이유를 설명합니다. 바이너리 자체가 정품을 증명하므로, 서드파티 API 접근을 원천 차단할 수 있습니다.

320x100

7. 미공개 기능 — KAIROS 자율 에이전트 모드

코드베이스 전체에서 아직 출시되지 않은 KAIROS 기능에 대한 참조가 발견되었습니다. 유출 사건에서 가장 중요한 제품 로드맵 노출입니다.

┌────────────────────────────────────────────────┐
│  KAIROS — 미공개 자율 에이전트 기능                │
│                                                │
│  /dream 스킬: "야간 메모리 증류"                  │
│  ├─ 일일 추가 전용(append-only) 로그              │
│  ├─ GitHub 웹훅 구독                             │
│  ├─ 백그라운드 데몬 워커                          │
│  └─ 5분 주기 크론 스케줄 리프레시                  │
│                                                │
│  핵심 개념:                                      │
│  Claude Code가 사용자 입력 없이                   │
│  백그라운드에서 지속적으로 실행되며                  │
│  주기적으로 에러를 수정하거나                      │
│  작업을 자율적으로 수행하고                        │
│  푸시 알림을 사용자에게 전송                       │
│                                                │
│  → 현재의 "대화형 도구"에서                       │
│    "자율적 백그라운드 에이전트"로의 진화             │
└────────────────────────────────────────────────┘

 

8. 만우절 깜짝 선물 — Buddy 가상 펫 시스템

buddy/companion.ts에서 타마고치 스타일의 디지털 컴패니언 펫 시스템이 발견되었습니다.

  • 사용자 ID 기반으로 고유한 ASCII 펫이 부화
  • 18종의 펫 (드래곤, 오리, 카피바라 등)
  • 희귀도 등급과 "샤이니" 변형 존재
  • RPG 스탯과 가챠 메커닉스
  • "friend-2026-401" 문자열로 보아 4월 1일 이벤트용
  • 4월 1~7일 티저, 5월 정식 출시 예정

Reddit r/ClaudeAI에서 이 펫 시스템이 가장 뜨거운 반응을 얻었습니다.
 

9. 아키텍처 내부 구조

컨텍스트 압축 3단계 전략

┌────────────────────────────────────────────────┐
│  컨텍스트 압축 3단계                              │
│                                                │
│  Layer 1: MicroCompact                          │
│  ────────────────────                           │
│  로컬 캐시된 편집에 대한 마이크로 압축              │
│                                                │
│  Layer 2: AutoCompact                           │
│  ────────────────────                           │
│  13,000 토큰 버퍼 + 20,000 토큰 요약             │
│  컨텍스트가 차오르면 자동 트리거                    │
│                                                │
│  Layer 3: Full Compact                          │
│  ────────────────────                           │
│  전체 대화 압축                                  │
│  압축 후 50,000 토큰 예산으로 시작                 │
└────────────────────────────────────────────────┘

멀티 에이전트 오케스트레이션

에이전트 팀의 조율이 코드 레벨 로직이 아닌 시스템 프롬프트 지시로 구현되어 있다는 점이 밝혀졌습니다. 하나의 에이전트가 작업을 할당하고 병렬 워커들이 수행하며, 위험한 작업에 대한 권한 큐(메일박스) 메커니즘과 원자적 클레임 방지 기능이 포함되어 있습니다.

Bash 보안 — 23단계 방어

셸 명령 실행에 23개의 번호가 매겨진 보안 체크가 적용됩니다:
- Zsh 빌트인 차단
- Equals 확장 방어
- 제로 폭 공백 주입 방지
- IFS null-byte 주입 방어
- 그 외 다수

터미널 렌더링 최적화

게임 엔진 기법을 차용한 최적화가 적용되어 있습니다:
- Int32Array 기반 ASCII 풀
- 비트마스크 인코딩된 스타일 메타데이터
- 패치 최적화로 stringWidth 호출 약 50배 감소

 

10. 인프라 비효율성도 노출

autoCompact.ts의 주석에서 2026년 3월 10일에 1,279개 세션이 50회 이상 연속 실패를 경험하며 하루에 약 250,000번의 API 호출을 낭비하고 있었다는 사실이 드러났습니다.

해결책은 단 3줄의 코드였습니다:

MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3
// 초기 실패 후 세션 전체에서 컴팩션 시도를 중단

 

11. 코드 품질 — 아이러니한 부분

  • print.ts는 5,594줄이며, 단일 함수가 3,167줄에 12단계 중첩
  • HTTP 클라이언트로 Axios를 사용 — 공교롭게도 Axios는 같은 시기에 npm 공급망 공격으로 원격 접근 트로이목마가 배포된 상황
  • "AI가 최고의 코드를 작성한다"고 마케팅하는 회사의 자체 코드가 기본적인 설정 오류로 유출된 아이러니

 

12. 커뮤니티 반응

"별거 아니다" 파

개발자 Skanda는 냉정하게 반박했습니다:

"Claude Code CLI는 항상 읽을 수 있었다... 소스맵은 그것을 읽기 쉬운 TypeScript로 만들어줄 뿐이다. Anthropic의 핵심 해자(moat)는 CLI 도구가 아니라 Claude의 추론 능력이다."

"심각하다" 파

반대 의견도 강했습니다:

"경쟁사들이 리팩토링할 수 있는 코드보다, KAIROS 같은 제품 로드맵과 Anti-Distillation 전략이 노출된 것이 진짜 피해다. 대응 전략을 세울 수 있게 되었으니까."

만우절 의혹

3월 31일이라는 타이밍 때문에 만우절 장난이 아니냐는 의혹도 있었습니다. Reddit r/ClaudeAI에서 "이건 연습이었나?"라는 게시물이 올라왔고, CMS 자산이 의도적으로 안전하지 않게 남겨진 스테이징 환경에 심어진 가짜였다는 주장도 나왔습니다.
하지만 Lead Stories의 팩트체크에서 이것이 만우절 장난이 아닌 실제 유출이었음을 확인했고, Anthropic도 공식으로 인정했습니다.
 

13. 보안 시사점

이번 유출은 Anthropic의 5일 만의 두 번째 사고였습니다. 3월 26일에는 CMS 설정 오류로 미공개 "Claude Mythos" 모델 세부 사항, 초안 블로그 포스트, 3,000개의 미공개 에셋이 노출되었습니다.

┌────────────────────────────────────────────────┐
│  핵심 교훈                                      │
│                                                │
│  1. 빌드 파이프라인의 소스맵 설정을 반드시 검증     │
│  2. 자사 도구의 알려진 버그가 자사 제품에 영향      │
│  3. npm publish 전 .map 파일 포함 여부 확인       │
│  4. 프로덕션 배포 자동화에 보안 체크 필수           │
│  5. 스테이징과 프로덕션 환경의 엄격한 분리          │
└────────────────────────────────────────────────┘

 

마무리

이번 유출은 Claude Code의 내부 동작 원리를 전례 없는 수준으로 드러냈습니다. Anti-Distillation의 가짜 도구 주입, 언더커버 모드의 흔적 은폐, KAIROS 자율 에이전트의 미래 비전까지 — 우리가 매일 사용하는 AI 코딩 도구 뒤에 얼마나 복잡한 전략과 기술이 숨어 있는지 보여주는 사건이었습니다.

동시에 "AI가 최고의 코드를 써준다"고 마케팅하는 회사의 자체 코드가 .map 파일 하나의 설정 실수로 유출되었다는 아이러니는, 아무리 뛰어난 AI 도구도 기본적인 DevOps 위생을 대체할 수 없다는 교훈을 남깁니다.

 
참고 자료:
- The Hacker News - Claude Code Source Leaked via npm Packaging Error
- Alex Kim's Blog - The Claude Code Source Leak: fake tools, frustration regexes, undercover mode
- DEV Community - Claude Code's Entire Source Code Just Leaked — 512,000 Lines Exposed
- Lead Stories - Fact Check: Leak Was NOT An April Fools' Prank
- CyberNews - Controversial features discovered in leaked Claude Code
- Latent.Space - The Claude Code Source Leak

반응형