Claude Code 소스 유출: 가짜 도구, 욕설 감지 정규식, 은폐 모드 등 내부 구조 드러남

19 hours ago 1
  • Anthropic이 npm 패키지에 소스맵을 포함해 배포하면서 Claude Code의 전체 코드가 공개되어, 내부 기능과 실험적 플래그가 모두 드러남
  • 코드에는 모델 모방 방지를 위한 가짜 도구 삽입(anti-distillation), AI 정체를 숨기는 undercover 모드, 욕설 감지용 frustration regex 등이 포함됨
  • 네이티브 클라이언트 인증DRM 수준의 해시 검증 구조가 존재해, 비공식 도구의 API 접근을 차단하도록 설계됨
  • 내부 주석에서는 하루 25만 건의 실패 API 호출, 미완성 KAIROS 자율 에이전트 모드, Tamagotchi형 동반자 시스템 등 다양한 실험 기능이 확인됨
  • 이번 유출은 Anthropic의 핵심 제품 구조와 로드맵이 노출된 사례로, Bun 런타임의 소스맵 버그가 원인일 가능성이 제기됨

소스맵 유출로 드러난 Claude Code 내부 구조

  • Anthropic이 npm 패키지에 소스맵을 포함해 배포하면서 Claude Code의 전체 소스가 공개됨
    • 패키지는 이후 삭제되었으나, 코드가 여러 곳에 미러링되어 분석 대상이 됨
    • 이는 일주일 내 두 번째 유출 사건으로, 앞서 모델 사양 문서가 노출된 바 있음
    • 최근 Anthropic이 제3자 도구의 내부 API 사용을 법적으로 차단한 직후 발생
  • Anti-distillation: 모방 방지를 위한 가짜 도구 삽입

    • claude.ts에는 ANTI_DISTILLATION_CC 플래그가 존재하며, 활성화 시 API 요청에 anti_distillation: ['fake_tools']를 포함해 가짜 도구 정의를 시스템 프롬프트에 삽입
      • 이는 API 트래픽을 캡처해 모델을 모방하려는 시도를 오염시키는 목적
      • GrowthBook 플래그 tengu_anti_distill_fake_tool_injection이 켜진 1차 CLI 세션에서만 작동
    • betas.ts에는 두 번째 메커니즘으로 요약 기반 서버 측 보호 기능이 존재
      • 도구 호출 사이의 텍스트를 요약 후 암호 서명과 함께 반환, 이후 복원 가능
      • 외부에서 트래픽을 기록해도 전체 추론 과정을 볼 수 없음
    • 이 기능은 여러 조건이 동시에 충족되어야 하며, MITM 프록시로 필드 제거 시 무력화 가능
      • 환경 변수 CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS 설정으로 비활성화 가능
      • USER_TYPE === 'ant' 조건으로 인해 Anthropic 내부 사용자 전용
    • 실질적 방어 수단은 기술적 장치보다 법적 제약에 가까운 형태
  • Undercover mode: AI 정체를 숨기는 모드

    • undercover.ts는 외부 저장소에서 사용될 때 Anthropic 내부 코드명, Slack 채널, “Claude Code” 문구 등을 제거
      • "There is NO force-OFF" 문구로 비활성화 불가
      • 환경 변수 CLAUDE_CODE_UNDERCOVER=1로 강제 활성화 가능
    • 외부 빌드에서는 함수가 무의미한 반환으로 제거되어 일방향적 구조
    • 이로 인해 Anthropic 직원이 오픈소스에 기여할 때 AI 작성 여부가 표시되지 않음
      • 내부 정보 은폐 목적은 합리적이지만, AI가 인간처럼 위장하는 효과 발생
  • Frustration regex: 욕설 감지용 정규식

    • userPromptKeywords.ts에는 사용자의 불만·욕설을 감지하는 정규식 패턴이 포함
      • “wtf”, “this sucks”, “fuck you” 등 다양한 표현을 탐지
    • LLM 기업이 감정 분석에 정규식을 사용하는 아이러니를 보여주지만,
      • LLM 호출보다 비용과 속도 면에서 효율적
  • Native client attestation: JS 런타임 아래의 클라이언트 인증

    • system.ts에는 API 요청 시 cch=00000 자리표시자가 포함되어,
      • Bun의 Zig 기반 네이티브 HTTP 스택이 이를 해시로 대체
      • 서버는 이 해시를 검증해 공식 Claude Code 바이너리 여부를 확인
    • 이는 OpenCode 법적 분쟁의 기술적 근거로,
      • 제3자 도구가 API를 직접 호출하지 못하도록 DRM 수준의 검증 수행
    • 단, NATIVE_CLIENT_ATTESTATION 플래그가 꺼져 있거나
      • CLAUDE_CODE_ATTRIBUTION_HEADER가 비활성화되면 작동하지 않음
      • Zig 해시 교체는 공식 Bun 바이너리에서만 작동, Node 환경에서는 무효
    • 서버가 잘못된 해시를 거부하는지는 불명확하며,
      • _parse_cc_header가 “unknown extra fields”를 허용한다는 주석 존재
  • 25만 건의 낭비된 API 호출

    • autoCompact.ts 주석에 따르면,
      • 하루 약 25만 건의 API 호출이 실패 루프로 낭비되고 있었음
      • 1,279개 세션에서 50회 이상 연속 실패, 최대 3,272회
    • 수정은 단 3줄로, MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3 설정 시
      • 3회 연속 실패 후 자동 압축 기능이 비활성화됨
  • KAIROS: 미공개 자율 에이전트 모드

    • 코드 전반에 KAIROS라는 기능 게이트 모드가 존재
      • main.tsx 기준, 자율형 에이전트 기능으로 추정
      • /dream 스킬(야간 메모리 증류), GitHub 웹훅, 백그라운드 데몬, 5분 주기 크론 리프레시 포함
    • 구현은 미완성이지만, 항상 실행되는 백그라운드 에이전트 기반 구조가 마련됨
  • 기타 발견 사항

    • 만우절 이스터에그: buddy/companion.ts에 Tamagotchi 스타일 동반자 시스템 존재
      • 18종 생물, 희귀도·RPG 스탯·1% 확률의 ‘shiny’ 버전 포함
      • 사용자 ID 기반 PRNG로 결정, 문자열 인코딩으로 빌드 검사 회피
    • 터미널 렌더링 엔진(ink/screen.ts, ink/optimizer.ts)은
      • Int32Array 기반 ASCII 버퍼, 비트마스크 스타일 메타데이터, 50배 성능 향상 캐시 구현
    • 보안 검사(bashSecurity.ts)는 23단계로 구성되어
      • Zsh 내장 명령 차단, =curl 우회 방지, 유니코드 제로폭·널바이트 주입 차단 등 수행
      • Zsh 전용 위협 모델을 가진 드문 사례
    • 프롬프트 캐시 관리(promptCacheBreakDetection.ts)는
      • 14가지 캐시 파손 벡터 추적, 모드 전환 시 캐시 유지용 ‘sticky latch’ 사용
      • DANGEROUS_uncachedSystemPromptSection() 주석 존재
      • 토큰 단가 절감 중심의 설계 철학 반영
    • 멀티 에이전트 조정기(coordinatorMode.ts)는
      • 코드가 아닌 프롬프트 기반 오케스트레이션 알고리듬 사용
      • “약한 작업 승인 금지”, “이해 없이 위임 금지” 등 지침 포함
    • 코드 품질 문제도 존재
      • print.ts는 5,594줄, 단일 함수가 3,167줄에 달함
      • HTTP 요청에 Axios 사용, 최근 npm 악성 버전 사건과 시기적으로 겹침
  • 의미와 파장

    • Google Gemini CLI나 OpenAI Codex의 공개 SDK와 달리,
      • 이번 유출은 Anthropic의 핵심 제품 내부 구조 전체가 드러난 사례
    • 가장 큰 피해는 코드 자체보다 Feature Flag와 로드맵 노출
      • KAIROS, Anti-distillation 등 전략적 기능이 경쟁사에 공개
    • Anthropic은 지난해 Bun을 인수했으며, Claude Code는 Bun 위에서 동작
      • Bun의 소스맵 버그(oven-sh/bun#28001)가 원인일 가능성 존재
      • 프로덕션 모드에서도 소스맵이 노출되는 문제로, 아직 미해결 상태
    • 결과적으로 Anthropic은 자사 도구 체인 버그로 자사 제품을 유출한 셈
      • 한 트위터 반응처럼, “AI가 작성한 코드를 배포하다가 AI가 만든 버그로 코드가 새어 나간” 아이러니한 사건
Read Entire Article