Claude Code CLI 50만 줄 소스코드 NPM 패키지 유출 사고의 전모는?

Created by AI
Created by AI

50만 줄이 넘는 TypeScript 코드가 어떻게 간단한 배포 실수 하나로 전 세계에 공개되었을까요? 이번 claude code 소스코드 유출은 해킹이나 내부 침투가 아니라, 빌드·배포 파이프라인에서 흔히 지나칠 수 있는 “패키징 품질 관리” 문제로 시작됐습니다. 즉, 공격자가 시스템을 뚫은 것이 아니라 배포물이 스스로 단서를 흘린 사건에 가깝습니다.

배포물에 섞여 들어간 소스맵(.map)이 촉발한 claude code 소스코드 유출

사건의 핵심 트리거는 NPM 패키지 배포 과정에서 소스맵(Source Map, .map) 파일이 함께 포함된 것입니다. 소스맵은 원래 번들링된(압축/난독화된) JavaScript 코드가 브라우저나 런타임에서 오류를 냈을 때, 개발자가 원본 TypeScript/소스 파일 위치와 라인을 추적하도록 돕는 디버깅용 메타데이터입니다.

문제는 소스맵이 “코드 라인 매핑 정보”만 담는 경우도 있지만, 설정에 따라 다음과 같은 민감 정보가 같이 들어갈 수 있다는 점입니다.

  • sources / sourcesContent: 원본 파일 경로, 또는 원본 코드 자체
  • 빌드 환경에서 생성된 내부 경로, 리소스 URL
  • 디버깅을 위한 각종 주석/메타데이터

이번 경우에는 NPM에 포함된 소스맵 내부에 Anthropic의 R2 스토리지 버킷에 있는 소스코드 아카이브 링크가 남아 있었고, 외부에서 해당 링크를 통해 전체 코드를 내려받을 수 있었습니다. 결과적으로 “패키지에 포함된 부속 파일”이 추가 다운로드 경로를 공개해버린 셈입니다.

‘해킹’이 아니라 ‘패킹 실수’였던 claude code 소스코드 유출의 흐름

이번 유출의 전개는 전형적인 공급망 공격 시나리오와 달리, 비교적 단순한 순서로 설명됩니다.

  1. CLI 클라이언트가 NPM 패키지로 배포됨
  2. 배포물에 디버깅용 소스맵(.map) 파일이 포함됨(패킹 실수)
  3. 소스맵 안에 외부 스토리지(R2)로 연결되는 소스 아카이브 링크가 노출됨
  4. 링크를 통해 다운로드가 가능해지며, 결과적으로 약 2,300개 이상 파일, 50만 줄 규모 TypeScript 코드가 공개됨

즉, 공격자가 취약점을 찾아 침투한 것이 아니라, 배포 산출물이 공개 저장소에 ‘열쇠’를 같이 올린 형태입니다. 이런 유형의 사고가 무서운 이유는, 개발팀이 “백엔드나 모델은 안전하다”는 판단을 하더라도, 클라이언트 코드만으로도 제품 구조·기능 로드맵·내부 설계 철학이 대량 노출될 수 있기 때문입니다.

유출 범위가 ‘클라이언트’에 한정되어도 파장이 큰 이유: claude code 소스코드 유출의 의미

정리하면, 이번 유출은 모델 가중치나 백엔드 서버 코드가 아니라 CLI 클라이언트 측 코드에 국한됩니다. 그럼에도 파장이 큰 이유는 클라이언트가 단순 UI가 아니라, 다음과 같은 민감한 구현 디테일을 담고 있기 때문입니다.

  • 도구 실행(예: Bash), 파일 편집 등 에이전트 동작 방식
  • MCP 서버 통합, 원격 세션, OAuth 인증, 정책 관리 로직
  • 시스템 프롬프트 설계 흔적, AI 상호작용 흐름
  • 비활성화된 미출시 기능(예: Auto-Dream, KAIROS 등)과 내부 로드맵 단서

여기에 더해, 이번 사고는 약 13개월 전에도 유사 경로로 노출이 있었다는 점에서 신뢰와 거버넌스 이슈로 번졌습니다. “한 번의 실수”가 아니라 “재발한 실수”는, 기술적 결함을 넘어 배포 검증 체계(artifact 검사, 맵 파일 정책, 스토리지 접근 통제) 전반을 다시 보게 만듭니다.

