짙은 네이비 배경 위에 생성된 추상 일러스트레이션: 서로 맞물린 반투명 블록 체인이 왼쪽에서 오른쪽으로 이어지며, 각 블록에는 작게 빛나는 청록색 인장이 새겨져 있다. 체인 중앙 근처에서 한 블록이 동일한 청록색 인장을 지닌 어두운 블록으로 교체되었고, 체인은 끊김 없이 그 너머로 계속된다. 얇은 호박색 필라멘트가 그 어두운 블록에서 아래로 뻗어 프레임 바닥의 작은 어두운 터미널 패널 행을 향한다. 텍스트, 숫자, 사람, 브랜드 표시 또는 조직 로고는 나타나지 않는다. OrcaRouter 로고가 오른쪽 아래 모서리에 합성되어 있다.
AI Safety Incidents

ChainDrop: 400개 이상의 npm 패키지에서 유효한 출처 증명, 그리고 npm 설치가 필요 없는 Claude Code 훅

작성자

Elias Hawthorne

게시일

최신 모델 · 20모든 모델 보기 →
벤치마크: Artificial Analysis · 매일 업데이트
모든 게시물로 돌아가기

2026년 8월 4일에공격자들은 GitHub 계정을 탈취했는데, 그 계정은 keyv라는 캐싱 라이브러리와 연결되어 있었습니다. Elastic Security Labs에 따르면 이 라이브러리는 지난달 6억 회 이상 다운로드되었습니다. Wiz Research와 Orca Security는 모두 악성 파일이 keyv의 main 브랜치에 직접 푸시되었고, 프로젝트 자체의 GitHub Actions 워크플로가 그 후 오염된 릴리스를 빌드 및 게시했다고 기록했습니다. 그 결과 이 릴리스는 유효한 출처 증명을 갖춘 채 npm에 도달했는데, 이 증명은 공급망 증명 도구가 패키지의 신뢰 여부를 판단하는 데 사용하는 것입니다. 연구자들이 ChainDrop이라고 부르는 자기 전파 웜은 그다음 탈취한 npm 토큰을 사용해 다른 관리자들의 패키지 전반에서 같은 수법을 반복했습니다. Elastic은 8월 6일까지 400개 이상의 고유 패키지를 집계했고, Microsoft Threat Intelligence는 8월 4일에 같은 캠페인을 설명했으며, 싱가포르의 Cyber Security Agency는 월간 다운로드 수가 합산 20억 회에 달하는 1,300개 이상의 침해된 패키지 버전을 집계했습니다. Elastic과 Microsoft는 모두, 저장소가 다음 환경에서 열릴 때 다시 실행되는 훅을 설명합니다: Claude Code 또는 Visual Studio Code. 이 기록의 전체 출처 목록, 심각도 등급 및 신뢰도 평가는 AI 사고 아카이브에 있으며, 주변에 함께 제출된 다른 npm 및 개발자 도구 공급망 항목들과 함께 있습니다.

정당한 릴리스 파이프라인이 어떻게 스스로의 침해에 서명했는가

Wiz Research는 초기 몇 분을 재구성합니다: 8월 4일 09:00 UTC에 공격자는 탈취된 신원을 이용해 keyv 저장소에 IDE 지속성 페이로드를 삽입한 뒤, 곧이어 해당 페이로드가 포함된 keyv의 새 버전을 게시했습니다. Wiz는 침해된 당사자를 GitHub 관리자 계정으로 지목하며, keyv 및 cacheable 생태계의 여러 패키지가 뒤를 이었다고 밝혔습니다.

