- 자기 전파형 웜이 keyv, cacheable과 공통 의존 패키지의 악성 버전을 게시했다. 오염 패키지 434개 이상, 버전 1,381개, 합산 월간 다운로드 20억 회 이상이다.
- 최초 침해 4분 뒤, 검증된 커밋으로
.claude/settings.json의SessionStart훅과.vscode/tasks.json의folderOpen작업이 추가됐다. - C2 주소는 이더리움 스마트 계약에서 조회해, 악성 코드를 바꾸지 않고도 인프라를 교체할 수 있게 했다.
- 에이전트 설정 파일은 보안 검사 도구가 읽지 않는 영역이었다. 에이전트가 설정 파일을 수정하는 호출을 통제 대상에 넣어야 한다.
1.개요
Shai-Hulud는 2025년 9월 처음 등장한 npm 자기 전파형 웜 계열이다. 감염된 개발 환경에서 npm 토큰을 탈취해 그 개발자가 관리하는 다른 패키지에 악성 버전을 게시하는 방식으로 확산한다. 8월 4일 시작된 6차 공격은 keyv(주간 다운로드 약 1억 2,700만 회), flat-cache, file-entry-cache 같은 기반 패키지를 발판으로 삼아 규모가 크게 늘었다.
Snyk, Aikido Security, Wiz Research, Socket, Endor Labs, OX Security 등 다수의 보안 기업이 동시에 분석을 공개했다.
2.공격 흐름
이번 공격의 핵심 변화는 지속성 확보 방식이다. 기존 공급망 공격은 패키지 설치 스크립트에 의존했다. 6차 공격은 코딩 도구가 저장소를 열 때
자동으로 실행하는 설정 항목을 노렸다. Claude Code의 SessionStart 훅은 세션이 시작될 때, VS Code의 folderOpen 작업은 폴더를 열 때 지정된 명령을 실행한다.
악성 커밋은 이 두 항목에 로더 실행 명령을 넣었다.
3.피해 규모
| 지표 | 보고된 값 |
|---|---|
| 오염된 패키지 | 434개 이상 |
| 오염된 버전 | 1,381개 |
| 합산 월간 다운로드 | 20억 회 이상 |
| 최초 침해부터 에이전트 지속성 커밋까지 | 4분 |
C2는 이더리움 스마트 계약에 저장된 도메인을 eth_call로 조회하는 방식이다. 방어자가 C2 도메인을 차단해도 공격자는 계약 값만 바꾸면 되고, 이미 배포된 악성 코드는 수정할 필요가 없다.
보고에 따르면 악성 코드는 자격증명 교체 과정을 노리는 장치까지 갖추고 있었다.
4.분석: 에이전트 설정 파일은 검사의 사각지대였다
보안 검사 도구는 패키지 코드, 설치 스크립트, 바이너리를 본다. 그러나 .claude/, .vscode/ 아래의 설정 파일은
지금까지 '개발자 환경 설정'으로 취급되어 검사 대상에서 빠져 있었다. 6차 공격은 이 사각지대를 정확히 노렸다.
6월 Amazon Q 사례(작업 공간 MCP 설정 자동 실행)와 7월 GhostApproval이 보여 준 흐름과도 일치한다. 코딩 에이전트와 편집기의 설정 파일은 이제 실행할 명령을 담는 실행 파일이며, 저장소를 여는 행위는 그 명령을 실행하는 행위가 된다. 공급망 공격자는 이 구조를 지속성 확보 수단으로 쓰기 시작했다.
5.위협 분류 매핑
이 사건의 공격 단계를 OWASP 에이전트 애플리케이션 Top 10(2026)과 MITRE ATLAS 기법에 대응시키면 다음과 같다. GuardTrail은 판정 결과에 같은 분류의 태그를 붙여 기록하고, SIEM으로 내보낼 때 함께 전달한다.
| 체계 | 항목 | 이 사건에서 |
|---|---|---|
| OWASP ASI | ASI04 에이전트 공급망 취약점 | 오염된 npm 패키지가 코딩 도구 설정으로 지속성을 확보했다 |
| OWASP ASI | ASI05 예기치 않은 코드 실행 | 저장소를 여는 순간 SessionStart 훅과 folderOpen 작업이 로더를 실행했다 |
| MITRE ATLAS | AML.T0098 AI Agent Tool Credential Harvesting | npm·GitHub·클라우드 토큰 수집 |
6.젠아이랩스 GuardTrail의 대응
젠아이랩스(GenAI Labs) GuardTrail은 AI 에이전트의 도구 호출을 실행 직전에 가로채 기록·판정·차단하는 Agent EDR이다. 개발자 PC의 코딩 에이전트(Claude Code 훅, stdio 래퍼)와 사내 MCP 서버(게이트웨이)에 설치되며, 차단 판정은 언어 모델이 아닌 결정적 정책으로 내린다. 제품 소개 · 위협 차단 · 도입 방식
- 편집기 작업 설정 수정을 승인 대상으로 지정한다. 고객 정책의
args_pattern으로.vscode/tasks.json처럼 정상 개발에서도 바뀌는 설정 파일의 수정을REQUIRE_APPROVAL로 설정한다. 오염된 지시나 프롬프트 인젝션으로 에이전트가 스스로 지속성 항목을 심는 경로를 막는다. - 에이전트 설정 변조를 기본 차단한다. 에이전트가
.claude/settings.json,.mcp.json같은 자기 도구 설정을 수정하는 호출은 내장 하드 정책hard.agent-config-tampering으로 차단한다. - 자격증명 반출을 차단한다. GitHub·AWS 토큰처럼 형식이 식별되는 자격증명이 발급처가 아닌 목적지로 향하는 에이전트 호출은 하드 정책으로 실행되지 않는다.
- 원격 코드 실행 패턴을 차단한다. 다운로드한 스크립트를 셸로 바로 실행하는 호출은 셸 구문을 해석해 판정하므로 래퍼나 치환으로 감춰도 같은 결과가 나온다.
- 설치 호출이 감사 기록에 남는다. 에이전트가 언제 어떤 패키지를 설치했는지 호출 단위로 남아, 오염 버전이 공개된 뒤 영향 범위를 즉시 확인할 수 있다.
고객 정책 예시
.claude/settings.json 변조는 내장 하드 정책 hard.agent-config-tampering이 기본으로 차단한다. 편집기 작업 파일 .vscode/tasks.json은 정상 개발에서도 자주 바뀌므로 하드 정책 대상이 아니며, 아래처럼 승인 대상으로 추가한다.
policies:
- id: agent-hook-config-approval
name: 에이전트 훅·편집기 작업 설정 수정 승인
effect: REQUIRE_APPROVAL
mode: enforce
reason: 저장소를 열 때 실행되는 설정(훅·작업)을 바꾸려면 승인이 필요합니다.
match:
tool: ["Write", "Edit", "*:write_file"]
args_pattern: ['\.claude/settings(\.local)?\.json', '\.vscode/tasks\.json']
판정 결과
Claude Code 설정 파일 수정은 내장 하드 정책이 차단하고, VS Code 작업 파일 수정은 고객 정책에 따라 승인 대기로 멈춘다. 아래 표는 위 정책을 GuardTrail 정책 엔진에 적용하고 guardtrail policy test --mode enforce로 각 호출을 판정한 실제 결과다. 인자에 넣은 키와 토큰은 공개 문서의 예시 값이다.
| 도구 호출 · 에이전트 | 판정 | 정책·사유 |
|---|---|---|
Write /work/app/.claude/settings.jsonagent:dev · 내장 정책 + 고객 정책 | 차단 | hard.agent-config-tamperingthe agent's own tool configuration (/work/app/.claude/settings.json) would be overwritten — after this, calls go wherever that file says and GuardTrail no longer sees them |
Edit /work/app/.vscode/tasks.jsonagent:dev · 내장 정책 + 고객 정책 | 승인 필요 | agent-hook-config-approval저장소를 열 때 실행되는 설정(훅·작업)을 바꾸려면 승인이 필요합니다. |
7.점검 방법
- 설정 파일 점검: 저장소 전체에서
.claude/settings*.json의hooks항목과.vscode/tasks.json의"runOn": "folderOpen"항목을 검색한다. - 의존성 확인: 잠금 파일에서 keyv, cacheable, flat-cache, file-entry-cache의 버전을 확인하고, 공개된 오염 버전 목록과 대조한다.
- 통신 차단: 빌드 환경에서 이더리움 RPC 엔드포인트로의 통신 여부를 확인하고 차단한다.
- 저장소 감사: 조직 GitHub에서 설명에 'Shai-Hulud: Here We Go Again'이 들어간 저장소를 검색한다.
8.권고 사항
- 감염이 의심되는 기기를 먼저 격리한다. 자격증명 교체는 지속성 항목을 제거한 뒤 깨끗한 기기에서 수행한다.
- 영향받은 패키지를 깨끗한 버전으로 고정하고,
--ignore-scripts로 설치한다. - 저장소의
.claude/settings.json훅과.vscode/tasks.json의folderOpen항목을 점검한다. - 빌드 환경에서 이더리움 RPC 엔드포인트로 가는 통신을 차단한다.
- GitHub 저장소 설명에 'Shai-Hulud: Here We Go Again' 문구가 있는지 감사한다.
참고 문헌
- Tech Times, keyv npm Supply Chain Attack Hides Malware in AI Agent Files Scanners Never Read (2026-08-05). techtimes.com
- Cloud Security Alliance, Research Archive, July 2026 (Amazon Q MCP Flaw, GhostApproval). labs.cloudsecurityalliance.org
관련 제품 · 보안 권고
- keyv 저장소. github.com
- Claude Code 훅 문서. docs.anthropic.com
- 젠아이랩스 GuardTrail. guardtrail.gensapps.com · 표준 커버리지
수치와 경위는 각 출처가 공개한 내용을 따랐다. 접근 확인 2026-08-11.