결국 이번 claude code 소스코드 유출은 “보안은 침투만 막는 일이 아니라, 배포물에 무엇이 들어가는지 끝까지 책임지는 일”이라는 사실을 다시 확인시킨 사건입니다.

claude code 소스코드 유출의 메커니즘: 소스맵(.map) 파일과 NPM 패키지의 함정

단 한 개의 소스맵(.map) 파일이 수천 개의 파일과 수십만 줄의 코드를 유출시켰다? 이번 사건은 해킹이나 취약점 공격이 아니라, 빌드·배포 파이프라인에서 “의도치 않게 공개된 메타데이터”가 얼마나 치명적일 수 있는지를 보여줍니다. 핵심은 NPM 패키지에 포함된 소스맵이 ‘원본 소스의 위치’까지 친절하게 안내해버렸다는 점입니다.

소스맵이 무엇이길래, 유출로 이어졌나?

프론트엔드(또는 CLI의 UI/번들) 개발에서 소스맵은 흔히 사용됩니다. TypeScript/번들된 JavaScript는 디버깅이 불편하기 때문에, 브라우저나 런타임이 “원래의 TS 파일”을 추적할 수 있도록 .map 파일을 함께 배포하곤 하죠.

소스맵에는 보통 아래 같은 정보가 들어갑니다.

  • 번들된 코드의 각 줄/컬럼이 원본 소스의 어디에서 왔는지에 대한 매핑 정보
  • sources 목록(원본 파일 경로 목록)
  • 경우에 따라 sourcesContent(원본 파일 내용 자체가 포함되기도 함)
  • 그리고 가장 위험한 케이스: 원본 소스를 가져올 수 있는 외부 URL 또는 내부 스토리지 경로

즉, 소스맵은 “디버깅 편의”라는 선의의 목적을 갖지만, 설정이 조금만 어긋나면 원본 소스코드로 가는 길을 공개적으로 열어주는 지도가 됩니다.

NPM 패키징 과정에서 무슨 일이 있었나?

이번 claude code 소스코드 유출은 NPM에 올라간 패키지 안에 .map 파일이 포함되면서 시작됐습니다. 더 정확히는, 그 소스맵 내부에 Anthropic의 R2 스토리지 버킷에 있는 소스코드 아카이브 링크(또는 접근 경로)가 그대로 남아있었고, 이를 따라가면서 전체 아카이브를 내려받을 수 있었던 것으로 알려졌습니다.

정리하면 흐름은 다음과 같습니다.

  1. TypeScript → 번들링/빌드 과정에서 소스맵 생성
  2. 생성된 소스맵에 원본 소스 참조 정보가 기록됨(문제의 링크/경로 포함)
  3. NPM 배포 단계에서 패키지에 소스맵이 그대로 포함됨(패킹 실수)
  4. 패키지를 설치/분석한 제3자가 .map을 열어봄
  5. .map 안의 참조를 통해 R2에 있는 소스 아카이브를 다운로드
  6. 결과적으로 약 2,300개 파일, 50만 줄 규모 TypeScript 코드가 외부에 노출

여기서 중요한 포인트는 “NPM에 코드가 직접 다 실린 것”만이 문제가 아니라, NPM 패키지 안의 소스맵이 ‘외부에 있는 더 큰 원본 덩어리’로 연결되는 단서가 되었다는 점입니다.

“소스맵 포함”이 왜 이렇게 자주 사고로 이어질까?

빌드/배포 자동화가 고도화되면서, 실무에서는 아래 같은 이유로 소스맵이 의도치 않게 배포에 섞이는 경우가 많습니다.

  • 기본 설정이 sourceMappingURL을 남기거나, .map 파일을 산출물에 같이 두는 경우
  • files/.npmignore/패키징 스크립트가 빌드 산출물을 세밀하게 통제하지 못하는 경우
  • CI에서 “디버그 빌드 산출물”과 “릴리즈 산출물”이 분리되지 않는 경우
  • 내부 스토리지 URL이 “어차피 외부에서 못 열겠지”라는 가정 하에 남는 경우
    → 하지만 퍼블릭 설정, 프리사인 URL, 접근정책 누락 등 변수가 많습니다.