Orca Security의 신속 대응 보고서는 서명 경로에 대해 더 구체적이다. 공격자는 두 악성 파일인 setup.mjs와 Math_Symbol.js를 메인 브랜치에 직접 푸시하고 즉시 새 릴리스를 발표했다고 한다. 해당 릴리스가 탈취된 계정의 GitHub Actions 워크플로를 통해 빌드되었기 때문에, 오염된 버전은 유효한 출처 증명 서명과 함께 npm에 공개되어 표준 공급망 무결성 검사를 우회했다. 기록에 인용된 출처에 포함되지 않은 독립 연구팀인 Zscaler ThreatLabz는 같은 결론에 도달하고 그 수준을 명시한다. 악성 keyv 6.0.0은 공격자가 소스 저장소를 통제했기 때문에 유효한 SLSA Build Level 3 출처 증명을 갖추고 있었다. 그날 이 캠페인을 보도한 BleepingComputer는 같은 메커니즘을 기록한다. 악성 파일이 각 프로젝트의 메인 브랜치에 직접 푸시되었고, 새 릴리스가 생성되었으며, 빌드가 합법적인 GitHub Actions 워크플로를 통해 실행되었기 때문에 유효한 출처 증명이 있었다는 것이다.

Microsoft의 분석은 모순처럼 보이지만 실제로는 모순이 아닌 세부 사항을 하나 더해 준다. 웜의 전파 단계에서 Microsoft Threat Intelligence는 악성 버전 다수가 이에 대응하는 소스 코드 커밋, 풀 리퀘스트, 태그 또는 정당한 릴리스가 없다는 점을 발견했으며, 이는 공격자들이 각 공개 소스 저장소를 침해한 것이 아니라 패키지 tarball을 직접 수정해 게시했음을 보여준다. 함께 읽어 보면, 소스들은 하나의 캠페인 안에 두 가지 서명 체계가 있음을 설명한다. 최초의 keyv 릴리스들은 피해자의 실제 CI 파이프라인을 거쳤고 이를 보증하는 증명(attestation)을 지니고 있는 반면, 웜의 이후 릴리스들은 대부분 탈취한 레지스트리 토큰으로 조립·게시되어 소스 흔적이 전혀 남지 않았다. Microsoft 자신의 관찰에 따르면, tarball 직접 패턴은 악성 릴리스가 이에 대응하는 소스 커밋이나 풀 리퀘스트 없이 흔히 일반적인 패치 버전 증가 형태로 등장한 이유를 설명해 준다.

불편한 교훈을 Zscaler는 명확히 말한다. 출처 증명(provenance)은 빌드 프로세스를 검증할 뿐, 계정의 신원이나 이를 실행하는 CI 시스템의 무결성을 검증하지는 않는다. 또한 이 회사는 사건을 재구성하려는 누구에게나 중요한 공백을 인정한다. 공격자가 사용한 정확한 계정 탈취 메커니즘은 분석 당시에는 알려지지 않았다.

npm install 시 실행되는 것: preinstall, Bun 1.3.13, 그리고 300개 패턴 수집기

Elastic Security Labs는 이 트리거를 package.json의 preinstall 훅으로 설명합니다. 이 훅은 패키지 설치가 완료되기 전에 임의 명령을 실행하는 정당한 npm 기능을 악용하며, 피해자의 추가 상호작용이 필요하지 않습니다. 이 훅은 setup.mjs를 실행합니다. 이 파일은 Bun JavaScript 런타임이 이미 존재하는지 확인합니다. 존재하지 않으면 드로퍼는 시스템의 플랫폼과 아키텍처를 감지하고 Bun v1.3.13을 공식 릴리스 페이지에서 다운로드하여 추출한 뒤, 이를 사용해 페이로드를 실행하고 임시 디렉터리를 삭제해 흔적을 감춥니다. Wiz는 사용자 에이전트 Bun/1.3.13이 악성 호출을 수행한 것을 독립적으로 식별했습니다. 드로퍼는 크로스 플랫폼이며 Linux, macOS, Windows를 대상으로 합니다.

