Claude Code 소스코드, NPM 레지스트리의 Source Map 파일을 통해 유출
Claude Code's source code has been leaked via a map file in their NPM registry
TL;DR Highlight
Claude Code의 NPM 패키지에 포함된 source map 파일이 소스코드와 함께 미공개 기능 로드맵 및 내부 보안 메커니즘을 외부에 노출했다.
Who Should Read
NPM 패키지를 배포하거나 유지보수하는 개발자, 그리고 AI 코딩 에이전트의 내부 아키텍처나 Anthropic의 제품 전략에 관심 있는 개발자.
Core Mechanics
- Claude Code의 NPM 패키지(@anthropic-ai/claude-code)에 번들된 JavaScript 파일과 함께 source map(.map) 파일이 같이 배포되면서 원본 TypeScript 소스코드가 그대로 노출됐다. Source map은 원래 디버깅용으로 압축된 JS 코드를 원본 코드로 역추적할 수 있게 해주는 파일인데, 이걸 프로덕션 패키지에 포함시킨 게 문제였다.
- Anthropic은 뒤늦게 해당 버전(v2.x)을 조치했는데, npm unpublish(실제로 버전 삭제)가 아닌 npm deprecate(삭제 없이 '폐기됨' 표시만)를 써서 패키지가 여전히 다운로드 가능한 상태로 남았다. 댓글에서는 이걸 두고 'Claude한테 unpublish 해달라고 했더니 deprecate를 해온 것 같은 느낌'이라며 풍자했다.
- 소스코드에서 미공개 기능들의 feature flag가 다수 발견됐다. 가장 주목받은 건 'kairos'라는 코드명의 'assistant mode', 타마고치 스타일의 ASCII 아트 가상 펫 시스템인 'Buddy System(/buddy)', 그리고 Anthropic 직원이 오픈소스 기여 시 내부 정보를 커밋/PR에서 제거하는 'Undercover mode'다.
- ANTI_DISTILLATION_CC라는 내부 플래그도 드러났다. 이 기능이 활성화되면 모든 API 요청에 anti_distillation: ['fake_tools']를 주입해서, 서버 측에서 가짜 tool 정의를 시스템 프롬프트에 몰래 삽입한다. 경쟁사가 Claude Code의 API 트래픽을 스크래핑해서 모델을 학습시키려는 시도(distillation)를 방해하기 위한 일종의 데이터 독살(data poisoning) 방어책이다.
- 사용자 프롬프트에서 부정적 감정이나 특정 키워드를 감지하는 정규식(regex)도 발견됐으며, 해당 내용은 로깅된다고 코드에 명시돼 있다. 이는 어떤 표현이 시스템에서 모니터링되는지를 외부에 노출시킨 셈이다.
- 소스코드 품질 면에서도 눈에 띄는 부분이 있었다. src/cli/print.ts 파일 내 특정 함수 하나가 3,167줄, 최대 12단계 중첩, cyclomatic complexity(코드 복잡도 지표) 약 486, 파라미터 12개+옵션 객체 16개 속성, 내부 함수 21개를 가지고 있으며, agent 루프·SIGINT 처리·AWS 인증·MCP 생명주기 등을 한 함수에서 모두 담당한다. 댓글에서는 '최소 8~10개 모듈로 분리해야 한다'고 지적했다.
- 이번이 처음이 아니라는 점도 지적됐다. 2025년 2월에도 비슷한 방식으로 Claude Code 소스가 노출된 적이 있으며, 당시에도 HN에서 화제가 됐다.
- Claude Code 내부에서 HTTP 요청에 Axios를 사용한다는 사실도 확인됐다. 공교롭게도 같은 날 HN에 Axios 관련 다른 글이 올라와 있어서, 두 소식이 함께 언급되며 화제가 됐다.
Evidence
- npm deprecate vs unpublish 실수에 대해, 한 댓글러는 'npm deprecate는 패키지를 레지스트리에서 제거하지 않고 폐기 표시만 남겨서 여전히 다운로드 가능하다. 실제로 지우려면 npm unpublish를 썼어야 했다'고 정확한 차이를 설명하며, Anthropic이 잘못된 명령어를 사용한 것이 오히려 Claude가 작업을 잘못 이해하고 처리한 것 같은 뉘앙스를 준다고 풍자했다.
- 유출의 심각성을 둘러싼 논쟁이 있었다. 일부는 'TypeScript/JS는 기계어도 아니고 원래 obfuscated 코드는 어느 정도 역추적 가능하니 CLI 도구 코드 유출이 뭐가 대단하냐, 차라리 오픈소스로 풀면 된다'는 입장이었다. 반면 다른 쪽에서는 'Google이나 OpenAI가 공개한 것은 Agent SDK라는 툴킷이지, 자사 플래그십 에이전트가 내부적으로 어떻게 동작하는지 보여주는 코드가 아니다. 로드맵과 내부 아키텍처까지 드러난 이번 유출은 차원이 다르다'고 반박했다.
- 미공개 /buddy 기능에 대해서는 꽤 상세한 분석이 공유됐다. 한 댓글러가 코드를 분석해 이 기능이 4월 1일 만우절 이스터에그로 출시 예정이었으며, 18가지 종, 희귀도, 능력치, 모자, 눈 모양 등이 사용자 계정의 UUID를 seed로 한 결정적(deterministic) 알고리즘으로 생성된다는 걸 알아내고, 미리 자신의 버디를 확인할 수 있는 웹사이트(claudebuddychecker.netlify.app)까지 만들어 공유했다.
- ANTI_DISTILLATION 기능 발견에 대해서는 여러 명이 주목했다. 가짜 tool 정의를 API 응답에 몰래 끼워넣어 경쟁사의 학습 데이터를 오염시키는 방어책이라는 점에서, 'AI 회사들이 이미 이런 종류의 방어 메커니즘을 상용 제품에 구현하고 있다'는 사실 자체가 흥미롭다는 반응이 많았다.
- 법적 문제에 대한 우려도 제기됐다. 유출된 코드를 AI로 분석해서 유사한 시스템을 재구현하는 게 법적으로 괜찮은지 묻는 댓글이 있었고, '오염된 물건(tainted goods)처럼 접근하지 않는 게 나을 수 있다'는 조심스러운 의견도 나왔다. 한편으로는 'AI 모델들이 이미 수십억 개의 오픈소스 코드로 학습됐는데 도덕적 문제가 있냐'며 가볍게 보는 시각도 있었다.
How to Apply
- NPM 패키지를 배포하는 경우, 빌드 설정에서 source map 파일이 배포 번들에 포함되지 않도록 반드시 확인해야 한다. Webpack이라면 devtool 옵션을 'hidden-source-map'으로 설정하거나 .npmignore에 *.map을 추가해 내부 로직이 역추적되는 것을 막을 수 있다.
- 패키지 버전을 긴급하게 내려야 할 때, npm deprecate가 아닌 npm unpublish [패키지명]@[버전]을 사용해야 레지스트리에서 실제로 삭제된다. npm deprecate는 표시만 남기고 파일은 그대로 남아 다운로드 가능하므로, 보안 이슈 대응 시 혼동하지 않도록 팀 내에서 두 명령어의 차이를 사전에 공유해두는 게 좋다.
- 기능 플래그(feature flag)로 관리하는 미공개 기능이 있다면, 해당 플래그 이름과 기능명이 배포 코드에 그대로 노출될 수 있다는 점을 인지해야 한다. 민감한 로드맵 정보는 코드에서 분리하거나, 서버 사이드에서만 관리하고 클라이언트 번들에는 포함하지 않는 구조를 고려해볼 수 있다.
- 사용자 입력을 로깅하는 로직이 있다면, 어떤 조건에서 무엇을 로깅하는지가 코드에 드러날 경우 사용자 신뢰 문제로 이어질 수 있다. 로깅 정책은 공개 문서나 프라이버시 정책에 명시하고, 코드 내 감지 패턴이 외부에 노출되지 않도록 서버 사이드로 이전하는 것을 검토해볼 만하다.
Terminology
관련 논문
프로덕션 AI 에이전트를 GPT-5.6으로 마이그레이션: 2.2배 빠르고 27% 저렴
마케팅 웹사이트를 자동 생성하는 프로덕션 AI 에이전트를 Claude Opus 4.8에서 GPT-5.6 Sol로 전환한 실전 경험담으로, 단순 모델 교체가 아니라 eval 하네스, 툴 스키마, 캐싱, 추론 리플레이까지 손봐야 했던 과정을 구체적인 수치와 함께 정리했다.
xAI Grok Build CLI가 xAI 서버로 전송하는 데이터: 네트워크 레벨 분석
xAI의 공식 코딩 CLI 도구 Grok Build가 사용자 동의 없이 전체 Git 저장소와 .env 시크릿 파일을 xAI 서버로 업로드한다는 사실이 네트워크 트래픽 분석으로 밝혀졌다.
중요할 때 기억하라: Long-Horizon 에이전트를 위한 Proactive Memory Agent
LLM 에이전트가 긴 작업 중 중요한 정보를 잊어버리는 문제를 별도의 메모리 에이전트가 '적절한 타이밍에' 끼어들어 해결하는 방법
WebSwarm: 깊고 넓은 웹 검색을 위한 재귀적 Multi-Agent Orchestration
복잡한 웹 검색을 재귀적으로 분해하고 각 노드에 적합한 검색 모드를 동적으로 할당하는 멀티에이전트 프레임워크
웹 앱을 리버스 엔지니어링해서 AI Agent 도구로 자동 변환하기
로그인된 웹 앱의 API 호출을 브라우저에서 감시해 자동으로 MCP 도구로 변환하는 에이전트를 만들었다. 소스 코드나 공식 API 문서 없이도 Jira, Spotify 같은 서비스에 AI 어시스턴트를 붙일 수 있다.
FableCut – AI 에이전트가 조작할 수 있는 브라우저 기반 비디오 에디터 (zero deps)
타임라인 전체를 JSON 파일 하나로 표현하고 MCP/REST로 AI 에이전트가 직접 편집할 수 있는 브라우저 비디오 에디터로, Claude 같은 AI가 프롬프트 하나로 영상을 자동 컷편집하고 결과를 실시간으로 UI에 반영해준다.
Related Resources
- https://twitter.com/Fried_rice/status/2038894956459290963
- https://www.npmjs.com/package/@anthropic-ai/claude-code/v/2
- https://github.com/chatgptprojects/claude-code
- https://github.com/instructkr/claude-code/blob/main/src/constants.ts
- https://daveschumaker.net/digging-into-the-claude-code-source-code/
- https://news.ycombinator.com/item?id=43173324
- https://claudebuddychecker.netlify.app/
- https://malus.sh/