결국 이번 사건은 “복잡한 해킹”이 아니라, 소스맵이라는 작은 파일 하나가 공급망(배포물) 안에서 공개되며 연쇄적으로 정보가 풀린 전형적인 케이스입니다. 특히 이미 약 13개월 전 유사 경로로 노출이 있었다는 점까지 겹치며, 개발 보안 관점에서는 “재발 방지 장치가 배포 파이프라인에 제대로 내장됐는가”라는 질문을 남깁니다.

경악스러운 내부 공개: claude code 소스코드 유출로 드러난 숨겨진 기능과 아키텍처

미처 공개되지 않았던 Auto-Dream부터 팀 구성까지 44개의 비활성화 기능이 한꺼번에 드러났다면 어떨까요? 이번 claude code 소스코드 유출은 “해킹”이 아니라, NPM 패키징 과정에서 소스맵(.map) 이 포함되며 내부 아카이브 링크가 노출된 전형적인 공급망 실수였지만, 결과적으로는 CLI가 어떤 철학과 구조로 만들어졌는지까지 한눈에 보이게 만들었습니다. 아래는 유출된 코드에서 확인된 핵심 포인트들입니다.

claude code 소스코드 유출로 확인된 CLI의 전체 구성: 프론트엔드지만 ‘작은 플랫폼’에 가깝다

유출 범위는 모델 가중치나 백엔드가 아니라 CLI 클라이언트 측(TypeScript) 코드였지만, 규모가 방대했습니다. 약 50만 줄, 2,300개+ 파일 수준은 단순한 “명령어 도구”가 아니라, 기능 모듈이 층층이 쌓인 플랫폼형 CLI에 가깝다는 신호입니다.

특히 구조적으로 눈에 띄는 점은 다음과 같습니다.

  • 도구 시스템(tooling) 중심 설계: Bash 실행, 파일 편집 등 “AI가 실제 작업을 수행할 수 있는 손과 발”을 모듈로 제공
  • 세션/정책/인증 레이어 존재: 원격 세션, OAuth 인증, 정책 관리 등 운영 환경을 전제한 구성
  • 확장형 통합 아키텍처: MCP 서버 통합 등 외부 시스템과의 연동을 체계적으로 수용하는 구조

즉, CLI는 단순히 프롬프트를 전달하는 얇은 클라이언트가 아니라, 에이전트 실행 환경 + 보안/정책 + 통합까지 포괄하는 형태로 설계된 흔적이 강합니다.

claude code 소스코드 유출로 드러난 핵심 기능: 에이전트 실행 로직이 ‘제품의 중심’

유출된 코드에서 강조되는 영역은 “대화 UI”보다 AI 상호작용 로직과 실행 제어입니다. 구체적으로는 다음 범주가 제품 핵심으로 보입니다.

  • 에이전트 동작을 구성하는 내부 로직: 어떤 상황에서 어떤 도구를 호출하고, 결과를 어떻게 다시 모델 입력으로 이어 붙이는지
  • 시스템 프롬프트 설계 흔적: 내부 규칙과 가드레일이 어떻게 프롬프트 레이어에 녹아 있는지
  • 원격 세션/협업 지향 흐름: 로컬 CLI임에도 원격 제어 및 세션 연계가 고려됨

이런 구조는 “개발자용 CLI”를 넘어, 기업 환경에서 정책 준수 하에 에이전트를 운용하려는 방향성과 맞닿아 있습니다.

claude code 소스코드 유출의 가장 큰 흥밋거리: 비활성화된 44개 기능의 정체

이번 이슈가 커진 이유는, 실제 배포본에서 보지 못한 기능이 단편이 아니라 대량(약 44개) 으로 등장했기 때문입니다. 대표적으로 언급된 항목만 보더라도 로드맵의 폭이 상당합니다.

  • Auto-Dream: 자동 메모리 정리(또는 메모리 관리 자동화로 해석 가능한 기능)
  • KAIROS: “선제적 AI 행동” 성격의 기능 흔적
  • Coordinator: 팀 구성/오케스트레이션 성격의 기능
  • 반려동물 기능: 제품 경험을 캐주얼하게 만드는 실험적 요소로 보이는 흔적