해당 페이로드는 심하게 난독화되어 있으며, 소스마다 크기를 조금씩 다르게 제시합니다. Elastic은 이를 711킬로바이트로, Orca Security는 728 KB로 추정합니다. 이 페이로드는 제어 흐름 평탄화와 Base91 문자열 인코딩 체계를 사용하며, Dune을 테마로 한 문자열 — laza, kanly, ghola, mentat, lasgun, sietch, fedaykin, tleilaxu, sandworm, sardaukar, ornithopter, navigator — 을 포함합니다. Elastic은 이 문자열들이 이전 Shai-Hulud 캠페인과 유사점이 있다고 언급합니다.

마이크로소프트의 행위 분석 설명에는 알아둘 만한 두 가지 세부 사항이 추가되어 있습니다. 페이로드는 먼저 자체 환경을 확인한 뒤 러시아어 시스템에서는 종료되고, 중복 인스턴스를 회피하며 개발자 워크스테이션에서는 분리된 백그라운드 복사본을 실행합니다. CI 내부에서는 활성 작업에 연결된 상태로 유지되어 워크플로 비밀, 러너 자격 증명, OpenID Connect 게시 권한에 접근할 수 있습니다.

이 수집기는 사고를 일반적인 자격 증명 탈취 사건이 아닌 AI 도구 관련 사건으로 만드는 핵심 요소입니다. Elastic에 따르면 이 수집기는 개발자 머신의 자격 증명 저장소 전반에서 300개 이상의 고유 패턴을 스캔하며, 특히 주목할 만한 표적은 AI 도구 자격 증명(Anthropic, Claude, Codex, Cursor, OpenAI, Gemini)을 겨냥합니다. 또한 AWS, GCP, Azure, Alibaba Cloud 자격 증명, GitHub 개인 액세스 토큰, JWT 및 세션 토큰, HashiCorp Vault 토큰, SSH 개인 키, Kubernetes 서비스 계정 토큰, npm 토큰도 수집합니다. Wiz에 따르면 표적 목록은 기반이 된 초기 Mini Shai-Hulud 코드에 비해 거의 70% 확장되었으며, Claude, OpenAI, Codex, Cursor, Gemini용 AI 에이전트 자격 증명 저장소, Foundry, Solana, Monero용 암호화폐 키 저장소, Jenkins의 master.key, Argo CD 및 Harbor 비밀 정보, Alibaba 및 Tencent CLI 구성, 그리고 /etc/shadow가 새로 추가되었습니다.

Microsoft와 Elastic 모두 동일한 유출 설계를 설명합니다. 결과는 JSON으로 직렬화되고 gzip으로 압축되며, 무작위로 생성된 AES-256-GCM 키로 암호화되고, 그 키는 공격자의 RSA 공개 키로 래핑됩니다. 페이로드는 명령 및 제어 도메인을 하드코딩하지 않습니다. Elastic에 따르면 페이로드는 이더리움 스마트 계약을 쿼리합니다. 해당 계약 주소는 0xE1f2395ee43e45A1556EC6438a88c31B83493103이며, 여기서 런타임에 현재 엔드포인트를 가져옵니다. 따라서 인프라는 악성코드를 손대지 않고도 교체할 수 있습니다. 이것이 실패하면 암호학적으로 서명된 마커가 있는지 확인합니다 — thebeautifulmarchoftime — GitHub 커밋 기록에서 찾고, 내장된 RSA 키에 대해 도메인을 검증합니다. 둘 다 실패하면 피해자 자신의 계정이 생성하는 공개 GitHub 저장소를 통해 유출하며, 해당 저장소는 다음과 같이 설명됩니다: "Shai-Hulud: Here We Go Again". Microsoft는 폴백 경로 중 하나가 탈취한 GitHub 토큰을 암호화하지 않고 이중 Base64로 인코딩한다고 지적합니다.

