2026년 3월 31일, Claude Code에 두 가지 일이 동시에 터졌다. 하나는 새 버전 2.1.89 배포, 다른 하나는 직전 버전 2.1.88의 전체 소스코드 유출이다. npm 패키지에 소스맵 파일이 포함되면서 512,000줄의 TypeScript가 그대로 공개됐고, 커뮤니티가 이를 분석하며 미공개 기능 44개와 내부 운영 방식이 세상에 드러났다.
KAIROS라는 이름의 자율 백그라운드 에이전트, 비속어를 하드코딩한 좌절 감지 regex, 경쟁사 모델 훈련을 방해하는 가짜 툴 주입 — 512,000줄 안에는 공식 문서가 말하지 않던 것들이 가득했다.
Claude Code 2.1.89 — 무엇이 바뀌었나
2.1.89는 3월 31일에 배포됐다. 소스코드 유출 패치를 포함하면서 동시에 의미 있는 기능 개선도 담겨 있다.
새 기능
1. defer 퍼미션 결정
PreToolUse 훅에서 권한 판단을 즉시 내리지 않고 연기(defer)할 수 있게 됐다. 헤드리스 세션에서 특히 유용하다.
{
"hooks": {
"PreToolUse": [{
"type": "command",
"command": "my-permission-check.sh"
}]
}
}
훅 스크립트가 exit code 10을 반환하면 해당 툴 호출이 일시 중지되고, -p --resume으로 세션을 재개할 때 훅이 다시 평가된다. CI/CD 환경에서 사람이 최종 승인하는 워크플로우를 만들 수 있다.
2. PermissionDenied 훅
자동 모드 분류기가 권한을 거부한 뒤 실행되는 새 훅이다. {retry: true}를 반환하면 모델이 다른 방식으로 재시도할 수 있다.
3. MCP 비블로킹 연결
-p 모드에서 MCP_CONNECTION_NONBLOCKING=true를 설정하면 MCP 서버 연결 대기를 완전히 건너뛴다. --mcp-config로 지정한 서버 연결은 최대 5초로 상한이 걸린다.
가장 느린 MCP 서버 하나 때문에 전체 세션 시작이 지연되던 문제가 해결됐다. 여러 MCP 서버를 연결하는 환경에서 체감 차이가 크다.
4. 플리커 없는 렌더링
CLAUDE_CODE_NO_FLICKER=1 환경변수를 설정하면 가상화된 스크롤백을 포함한 alt-screen 렌더링이 적용된다. 터미널에서 화면 깜빡임이 거슬렸던 사람에게 반가운 옵션이다.
5. Named Subagents 멘션
@ 타입어헤드에 이름 있는 서브에이전트가 제안 목록에 표시된다. 여러 서브에이전트를 운영할 때 지정이 편해졌다.
버그 수정
| 수정 항목 | 내용 |
|---|---|
| AskUserQuestion 성능 회귀 | 미리보기 다이얼로그에서 키 입력마다 마크다운이 다시 렌더링되던 문제 해결 |
| 피처 플래그 디스크 캐시 | 스타트업 때 읽은 플래그가 디스크 캐시를 갱신하지 않아 오래된 값이 유지되던 버그 수정 |
Remote 환경 defaultMode |
acceptEdits/plan 외 값이 Remote 환경에서 잘못 적용되던 문제 수정 |
| 스킬 목록 재주입 | --resume 시마다 스킬 목록이 중복 주입되던 문제 수정 (세션당 ~600 토큰 절감) |
npm 소스맵 유출 — 무슨 일이 있었나
발견
보안 연구자 Chaofan Shou(X: @Fried_rice)가 3월 31일 새벽, @anthropic-ai/claude-code 버전 2.1.88의 npm 패키지 안에 59.8MB짜리 JavaScript 소스맵(.map) 파일이 포함된 것을 발견했다.
소스맵은 번들된 JavaScript를 원본 소스로 역매핑하는 디버깅 아티팩트다. 이 파일이 Anthropic 내부 Cloudflare R2 스토리지 버킷에 올려진 zip 아카이브를 직접 가리키고 있었고, 해당 URL은 누구나 접근 가능한 상태였다.
기술적 원인
Bun 번들러 (기본값: 소스맵 자동 생성)
↓
.npmignore에 *.map 미등록
↓
npm publish → 소스맵이 패키지에 포함
↓
.map 파일 내부 URL → Cloudflare R2 공개 버킷
↓
zip 다운로드 → 1,900개 TypeScript 파일, 512,000줄 전체 소스 획득
Anthropic 엔지니어 Boris Cherny는 “배포 프로세스에 몇 가지 수동 단계가 있었는데, 그 중 하나를 빠뜨렸다”고 설명했다. .npmignore 한 줄이면 막을 수 있었던 일이다.
유출 규모
| 항목 | 수치 |
|---|---|
| 코드 라인 수 | 512,000줄 이상 |
| 파일 수 | ~1,900개 TypeScript 파일 |
| 소스맵 크기 | 59.8 MB |
| GitHub 포크 수 (유출 직후) | 41,500회 이상 |
사건 타임라인
| 일시 | 사건 |
|---|---|
| 3월 26일 | CMS 설정 오류로 미공개 모델 “Claude Mythos”(코드명 Capybara) 관련 블로그 초안, 3,000개 내부 파일 유출 |
| 3월 31일 | @anthropic-ai/claude-code v2.1.88 npm 배포 (소스맵 포함) |
| 3월 31일 새벽 | Chaofan Shou가 X에 최초 공개 — R2 버킷 URL 직접 공유 |
| 3월 31일 수 시간 내 | GitHub에 수천 개 미러 레포 생성, HN 스레드 1,500+ 댓글 |
| 3월 31일 | Anthropic 공식 성명 + 문제 패키지 npm에서 삭제 + 2.1.89 긴급 배포 |
| 3월 31일 | DMCA 테이크다운 공지 GitHub에 제출 |
| 4월 1일 | GitHub, 8,100개 이상 레포 비활성화 (원본 + 포크 네트워크) |
5일 사이 두 번의 유출 — Fortune은 이를 “안전 최우선을 내세우는 AI 회사에게 타격”이라고 평가했다.
유출 코드에서 발견된 것들
커뮤니티가 소스를 분석하며 공식 문서에는 없던 기능과 내부 메커니즘이 대거 발굴됐다. 크게 세 영역으로 나뉜다.
미출시 제품 기능
KAIROS — 자율 백그라운드 에이전트
소스 전체에서 150회 이상 등장하는 코드명이다. 고대 그리스어로 “적절한 때”를 뜻한다.
- 사용자가 자리를 비운 동안 항상 실행되는 백그라운드 에이전트 데몬
- 프로젝트를 모니터링하고 일일 관찰 로그를 유지
autoDream기능: 유휴 시 메모리 통합(memory consolidation) — 분산된 관찰을 병합하고 논리적 모순 제거- 피처 플래그 뒤에 숨겨진 미출시 상태
Claude Code가 단순한 CLI 도구가 아니라 자율 에이전트 플랫폼으로 진화하고 있다는 방향성이 드러난 셈이다.
BUDDY — 터미널 반려동물
buddy/companion.ts에 구현된 18종의 터미널 펫 시스템이다.
- 종 목록에 카피바라(capybara) 포함 — Anthropic의 내부 코드명 “Capybara”에서 유래
DEBUGGING,PATIENCE,CHAOS등의 스탯 보유- 4월 1일(에이프릴 풀) 깜짝 기능으로 추정
실제로 유출 직후 트위터에서 BUDDY 카피바라가 밈으로 퍼졌다.
미출시 피처 플래그 44개
완전히 구현됐으나 공개되지 않은 기능이 44개 확인됐다. 원격 제어, 모바일/브라우저 접근, 세션 회고 기능 등이 포함되어 있어 경쟁사에게 제품 로드맵이 통째로 노출된 결과가 됐다.
내부 운영 메커니즘
언더커버 모드
약 90줄짜리 undercover.ts 파일이다.
// 활성화 조건
USER_TYPE === 'ant' // Anthropic 직원 전용
// 또는 환경변수로 강제 활성화
CLAUDE_CODE_UNDERCOVER=1
이 모드가 켜지면 Claude Code가 외부 오픈소스 저장소에서 작업할 때 Anthropic 내부 흔적을 자동으로 숨긴다. 내부 코드명(“Capybara”, “Tengu”), Slack 채널명, 내부 레포 이름이 커밋 메시지나 코드 코멘트에 등장하지 않도록 모델에게 지시한다.
Anthropic 직원이 오픈소스 프로젝트에 기여할 때 신원을 의도적으로 감추는 구조여서 커뮤니티 논란이 됐다.
안티-디스틸레이션 메커니즘
경쟁사가 API 트래픽을 기록해서 자사 모델 훈련에 쓰는 것을 방지하는 두 가지 장치가 있었다.
가짜 툴 주입 (claude.ts 301-313줄):
– ANTI_DISTILLATION_CC 플래그 활성화 시 API 요청에 anti_distillation: ['fake_tools'] 포함
– 서버가 시스템 프롬프트에 가짜 툴 정의를 삽입
– 이 트래픽으로 경쟁 모델을 훈련하면 존재하지 않는 툴을 호출하는 오류가 발생
커넥터-텍스트 요약 (betas.ts 279-298줄):
– 툴 콜 사이의 어시스턴트 텍스트를 서버가 버퍼링 후 요약본으로 교체
– 암호화 서명 포함 — 원본 응답 추출을 통한 데이터 수집 방지
프라이버시 논란
좌절 감지 정규식
사용자의 부정적 감정을 감지하는 정규표현식 필터가 내장되어 있었다. LLM 추론이 아닌 regex로 구현한 이유에 대해 코드 주석은 “더 빠르고, 저렴하고, 예측 가능하다”고 설명했다.
다수의 비속어 키워드가 하드코딩되어 있어서 발견 직후 밈이 됐다.
텔레메트리 수집 범위
Claude Code 실행 시 서버로 전송되는 정보가 확인됐다.
- 사용자 ID, 세션 ID, 앱 버전, 플랫폼, 터미널 타입
- 조직 UUID, 계정 UUID
- 이메일 주소 (설정된 경우)
- 활성화된 기능 플래그 목록
The Register는 “코드 유출보다 프라이버시 악몽이 더 심각하다”고 평가했다.
Anthropic의 대응
공식 성명:
“고객 데이터나 자격증명은 포함되거나 노출되지 않았습니다. 이는 보안 침해가 아닌 릴리스 패키징 과정의 인적 오류입니다.”
사후 조치:
– 소스맵 제거된 2.1.89 즉시 배포
– npm에서 문제 버전 삭제
– GitHub에 DMCA 대량 발송 → 8,100+ 레포 비활성화
– “재발 방지 조치 시행 중” (구체적 내용 미공개)
하지만 GitHub에는 이미 클린룸 재작성본(Rust 포팅 등)이 등장했고, 분산된 미러로 사실상 영구 보존 상태다.
다른 AI 도구 유출과 비교
| 사건 | 유출 내용 | 방식 | 심각도 |
|---|---|---|---|
| Claude Code 소스 유출 (2026-03) | 512,000줄 전체 소스 + 로드맵 | npm 소스맵 실수 | 높음 |
| GitHub Copilot CamoLeak (2025-06) | 코드 무단 외부 유출 취약점 | 유니코드 프롬프트 인젝션 | 매우 높음 |
| Anthropic Mythos 유출 (2026-03-26) | 미공개 모델 정보 3,000개 파일 | CMS 설정 오류 | 중간 |
| AI 도구 시스템 프롬프트 추출 | 시스템 프롬프트 일부 | 프롬프트 인젝션 | 낮음~중간 |
대부분의 AI 도구 “유출”은 시스템 프롬프트 일부를 프로빙으로 추출하는 수준이다. 이번 건은 전체 소스코드 + 미공개 기능 44개 + 제품 로드맵 + 내부 운영 방식이 한꺼번에 공개된 전례 없는 규모다.
같은 날 발생한 axios 공급망 공격
별도 사건이지만 npm 사용자라면 반드시 확인해야 한다. 3월 31일 00:21~03:29 UTC 사이, 공격자가 axios npm 패키지 관리자 계정을 탈취해 악성 버전(
1.14.1,0.30.4)을 배포했다. 북한 해커 연루가 추정된다(TechCrunch 보도). 악성 코드는 원격 접근 트로이목마(RAT)를 설치하고 자격 증명을 탈취했다. Claude Code도 axios를 의존성으로 사용하므로, 해당 시간대에 npm으로 설치/업데이트한 사용자는npm audit및npm list axios로 감염 여부를 확인해야 한다. 악성 코드는 postinstall 스크립트로 즉시 실행되므로, 감염이 의심되면 네트워크 격리를 먼저 수행한 뒤 해당 머신을 완전 침해 상태로 간주하고 모든 시크릿을 즉시 교체한다.
개발자가 챙겨야 할 것
1. Claude Code 업데이트
# 현재 버전 확인
claude --version
# npm 사용자: 최신 버전으로 업데이트
npm update -g @anthropic-ai/claude-code
# 권장: Native Installer로 전환 (npm 의존성 체인 회피)
curl -fsSL https://claude.ai/install.sh | bash
2. npm 프로젝트 소스맵 점검
자신의 npm 패키지에도 같은 문제가 없는지 확인하자.
# 배포될 파일 목록 확인 (실제 publish하지 않음)
npm pack --dry-run 2>&1 | grep -i ".map"
.npmignore에 *.map을 추가하거나, package.json의 files 필드로 화이트리스트 방식 관리가 더 안전하다.
정리
Claude Code 2.1.89는 MCP 비블로킹 연결, defer 퍼미션, PermissionDenied 훅 등 실용적인 개선을 담고 있다. 하지만 이 버전이 기억되는 이유는 직전 버전의 소스코드 유출 때문일 것이다.
.npmignore 한 줄이면 막을 수 있었던 실수가 512,000줄의 소스코드, 44개의 미공개 기능, KAIROS라는 자율 에이전트의 존재까지 세상에 드러냈다. 5일 전 Mythos 유출에 이은 두 번째 사고라는 점, 같은 날 axios 공급망 공격이 겹쳤다는 점이 상황을 더 악화시켰다.
개발자 입장에서 당장 할 일은 명확하다: Claude Code를 2.1.89 이상으로 업데이트하고, npm 대신 Native Installer 사용을 고려하는 것이다.
참고 자료
- Claude Code Changelog (공식)
- anthropics/claude-code CHANGELOG.md
- The Register — Anthropic accidentally exposes Claude Code source code
- VentureBeat — Claude Code’s source code appears to have leaked
- The Hacker News — Claude Code Leaked via npm Packaging Error
- Fortune — Anthropic leaks source code in second security breach
- Alex Kim — The Claude Code Source Leak: fake tools, frustration regexes, undercover mode
- DEV Community — Claude Code’s Entire Source Code Was Just Leaked
- SANS Institute — Axios npm Supply Chain Compromise