여기서 중요한 건, 이 기능들이 “곧 출시”를 의미하진 않는다는 점입니다. 코드베이스에 남아있는 비활성 기능은 대개 다음 중 하나인 경우가 많습니다.

  • 실험 기능이 플래그로 꺼져 있는 상태
  • 내부 테스트/데모용 기능이 정식 제품 요구사항과 충돌
  • 정책/보안 검토가 끝나지 않아 릴리스가 보류된 상태

그럼에도 불구하고, 이 정도의 비활성 기능 묶음은 Claude Code CLI가 단순 도구가 아니라 에이전트 기반 워크플로우를 장기적으로 확장하려는 제품임을 강하게 시사합니다.

claude code 소스코드 유출이 말해주는 보안적 함의: 소스맵과 아카이브 링크는 ‘데이터 유출 경로’다

이번 사건의 본질은 “코드가 TypeScript로 작성됐다”가 아니라, 빌드 산출물에 포함된 소스맵이 내부 저장소 링크(R2 버킷 아카이브 경로)를 외부에 공개해버렸다는 점입니다. 소스맵은 디버깅 편의 때문에 종종 배포되지만, 다음 조건이 겹치면 즉시 사고로 이어집니다.

  • 소스맵에 원본 경로/주석/메타데이터가 남음
  • 그 경로가 접근 가능한 스토리지 URL과 연결됨
  • 패키징 단계에서 이를 검증하는 출고 전 점검이 부재

특히 이번 케이스는 과거에도 유사 경로로 노출이 있었다는 점에서, 단순한 실수라기보다 빌드·배포 파이프라인의 보안 거버넌스 문제로 읽힙니다. 개발 보안 관점에서 “재발”은 곧 프로세스 결함을 의미하니까요.

claude code 소스코드 유출 이후 우리가 얻은 결론: ‘어떻게 만들어졌는지’가 공개되면 공격 표면도 커진다

모델 가중치나 백엔드는 없었다고 해도, 클라이언트 아키텍처가 드러나면 다음 정보가 함께 노출될 수 있습니다.

  • 인증/세션 흐름, 정책 적용 지점 같은 구조적 약점 후보
  • 기능 플래그, 숨겨진 엔드포인트 힌트 등 공격자가 탐색할 단서
  • 도구 실행(예: Bash, 파일 편집)의 제어 방식 같은 안전장치 설계 수준

결국 이번 claude code 소스코드 유출은 “무엇을 만들고 있는가”뿐 아니라 “어디가 취약해질 수 있는가”까지 함께 보여준 사건입니다. 그리고 그 지점이야말로, 개발 보안 커뮤니티가 이 이슈를 단순 해프닝으로 보지 않는 이유입니다.

반복된 실수: claude code 소스코드 유출은 왜 Anthropic에서 다시 발생했나

13개월 전에도 거의 같은 경로로 소스가 노출됐다는 사실은 이번 claude code 소스코드 유출을 단순한 “실수”로만 보기 어렵게 만듭니다. 해킹이 아니라 패키징/빌드 산출물 관리 실패라는 점에서, 한 번 겪고도 재발했다는 건 조직의 개발 프로세스 어딘가가 구조적으로 취약하다는 신호입니다. 그렇다면 왜 같은 길을 반복하게 되었을까요?

재발을 부르는 전형적 구조: “빌드는 자동인데 검증은 수동”인 조직

이번 사고의 핵심은 소스맵(.map) 같은 디버그 친화적 산출물이 배포물에 포함되면서, 그 안의 메타데이터(예: 아카이브 링크)가 외부에 노출될 수 있었다는 점입니다. 이런 유형의 유출은 대개 아래 조건이 겹칠 때 발생합니다.

  • 빌드/배포 파이프라인이 자동화되어 있어 릴리스가 빠르다
  • 하지만 산출물에 포함되면 안 되는 파일을 잡아내는 검증 단계(artifact 검수)가 약하다
  • NPM 배포에서 files/.npmignore/번들러 설정 등 여러 레이어의 규칙이 중첩되며, 작은 설정 변경 하나가 누락을 만든다
  • 소스맵은 “버그 추적에 유용”하다는 이유로 관성적으로 남기기 쉬운 파일이다