전파는 토큰 품질에 따라 결정된다. Elastic에 따르면, 이 워리는 자격 증명 스윕이 npm 토큰을 찾아낼 때에만 활성화되는데, 해당 토큰에는 패키지 쓰기 권한과 2단계 인증 없이 게시할 수 있는 능력이 있어야 한다. 그런 다음 각 쓰기 가능한 패키지의 최신 tarball을 다운로드하고, 스스로를 주입하고, 패치 버전을 올린 뒤 다시 게시한다. BleepingComputer는 또한 모든 토큰이 탈취되기 전에 레지스트리의 whoami 엔드포인트를 통해 실시간으로 검증된다고 덧붙였다. 이러한 루틴이 하나의 침해된 신원을 수백 개의 릴리스로 바꿔 놓은 원인이었고, 악성 버전이 평범한 패치 버전 상향처럼 보이는 이유이기도 하다.

An HTML card titled 'The first four hours, 4 August 2026', subtitled 'What the sources put where in the infection order, and the three counts the campaign is quoted with'. A four-step numbered column headed 'Infection order' reads: 1, 09:00 UTC: files pushed to main — attacker adds IDE persistence payloads to the keyv repository, then publishes a new keyv version, per Wiz Research; 2, the victim's CI builds the payload — keyv 6.0.0 reaches npm through the compromised account's own GitHub Actions workflow carrying valid provenance and a SLSA Build Level 3 attestation, per Orca Security and Zscaler ThreatLabz; 3, the worm republishes with stolen tokens — stolen npm tokens with write access and 2FA bypass bump patch versions, at peak roughly one infected package per second, per Elastic Security Labs and Zscaler ThreatLabz; 4, IDE hooks travel with the repos — a stolen GitHub App token commits .claude/settings.json and .vscode/tasks.json to up to 50 branches per accessible repository, per Elastic Security Labs. A right-hand panel headed 'Three counts, three units' shows: 400+, unique npm packages compromised by 6 August, per Elastic and Microsoft Threat Intelligence; 868, worm-reached packages across 1,381 versions, per Aikido via BleepingComputer and Orca Security; 1,300+, package versions with 2 billion monthly downloads, per CSA Singapore advisory AD-2026-009, 6 August. A footer reads: each figure is a snapshot taken while the campaign was still running; none of the cited sources claims a final total.

npm install이 필요 없는 감염 경로

이 캠페인을 초기 npm 웜과 구분 짓는 핵심은 설치가 이제 유일한 침입 경로가 아니라는 점이다. Elastic은 AI 코딩 도구 사용자를 겨냥한 두 가지 추가 실행 경로를 설명한다. SessionStart 훅은 .claude/settings.json에서 node .claude/setup.mjs를 새 Claude 세션이 시작될 때 실행한다. VS Code의 경우 folderOpen 작업은 .vscode/tasks.json에서 node .vscode/setup.mjs를 감염된 저장소가 열릴 때 실행한다. 마이크로소프트의 분석은 동일한 네 가지 아티팩트—.claude/settings.json, .claude/setup.mjs, .vscode/tasks.json 및 .vscode/setup.mjs—를 나열하며, 이를 원래 npm 설치가 완료된 후 페이로드를 다시 시작할 수 있는 이차 감염 경로라고 설명한다.

이를 극적으로 확장하는 조건은 탈취된 자격 증명에 있습니다. 만약 GitHub App 토큰이 그중에 있으면, Elastic은 웜이 악성 훅을 커밋한다고 보고합니다. 대상은 접근 가능한 저장소당 최대 50개의 브랜치이며, 각각에 .claude/settings.json 및 .vscode/tasks.json을 주입합니다. Elastic의 결론은 해당 브랜치 중 하나를 복제해 여는 개발자는 프로젝트를 여는 것만으로 감염될 수 있다는 것입니다. 즉, 패키지 설치가 전혀 없고 따라서 설치 스크립트 방어도 경로에 전혀 없다는 뜻입니다.

Zscaler의 평가에 따르면, 지속성 훅은 패키지 삭제 후에도 살아남고 VS Code 또는 Claude Code에서 프로젝트를 열기만 하면 다시 실행되는데, 이는--ignore-scripts라는, 이전 npm 웜 이후 많은 팀이 도입한 방어 조치를 우회합니다. 그 권고는 바로 이어집니다: IDE 및 AI 에이전트 구성 파일—.claude/, .cursor/, .vscode/, .gemini/—을 실행 가능한 코드로 취급하고 소스와 동일한 엄격함으로 검토하십시오.

