---
title: "Claude Code 소스코드 통째로 유출 -- 가짜 도구 주입, AI 위장 모드, Zig 레벨 DRM까지 전부 까발려짐"
published: 2026-03-31T13:04:30.000Z
canonical: https://jeff.news/article/1449
---
# Claude Code 소스코드 통째로 유출 -- 가짜 도구 주입, AI 위장 모드, Zig 레벨 DRM까지 전부 까발려짐

Anthropic이 npm 패키지에 .map 파일을 포함시켜 Claude Code 전체 소스코드가 유출됨. anti-distillation용 가짜 도구 주입, AI임을 숨기는 undercover 모드, Zig 레벨 네이티브 클라이언트 인증, 미공개 자율 에이전트 모드 KAIROS 등 내부 구현 전체가 공개됨. Bun의 알려진 버그가 유출 원인으로 추정되며, 코드보다 피처 플래그를 통한 제품 로드맵 노출이 더 큰 피해임.

Anthropic이 npm 패키지에 `.map` 파일을 포함시켜 배포하는 바람에 Claude Code의 전체 소스코드가 유출됨. 일주일 전 모델 스펙 유출에 이어 두 번째 사고임. HN과 트위터에서 대규모로 분석이 진행됨.

## Anti-Distillation: 가짜 도구 주입

- Claude Code가 API 요청에 `anti_distillation: ['fake_tools']` 플래그를 보내면, 서버가 시스템 프롬프트에 **가짜 tool 정의를 몰래 삽입**함
  - 목적: API 트래픽을 녹화해서 경쟁 모델 학습에 쓰는 걸 방지 (가짜 도구가 학습 데이터를 오염시킴)
  - GrowthBook 피처 플래그(`tengu_anti_distill_fake_tool_injection`)로 게이팅되어 있고, 1st-party CLI 세션에서만 활성화됨
- 두 번째 메커니즘: **connector-text summarization** (서버 사이드)
  - tool call 사이의 어시스턴트 텍스트를 요약 + 암호화 서명으로 대체함
  - API 트래픽 녹화자는 요약본만 얻고, 전체 reasoning chain은 못 봄
- 우회 난이도: **매우 낮음**
  - MITM 프록시로 `anti_distillation` 필드 제거하면 끝
  - `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS` 환경변수 설정으로도 비활성화 가능
  - 3rd-party API provider나 SDK 엔트리포인트에서는 아예 체크 안 함

> [!WARNING]
> 기술적 보호는 사실상 무의미함. 소스코드를 1시간만 읽으면 우회 방법을 전부 찾을 수 있음. 진짜 보호는 법적 수단(legal threat)뿐임.

## Undercover 모드: AI가 AI인 걸 숨김

- `undercover.ts`가 외부 레포에서 Anthropic 내부 흔적을 전부 제거함
  - 내부 코드네임("Capybara", "Tengu"), 슬랙 채널, "Claude Code"라는 문구 자체를 언급하지 않도록 모델에 지시
  - `CLAUDE_CODE_UNDERCOVER=1`로 강제 ON 가능하지만, **강제 OFF는 불가능** ("one-way door")
- 의미: Anthropic 직원이 오픈소스 프로젝트에 기여할 때, AI가 작성했다는 표시가 전혀 없음
  - 내부 코드네임 숨기는 건 합리적이지만, AI가 적극적으로 사람인 척하는 건 다른 문제임

## Native Client Attestation: JS 런타임 아래의 DRM

- API 요청에 `cch=00000` 플레이스홀더가 포함됨
  - Bun의 네이티브 HTTP 스택(Zig로 작성)이 요청 전송 직전에 5자리 해시로 덮어씀
  - 서버가 해시를 검증해서 **진짜 Claude Code 바이너리인지 확인**함
- 같은 길이의 플레이스홀더를 쓰는 이유: Content-Length 헤더 변경이나 버퍼 재할당 방지
- **OpenCode 법적 분쟁의 기술적 근거**가 바로 이것임
  - Anthropic은 단순히 "쓰지 마세요"가 아니라, 바이너리 레벨에서 클라이언트 인증을 강제함
- 역시 완벽하지는 않음
  - compile-time 플래그, 환경변수, GrowthBook killswitch로 비활성화 가능
  - stock Bun이나 Node에서 JS 번들을 직접 돌리면 해시 교체가 안 됨

## 매일 25만 건의 낭비된 API 호출

- `autoCompact.ts`의 코드 주석에서 발견됨:
  - 1,279개 세션에서 50회 이상 연속 실패 (최대 3,272회), **하루 약 25만 건 API 호출 낭비**
  - 수정: `MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3` -- 3줄 코드로 해결

> [!NOTE]
> 3줄짜리 상수 하나로 하루 25만 건의 API 호출 낭비를 막음. 실서비스에서 경계값 하나의 부재가 얼마나 큰 비용을 만드는지 보여주는 사례임.

## KAIROS: 미공개 자율 에이전트 모드

- 코드베이스 전반에 피처 플래그로 게이팅된 `KAIROS` 모드 발견됨
  - `/dream` 스킬: "nightly memory distillation" (야간 메모리 증류)
  - daily append-only 로그
  - GitHub webhook 구독
  - 백그라운드 데몬 워커
  - 5분 간격 cron 스케줄 리프레시
- 항시 가동되는 백그라운드 에이전트의 스캐폴딩이 존재함 -- **제품 로드맵의 최대 유출**

## 기타 발견 사항