즉, “자동으로 잘 나간다”는 체감이 쌓일수록, 릴리스 직전의 보안 검증은 형식적인 체크리스트로 축소되기 쉽습니다. 첫 번째 유출 이후에도 같은 패턴이 반복되었다면, 사후 대응은 했지만 프로세스 자체는 바뀌지 않았을 가능성이 큽니다.

소스맵이 위험한 이유: 코드가 아니라 “길”이 남는다

많은 개발자가 소스맵을 “원본 코드가 없으면 의미가 덜하다”고 생각하지만, 실제로는 반대인 경우가 많습니다. 소스맵에는 다음이 담길 수 있습니다.

  • 번들된 코드와 원본 코드의 매핑 정보
  • 원본 파일 경로, 모듈 구조 같은 프로젝트 내부 구조
  • 경우에 따라 sourcesContent원본 코드 조각 자체가 들어가기도 함
  • 그리고 이번처럼, 빌드 과정에서 삽입된 외부 저장소 링크/참조가 남을 수 있음

따라서 소스맵이 배포물에 섞이면, 공격자는 “코드를 훔치는” 게 아니라 코드로 가는 지도를 얻는 것이 됩니다. 이 지도가 한 번 외부로 나가면, 단순 삭제로 끝나지 않습니다. 이미 크롤링되었거나 캐시/미러에 남아 있을 수 있고, 무엇보다 “어떤 경로로 유출되는지”가 학습되어 다음 사고의 재현성이 높아집니다.

“AI 안전”과 “빌드 보안”의 간극: 조직 우선순위가 다르면 구멍이 생긴다

AI 기업이 강조하는 안전은 대개 모델 행동, 정책, 가드레일, 레드팀 같은 영역에 집중됩니다. 반면 이번 claude code 소스코드 유출은 극히 전통적인 소프트웨어 공급망 이슈입니다. 여기서 생기는 간극은 다음과 같습니다.

  • 안전팀과 제품 엔지니어링의 목표가 분리되어 있을 때
    모델/정책 안전은 강해져도, 빌드 산출물 보안은 “기본값”으로 방치될 수 있습니다.
  • 속도 중심의 제품 릴리스 문화
    CLI 같은 클라이언트 제품은 빠른 배포가 경쟁력이어서, “디버깅 편의(소스맵 포함)”가 “배포 보안”을 이길 때가 많습니다.
  • 책임 소유자(Ownership) 부재
    “NPM 패키징 보안은 누가 책임지는가?”가 불명확하면, 개선 과제가 항상 다음 스프린트로 밀립니다.

결국 문제는 기술이 아니라 구조입니다. 같은 유형의 유출이 13개월 만에 재현되었다면, “한 번의 실수”가 아니라 검증 체계가 릴리스 과정에 강제되지 않는 상태일 가능성이 높습니다.

재발을 막는 실전 처방: “배포 전 자동 차단”이 핵심

이런 사고는 교육이나 공지로는 잘 막히지 않습니다. CI/CD에서 자동으로 걸러야 재발 확률이 급격히 떨어집니다. 현실적인 방어선은 다음과 같습니다.

  • NPM 배포 전 검사 단계 추가
    • 패키지에 .map 포함 여부 검사(특히 프로덕션 릴리스)
    • .map 파일 내 sourcesContent, 외부 URL 패턴, 내부 경로(src/, internal/) 탐지
  • npm pack 결과물 기반 검증
    • 실제 배포될 tarball을 생성해 파일 목록을 비교하고, 위험 파일이 있으면 빌드 실패 처리
  • 저장소 링크/토큰/버킷 URL의 정적 스캔
    • 번들/소스맵/로그 산출물에서 URL 패턴을 탐지해 차단
  • 산출물 최소화 정책
    • “디버깅용 산출물은 내부 채널에만”, “공개 패키지는 최소 파일만” 같은 원칙을 정책으로 고정
Posts created 7567

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top