공격의 저장소 쪽 부분에 대한 지문이 있습니다. Elastic은 웜이 생성한 커밋이 작성자 이름 claude 및 커밋 메시지 chore: update config로 식별될 수 있다고 보고하며, Wiz도 동일한 메시지 문자열을 기록합니다. Elastic은 또한 해당 커밋 메시지에 탈취된 GitHub 토큰이 위협 문구와 함께 포함되어 있었다고 추가하며, 그 문구는 — IfYouBlockThisAPIKeyItWillCrashTheLiveProductionServersOfAllThirdPartyClients — 이며, 이를 개발자들이 토큰을 해지하지 않도록 겁을 주려는 시도로 해석합니다. Wiz는 초기 커밋에서 동일한 문자열을 기록하며, IDE 후크를 도입하는 커밋에서는 더 짧은 메시지로 전환된 것으로 기록합니다.

A generated abstract illustration on a deep navy field: a tall repository-shaped block stands at centre, its face divided into thin horizontal branch lines. A narrow beam of pale light from an editor-shaped pane at upper left falls across the block, and where the beam touches one branch line, a small bright hook symbol appears and a thin amber thread runs down into a dark pool at the base. The other branch lines remain untouched and faintly lit. No text, numbers, people, brand marks or organisation logos appear. The OrcaRouter logo is composited in the bottom-right corner.

수치가 일치하지 않는데, 그것은 모순이 아닙니다.

영향 범위에 대해 공개된 모든 수치는 각기 다른 단위에 연결되어 있으며, 이 단위들은 상호 교환할 수 없다. Elastic Security Labs는 8월 6일 글에서 400개 이상의 고유 npm 패키지가 침해된 것으로 집계했다. Microsoft Threat Intelligence는 여러 무관한 게시자에 걸친 400개 이상의 패키지를 설명했다. BleepingComputer가 인용한 Aikido는 최소 868개의 패키지, 1,381개의 버전이라고 밝혔다. Orca Security는 월간 다운로드 6억 1,900만 건 이상인 keyv 및 cacheable 패키지 10개가 직접 오염되었다고 보고한 뒤 추가로 868개의 패키지와 1,381개의 버전이 웜에 의해 침투되어 월 20억 건 이상 설치된다고 밝혔다. 8월 6일 자 싱가포르 CSA 권고 AD-2026-009에는 1,300개 이상의 침해된 패키지 버전이 기록되어 있으며, 이는 합계 월 20억 건의 다운로드를 나타낸다.

그것들은 서로 다른 세 가지 분모 — 패키지, 패키지 버전, 월간 다운로드량 — 이며, 아직 진행 중이던 캠페인의 서로 다른 세 시점에서 측정한 것입니다. Zscaler의 속도에 관한 설명은 이들이 왜 서로 다른지를 보여 줍니다. 그 설명에 따르면 웜은 4시간 이내에 400개가 넘는 패키지로 스스로 전파되었고, 최고조에 달했을 때 대략 초당 감염된 패키지 1개를 게시했습니다. 나중 수치를 이전 수치의 정정으로 보는 것은 잘못입니다. 각각은 스냅샷이며, 인용된 어느 출처도 최종 총계를 주장하지 않습니다.

Elastic이 라이브러리 수준에서 제시한 노출 수치는 가장 자주 인용되며 가장 모호함이 적은 수치다. Elastic은 지난달 keyv 단독 다운로드 수가 6억 건을 넘었다고 보고했으며, flat-cache는 5억 8,000만 건에 가깝고, cacheable-request는 1억 3,700만 건을 넘고, cacheable은 3,000만 건을 넘고, cache-manager는 1,600만 건을 넘었다. CSA의 권고문에는 침해된 특정 버전들이 나열되어 있으며, 그중에는 keyv 6.0.0, flat-cache 6.1.24, file-entry-cache 11.1.6, cacheable-request 13.0.20, cacheable 2.5.1, cache-manager 7.2.10, @cacheable/utils 2.5.1, ecto 5.0.1이 포함된다.