- **욕설 감지를 정규식으로 처리함** (`userPromptKeywords.ts`)
  - LLM 회사가 감정 분석에 regex를 쓰는 건 아이러니하지만, LLM 추론 한 번 호출보다 훨씬 빠르고 저렴함
- **만우절 이스터에그**: `buddy/companion.ts`에 다마고치 스타일 컴패니언 시스템 구현
  - 18종 생물, 레어리티 티어, 1% 샤이니 확률, DEBUGGING/SNARK 같은 RPG 스탯
- **터미널 렌더링**: 게임 엔진 기법 차용
  - Int32Array 기반 ASCII char pool, bitmask 스타일 메타데이터, 패치 옵티마이저
  - token streaming 시 `stringWidth` 호출 약 50배 감소
- **Bash 보안**: `bashSecurity.ts`에 23개 번호 매겨진 보안 체크
  - Zsh 빌트인 18개 차단, zero-width space 주입, IFS null-byte 주입, HackerOne에서 발견된 토큰 우회 방어
- **프롬프트 캐시 경제학**: `promptCacheBreakDetection.ts`가 14개 cache-break 벡터 추적
  - `DANGEROUS_uncachedSystemPromptSection()`이라는 함수명이 존재함
- **멀티 에이전트 코디네이터**: 오케스트레이션이 코드가 아닌 프롬프트로 구현됨
  - "약한 작업을 그냥 승인하지 마라", "이해하기 전에 다른 워커에게 넘기지 마라" 같은 지시
- **코드 품질 문제**: `print.ts`가 5,594줄, 단일 함수 3,167줄에 12단계 중첩

## 핵심 시사점

- Google Gemini CLI, OpenAI Codex는 에이전트 SDK(toolkit)를 오픈소스한 것이고, 이번 건은 **플래그십 제품의 내부 배선 전체**가 유출된 것임
- 진짜 피해는 코드가 아니라 **피처 플래그**(KAIROS, anti-distillation 등)임 -- 경쟁사가 제품 로드맵을 볼 수 있게 됨
- 유출 원인으로 추정되는 Bun 버그(`oven-sh/bun#28001`): production 모드에서도 source map이 서빙됨
  - Anthropic이 작년 말 Bun을 인수했고, 자사 툴체인의 알려진 버그가 자사 제품 소스를 유출시킨 꼴

---

## 기술 맥락

- **Anti-distillation이 일부러 느슨한 이유가 있어요.** fake tool 주입이나 connector-text summarization 모두 기술적으로 우회가 가능한 구조거든요. 이건 의도된 설계일 수 있어요. 완벽한 기술적 보호보다는 "캐주얼한 distillation"만 막고, 진짜 악의적인 시도는 법적 수단으로 대응하겠다는 전략이에요
- **Native attestation이 Zig 레벨인 이유가 있어요.** JS 런타임 위에서 동작하는 코드는 뭘 해도 HTTP 요청을 가로챌 수 없거든요. Bun의 Zig 네이티브 스택에서 해시를 삽입하면 JS 레이어의 어떤 코드도 이걸 조작할 수 없어요. 다만 이게 Bun 바이너리에 종속되어 있어서, stock Bun이나 Node에서 돌리면 무력화된다는 한계가 있어요
- **프롬프트 캐시가 아키텍처를 지배하는 구조예요.** 14개 cache-break 벡터를 추적하고, 모드 전환 시 "sticky latch"로 캐시 무효화를 막는 건, token 단가가 설계 결정을 직접 좌우한다는 뜻이에요. `DANGEROUS_uncachedSystemPromptSection()`이라는 함수명이 이 비용의 심각성을 잘 보여주고 있어요
- **멀티 에이전트 오케스트레이션을 코드가 아니라 프롬프트로 구현했어요.** 코디네이터가 워커를 관리하는 로직이 자연어 지시문이거든요. "약한 작업을 승인하지 마라", "이해하기 전에 넘기지 마라" 같은 식이에요. 에이전트 시스템에서 오케스트레이션 레이어를 어디에 둘 것인가에 대한 Anthropic의 답변이라고 볼 수 있어요
- **25만 건/일 API 낭비는 경계값 하나의 부재 때문이었어요.** `MAX_CONSECUTIVE_FAILURES` 상수 하나만 있었으면 막을 수 있던 문제거든요. 실서비스에서 에이전트를 운영하는 팀이라면 이런 패턴을 꼭 참고하면 좋겠어요

## 핵심 포인트

- API 요청에 가짜 tool 정의를 주입하는 anti-distillation 메커니즘 발견 -- 기술적 우회는 쉬움
- undercover 모드로 Anthropic 직원의 오픈소스 기여 시 AI 작성 사실을 숨김
- Bun(Zig) 네이티브 HTTP 스택에서 클라이언트 해시를 삽입하는 DRM 방식 API 인증 구현
- 미공개 자율 에이전트 KAIROS: 백그라운드 데몬, 메모리 증류, cron 스케줄 등 스캐폴딩 존재
- autoCompact 3줄 수정으로 하루 25만 건 API 호출 낭비 해결
- 23개 bash 보안 체크, 14개 프롬프트 캐시 break 벡터 추적 등 깊은 엔지니어링 발견

## 인사이트

진짜 피해는 코드 유출이 아니라 피처 플래그를 통한 제품 로드맵 노출임. KAIROS, anti-distillation 같은 전략적 방향이 경쟁사에 공개된 건 리팩토링으로 되돌릴 수 없음.
