본문으로 건너뛰기
피드

Claude Code 소스코드 통째로 유출 -- 가짜 도구 주입, AI 위장 모드, Zig 레벨 DRM까지 전부 까발려짐

security 약 10분
vote
0
댓글
북마크

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

  • 1

    API 요청에 가짜 tool 정의를 주입하는 anti-distillation 메커니즘 발견 -- 기술적 우회는 쉬움

  • 2

    undercover 모드로 Anthropic 직원의 오픈소스 기여 시 AI 작성 사실을 숨김

  • 3

    Bun(Zig) 네이티브 HTTP 스택에서 클라이언트 해시를 삽입하는 DRM 방식 API 인증 구현

  • 4

    미공개 자율 에이전트 KAIROS: 백그라운드 데몬, 메모리 증류, cron 스케줄 등 스캐폴딩 존재

  • 5

    autoCompact 3줄 수정으로 하루 25만 건 API 호출 낭비 해결

  • 6

    23개 bash 보안 체크, 14개 프롬프트 캐시 break 벡터 추적 등 깊은 엔지니어링 발견

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 엔트리포인트에서는 아예 체크 안 함

⚠️주의

> 기술적 보호는 사실상 무의미함. 소스코드를 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줄 코드로 해결

ℹ️참고

> 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 상수 하나만 있었으면 막을 수 있던 문제거든요. 실서비스에서 에이전트를 운영하는 팀이라면 이런 패턴을 꼭 참고하면 좋겠어요

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

댓글

댓글

댓글을 불러오는 중...

security

한양대 에리카와 네이버클라우드, 클라우드·보안·AI 인재 키우는 산학협력 체결

한양대 에리카가 네이버클라우드와 첨단 분야 지역인재 양성과 글로벌 산학협력을 위한 업무협약을 맺었다. 협력 범위는 클라우드, 사이버보안, 블록체인, 개인정보보호, 인공지능(AI), 디지털 전환(DX) 교육·연구 기반 구축까지 포함된다.

security

악성 npm 패키지가 AI 개발도구의 지침 파일과 MCP까지 노리기 시작함

이스트시큐리티가 웹과 탈중앙화금융 개발자를 겨냥한 악성 npm 패키지 캠페인을 포착했어. 공격자는 유명 웹3 도구를 사칭하는 데서 그치지 않고, AI 에이전트가 읽는 프로젝트 지침 파일과 MCP 기반 외부 도구 호출까지 공격 경로로 삼으려 했어.

security

금융권, 앤트로픽 미토스가 찾은 오픈소스 취약점에 긴급 점검 들어감

앤트로픽의 AI 모델 클로드 미토스가 1000개 넘는 오픈소스에서 대량의 취약점 후보를 찾아냈고, 그중 일부가 실제 취약점으로 검증돼 공개됐어. 금융당국은 nginx, wolfSSL, FreeRDP, Ghost 같은 널리 쓰이는 구성요소를 중심으로 금융권에 긴급 자산 점검과 패치 적용을 권고했어.

security

애플이 양자 내성 암호화 검증 코드를 공개했다, 핵심은 수학적 증명

애플이 corecrypto 라이브러리의 포스트 양자 암호화 구현과 검증 코드를 GitHub에 공개했다. ML-KEM, ML-DSA 구현과 형식 검증 접근을 공개해 보안 연구자들이 직접 검토할 수 있게 했고, 이 기술은 25억 대 이상 활성 기기에서 쓰이는 암호화 기반과 연결된다.

security

라라벨 번역 패키지 태그가 통째로 바뀌었다, 개발자 비밀값 털리는 공급망 공격

전 세계 라라벨 개발자가 쓰는 Laravel-Lang 패키지가 공격을 받아 Git 태그가 악성 버전을 가리키도록 바뀌었다. 5월 22일 약 90분 동안 4개 저장소의 태그가 교체됐고, 감염된 패키지는 AWS 키, GitHub 토큰, Stripe 시크릿, 암호화폐 지갑 복구 구문, SSH 개인키 등을 노렸다.