철회의 함정

영향을 받은 버전을 설치한 대응자는 첫 번째 문제에 이어 두 번째 문제에 직면합니다. Elastic에 따르면 조건부 GitHub 대체 경로에서 페이로드는 자격 증명 접근을 유지하는 토큰 모니터 구성 요소를 설치하려고 시도하며, 모니터링 중인 토큰이 해지될 경우 실행되는 파괴적 핸들러. Zscaler는 이 메커니즘을 운영 수준에서 자세히 설명하며 이를 토큰 해지 트랩이라고 부릅니다. 웜은 탈취한 토큰으로 60초마다 GitHub API를 폴링하는 백그라운드 프로세스를 설치하고, 토큰이 4xx 오류를 반환하면 — 즉 피해자가 토큰을 해지했다는 의미입니다 — 2차 파괴 페이로드가 실행되며, 이는 변형에 따라 원격 코드 실행 또는 사용자 홈 디렉터리 삭제를 포함할 수 있습니다.

Wiz는 데드맨 스위치가 명령 및 제어 서버의 응답에 따라 선택적으로 활성화된다고 추가로 설명합니다: 운영자는 어떤 명령을 활성화할지와 스위치가 해지 여부를 감시해야 할 토큰을 지정하는 값을 반환할 수 있습니다. Wiz는 또한 모니터가 사용자 엔드포인트에서 유효한 응답을 찾는다고 지적하므로, 해당 엔드포인트에서 유효한 모든 토큰 유형이 트리거로 사용될 수 있습니다.

실질적인 결과는 BleepingComputer와 그 보도에서 인용한 Aikido의 지침에 기록되어 있습니다. 영향을 받은 버전을 설치한 개발자 워크스테이션이나 CI/CD 러너는 침해된 것으로 취급해야 합니다.해당 패키지가 이후 제거되었더라도 마찬가지입니다. 왜냐하면 2단계 실행으로 인해 토큰이 노출되고 빌드 무결성이 훼손되었을 수 있기 때문입니다. Microsoft의 지침도 빌드 측면에서 같은 결론에 도달하며, 수명 주기 스크립트가 활성화된 상태에서 영향을 받은 패키지를 설치한 조직은 워크스테이션이나 빌드 러너를 잠재적으로 침해된 것으로 취급하고 영향을 받은 시스템과 다운스트림 아티팩트를 신뢰할 수 있는 소스에서 재빌드해야 한다고 경고합니다.

An HTML card titled 'Established, assessed, and not shown', subtitled 'The same five analyses, sorted by how strongly each claim is supported — not by how confidently it is written'. Three columns. ESTABLISHED lists: the keyv maintainer's GitHub account was compromised, files were pushed to main and a release was published on 4 August 2026; at least keyv 6.0.0 shipped through the victim's own CI with valid provenance and SLSA Build Level 3; a preinstall hook ran setup.mjs, which downloaded Bun v1.3.13 to execute an obfuscated payload; the collector scanned 300+ credential patterns including Anthropic, Claude, Codex, Cursor, OpenAI and Gemini; hooks in .claude/settings.json and .vscode/tasks.json run on session start and folder open; a GitHub App token extended the hooks to up to 50 branches per accessible repository; more than 400 unique packages were compromised within days; CSA Singapore published advisory AD-2026-009 on 6 August 2026. ASSESSED lists: attribution to the Mini Shai-Hulud family and a TeamPCP lineage; that the account takeover was the initial access route; that provenance must not be read as proof of safety, since it validates the pipeline and not the account; that IDE configuration files should be treated as executable code. NOT SHOWN lists: how the maintainer account was taken over, reported as unknown by Zscaler; any single final total, since the counts use packages, versions and downloads interchangeably; any confirmed reuse of a stolen AI-tooling credential against a provider account; who the operator is beyond vendor attribution; any remediation outcome, account recovery or enforcement action. A footer cites Elastic Security Labs, Microsoft Threat Intelligence, Wiz Research, Orca Security and CSA Singapore AD-2026-009.

