핵심 요약
- npm 자가증식 웜이 keyv@6.0.0을 기점으로 2026년 8월 4일 기준 수백 개 패키지로 확산됨.
- SafeDep는 79개 패키지명에서 353개 오염 버전을 검증했고 Aikido는 최소 868개 패키지 영향을 보고해 기관 간 집계 격차가 큼.
- 단순 의존성 오염을 넘어 Claude Code와 VS Code 훅 변조로 자격증명 탈취를 시도하는 이중 페이로드가 포함된 것으로 분석됨.
트랜시티브 의존성을 무력화하는 lockfile 잠금과 IDE 훅 감사가 사고 확산을 차단하는 1차 방어선이다.
2026년 8월 4일, npm 생태계에서 keyv 패키지를 매개로 한 자가증식형 웜이 확인됐다. 이 웜은 의존성 그래프를 따라 Cacheable 네임스페이스를 넘어 다수 조직의 패키지로 빠르게 전파된 것으로 조사됐으며, 개발자 로컬 환경의 AI 코딩 도구와 IDE 설정까지 변조해 자격증명을 탈취하려는 시도가 포함된 것으로 보고됐다. 본문은 확산 경로, 영향 범위, 그리고 실무 독자가 즉시 점검해야 할 항목을 중심으로 사건을 정리한다.
공급사슬 공격 개요: keyv@6.0.0에서 시작된 웜
확산 경로와 타임라인 (2026-08-04 기준)
오염은 keyv@6.0.0 패키지에서 최초 검출된 이후, keyv와 Cacheable 네임스페이스를 공유하는 인접 패키지로 연쇄 전파된 것으로 분석된다. 웜의 전파는 게시자의 자격증명이 탈취되어 새 버전이 업로드되는 형태와 트랜시티브 의존성 자동 설치를 이용하는 형태가 결합된 것으로 보이며, 2026년 8월 4일 시점에서 이미 수백 개 패키지에 오염 흔적이 남아 있었다. The Hacker News는 이 사건을 npm 공급사슬에서 자가증식 행위가 실증된 사례로 분류했다.
영향 범위 산정: SafeDep와 Aikido 집계 격차
기관별로 측정한 영향 범위에는 상당한 격차가 존재한다. SafeDep는 매니페스트 직접 매칭 기준으로 79개 패키지명에서 353개 오염 버전을 검증했고, 광범위 모니터링 결과로는 353개 명칭에서 442개 버전 영향이 추정됐다. 반면 Aikido는 최소 868개 패키지가 영향권에 포함된 것으로 집계해 두 수치 사이에 큰 차이를 보인다. 이는 정적 매니페스트 분석과 런타임 다운로드 이력, 그리고 패키지 그래프 추적 방식의 차이에서 비롯된 것으로 해석된다.
| 측정 기관 | 기준 | 패키지 명칭 수 | 오염 버전 수 |
|---|---|---|---|
| SafeDep (직접 검증) | 매니페스트 매칭 | 79 | 353 |
| SafeDep (확장 모니터링) | 그래프 추적 | 353 | 442 |
| Aikido | 다운로드/등록 기반 | 최소 868 | 미공개 |
기술적 분석: 자격증명 탈취와 개발자 도구 훼손
Claude Code 및 VS Code 훅 변조 메커니즘
공격자는 npm 패키지 페이로드 안에 개발자 로컬 환경을 겨냥한 2차 코드를 삽입한 것으로 분석된다. 이 코드는 Claude Code 설정 디렉터리와 VS Code 훅 설정 파일을 탐지해 사용자 명령이 실행되기 전후에 개입하는 스크립트를 등록하며, 환경 변수, 토큰 파일, 그리고 셸 히스토리에서 자격증명을 수집해 외부 서버로 유출하는 동작을 수행하는 것으로 분석된다. 특히 IDE 훅은 사용자가 인지하지 못한 상태에서 트리거되므로 침해 탐지가 늦어질 가능성이 높다.
트랜시티브 의존성을 악용한 자가증식 구조
웜이 빠르게 확산된 핵심 요인은 트랜시티브 의존성의 자동 설치 동작이다. 직접 의존하지 않더라도 상위 패키지가 keyv 또는 Cacheable 계열을 가져오는 경우 잠금 파일이 없거나 느슨한 버전 범위를 허용하면 오염 버전이 자동으로 끌려 내려온다. 이는 단일 패키지 차원의 보안 점검만으로는 차단이 불가능하다는 점을 다시 한번 강조하는 보여준다.
즉시 점검 항목과 대응 가이드
패키지/버전 핀(pinning) 및 lockfile 검증
먼저 모든 프로젝트의 package-lock.json 또는 npm-shrinkwrap.json을 점검해 keyv, cacheable, @keyv 등 관련 네임스페이스의 버전이 정상 범위에 잠겨 있는지 확인해야 한다. 오염 일자(2026-08-04) 이후 갱신된 lockfile은 특별히 의심 대상이며, 가능하면 정확 버전 핀과 integrity 해시 재생산을 강제하는 CI 규칙을 적용하는 것이 권장된다. 사설 레지스트리 미러를 운영 중인 경우 캐시에서 오염 버전이 제거됐는지도 함께 확인해야 한다.
로컬 환경 자격증명 로테이션과 IDE 훅 감사
오염 버전이 설치된 이력이 있는 개발자 머신에서는 npm 게시 토큰, GitHub PAT, 클라우드 액세스 키를 즉시 회전(로테이션)해야 한다. Claude Code와 VS Code의 훅 설정 파일을 열어 알 수 없는 스크립트 경로가 등록되어 있지 않은지 확인하고, 이상이 발견되면 해당 훅을 비활성화한 뒤 신규 설치본으로 교체하는 절차가 필요하다. SafeDep와 같은 공급사슬 점검 도구를 CI에 추가하면 유사한 사건에서 조기 경보가 가능하다.
보안 업계 시사점과 향후 전망
이번 사건은 npm 생태계가 단일 게시자 침해만으로 수백 개 패키지에 도달할 수 있는 구조적 위험을 갖고 있음을 다시 한번 확인했다. 또한 단순 코드 오염을 넘어 개발자 워크스테이션의 AI 도구와 IDE까지 장악하는 이중 페이로드는, 공급사슬 보안의 경계를 의존성 매니페스트에서 로컬 개발 환경까지 확장해야 함을 시사한다. 업계에서는 패키지 게시자 인증 강화, lockfile 무결성 강제, 그리고 IDE 훅 변경 감지 같은 후속 대응이 가속될 것으로 전망된다.
핵심 정리
- keyv@6.0.0에서 시작된 웜이 2026년 8월 4일 기준 수백 개 npm 패키지로 확산된 것으로 조사됨.
- SafeDep는 79개 명칭 353개 버전, Aikido는 최소 868개 패키지 영향으로 집계해 기관별 격차가 존재함.
- Claude Code와 VS Code 훅 변조를 통해 자격증명 탈취를 시도하는 이중 페이로드가 포함된 것으로 분석됨.
- lockfile 잠금, 정확한 버전 핀, IDE 훅 감사가 1차 방어선으로 권장됨.