확립된 것, 평가되는 것, 그리고 누구도 입증하지 않은 것

원 기록과 다섯 개의 독립 분석은 메커니즘에 수렴하며, 그 메커니즘적 주장은 이 파일에서 가장 강력한 부분입니다.

• keyv 유지관리자의 GitHub 계정이 탈취되어 2026년 8월 4일, 릴리스가 게시되기 전에 악성 파일이 main에 직접 푸시되었습니다 — Wiz, Orca Security, BleepingComputer, CSA Singapore가 일관되게 보고했습니다.

• 적어도 keyv 6.0.0은 피해자 자신의 CI 파이프라인을 통해 유효한 provenance를 지닌 채 npm에 도달했으며, Zscaler는 SLSA Build Level 3 증명을 명시했습니다. 이 주장이 이 사건을 주목할 만하게 만드는 핵심이며, 서로의 작업을 공동 작성하지 않은 세 조직에 의해 뒷받침됩니다.

• preinstall 훅이 setup.mjs를 실행했으며, 이는 Bun v1.3.13을 다운로드하고 AI 코딩 도구 자격 증명을 포함해 300개가 넘는 자격 증명 패턴을 스캔하는 난독화된 페이로드를 실행했습니다 — Elastic과 Wiz는 런타임 버전과 AI를 겨냥한 자격 증명 목록 모두에 동의합니다.

• .claude/settings.json 및 .vscode/tasks.json에 작성된 훅은 세션 시작 시와 폴더를 열 때 실행되며, GitHub App 토큰은 그 범위를 확장하여 접근 가능한 저장소당 최대 50개의 브랜치까지 이르게 했습니다 — 이는 Elastic의 발견으로, 개발자가 저장소를 여는 것만으로 감염될 수 있다는 Elastic의 주장에 대한 근거입니다.

• 수일 내에 400개가 넘는 고유 패키지가 침해되었으며, 국가 규제 기관인 CSA Singapore는 2026년 8월 6일 영향을 받은 버전과 지표를 나열한 권고문 AD-2026-009를 발표했습니다.

출처가 사실이 아니라 평가로 취급하는 내용은 표시되어야 한다. Wiz는 해당 페이로드를 TeamPCP가 공개한 Shai-Hulud-Open-Source 저장소를 기반으로 구축된 "Mini" Shai-Hulud 악성코드 계열의 후손으로 설명하며, 여기에는 몇 가지 중대한 변경이 있다고 밝힌다. Orca Security는 이 공격을 TeamPCP에 귀속시키고, Zscaler는 ChainDrop을 TeamPCP와 연결하며 2025년 9월부터 이어지는 계보에 위치시킨다. 이것은 여러 업체의 귀속 합의일 뿐, 인용된 1차 문서가 특정 개인이나 단체에 관해 입증하는 내용은 아니다.

인용된 어떤 출처도 확립하지 못하는 세 가지가 있으며, 이 글도 그것을 채우지 않는다. 첫째, 어떻게 관리자 계정이 탈취되었는지: Zscaler는 분석 당시 정확한 메커니즘이 알려지지 않았다고 분명히 밝힌다. 둘째, 단일한 최종 총계: 400, 868, 1,300이라는 수치는 서로 다른 시점에서 패키지, 패키지 및 버전, 버전을 각각 집계한 것이며, 어떤 출처도 이 캠페인이 종료되었다고 주장하지 않는다. 셋째, 그리고 이 기록의 AI 관련 주장에서 가장 중요한 점은, 인용된 어떤 출처도 탈취된 Anthropic, Codex, Cursor, Gemini 또는 OpenAI 자격 증명이 제공자 계정에 재사용된 것이 확인된 사례를 보고하지 않는다는 것이다. 문서화된 것은 의도와 능력 — 명시적 대상 목록과 이를 달성하기 위해 구축된 수집기 — 이지, AI 제공자의 시스템에 대한 입증된 다운스트림 침해가 아니다.

이후 무엇이 바뀌었는가 — 그리고 대응자가 해야 할 일

기록에서 가장 구체적인 해결책은 플랫폼 변경입니다. Elastic은 다음으로 업그레이드할 것을 권장합니다: 기본적으로 preinstall 훅을 차단하는 npm 12 이상; Microsoft의 지침은 독립적으로 npm CLI v12와 함께 min-release-age 기능을 권장합니다. 이 기능은 커뮤니티가 침해가 빌드에 도달하기 전에 이를 포착할 수 있을 만큼 새 버전을 오래 보류합니다.

그 외에도, 출처들이 공개하는 대응 단계는 서로 크게 중복됩니다.

• Elastic: 영향을 받은 머신에서 세션 토큰을 포함한 모든 GitHub 토큰을 해지하고, npm 토큰(특히 쓰기 권한 및 2단계 인증 우회 권한이 있는 자동화 토큰)을 해지 및 재생성하며, 저장소에서 chore: update config from claude@users.noreply.github.com 메시지가 포함된 무단 커밋을 검색하고, 클라우드, Kubernetes, Vault, AI 도구 및 CI/CD 시크릿을 교체하며, npm 계정에서 2단계 인증을 활성화하십시오.

• Microsoft: 영향을 받은 엔드포인트와 빌드 호스트에서 npm 및 yarn 캐시를 삭제하고, 알려진 정상 버전으로 고정하며, 잠금 파일과 아티팩트에서 전이적 참조를 포함해 침해된 버전이 있는지 검토하고, 공유 기본 이미지와 골든 빌드 러너를 재빌드하며, 토큰 범위, 워크플로 승인, 릴리스 출처를 검토하십시오. 이 사건은 OIDC 게시를 통한 CI/CD 파이프라인 악용과 일치하기 때문입니다.

• CSA Singapore: 영향을 받은 버전을 개발, 빌드 및 CI/CD 환경에서 제거하고, 영향을 받은 시스템은 침해된 것으로 간주하여 재구축하며, 자격 증명을 교체하고, 클라우드 및 소스 코드 환경에서 무단 접근 여부를 검토하고, 공개된 지표를 모니터링하며, 허용 목록, 무결성 검증 및 출처 제어를 강화하십시오.

• Zscaler: .claude/, .cursor/, .vscode/ 및 .gemini/를 실행 가능한 코드로 취급하고, SLSA 또는 Sigstore 출처 증명을 안전성의 증거로 취급하는 것을 중단하며, 대신 비업무 시간 게시, 대량 버전 게시, 처음 게시하는 게시자와 같은 게시 행위에 대한 이상 탐지와 함께 계층화할 것.

해당 기록에는 교정 결과가 포함되어 있지 않습니다. 인용된 출처 중 악성 버전이 완전히 제거되었다거나 계정 복구, 체포 또는 규제 집행 조치가 이루어졌다고 보고한 곳은 없습니다. CSA의 권고는 방어자들을 위한 공지일 뿐, 특정 당사자에 대한 판정은 아닙니다.

이번 사건이 바꾸는 것은 하나의 분류다. 개발자 도구 설정 파일은 실행 경로이고, 편집기가 폴더를 여는 것은 실행 이벤트다. 그리고 출처 증명(provenance attestation)은 어떤 파이프라인이 패키지를 생성했는지에 대한 진술이지, 그 파이프라인이 실행될 때 누가 키를 쥐고 있었는지에 대한 진술이 아니다. 바로 그 지점이 첫 keyv 릴리스가 빠져나간 틈이다.