⚠️ Cursor, Claude Code, Copilot 등 AI 코딩 도구를 사용 중이라면 이미 감염되었을지도 모릅니다. mini-shai-hulud 웜이 지금 이 순간에도 npm 의존성을 파고들고 있습니다.
⚠️ If you use Cursor, Claude Code, Copilot, or any AI coding agent — you may already be infected. The mini-shai-hulud worm is tunneling through your npm dependencies RIGHT NOW.
핵심 요약
AI 코딩 도구 사용 시 npm 의존성 관리가 허술하면 악성 웜에 감염될 수 있으니 버전을 고정하고 철저히 감사하라는 경고.
- 의존성 고정 — package.json에서 ^나 ~ 같은 범위를 제거하고 정확한 버전을 명시해야 함.
- npm 감사 — npm audit을 주기적으로 실행하여 취약점을 확인하고 안전하게 수정해야 함.
- AI 보안 — AI 에이전트에게 패키지 설치 전 취약점 검사를 수행하도록 시스템 프롬프트를 설정해야 함.
- 전이 의존성 — overrides 기능을 활용해 직접 설치하지 않은 하위 패키지의 취약점까지 관리해야 함.
TL;DR:
mini-shai-hulud는 고정되지 않은 npm 패키지를 통해 활발히 퍼지고 있습니다. 만약 package.json에서 ^, ~, * 같은 유연한 버전 범위를 사용 중이라면, AI 에이전트가 일상적인 npm install 과정에서 몰래 감염된 버전을 설치했을 수 있습니다. 오늘 당장 의존성을 확인하고 수정하세요.
🪱 mini-shai-hulud란 무엇인가?
듄의 거대한 모래벌레 이름을 딴 mini-shai-hulud는 느슨한 버전 제약이 걸린 패키지를 가로채 npm 생태계를 파고드는 웜입니다. 이 웜은 vibe-coding 세션이나 AI 에이전트가 사람이 어떤 버전이 설치되는지 검토하지 않고 자동으로 npm install을 실행한다는 점을 악용합니다.
이 웜은 다음을 수행할 수 있습니다:
- 환경 변수 및 API 키 탈취
- 빌드 결과물에 악성 코드 주입
- 프로젝트가 배포하는 패키지로 스스로 확산
🛡️ 1단계: package.json의 모든 의존성 고정하기
Stop using fuzzy ranges. Change this:
"dependencies": {
"axios": "^1.6.0",
"lodash": "~4.17.0"
}
To exact pinned versions:
"dependencies": {
"axios": "1.6.8",
"lodash": "4.17.21"
}
Also commit your package-lock.json to version control. Never .gitignore it.
🛡️ 2단계: AI 에이전트에게 설치 전 감사 요청하기
Add this to your agent system prompt or first message in every coding session:
"Before running npm install or adding any package, check the exact version for known CVEs using npm audit. Only install if the version is clean. Pin the exact version in package.json."
🛡️ 3단계: 지금 바로 npm audit 실행하기
npm audit
If you see HIGH or CRITICAL vulnerabilities, do not ignore them.
To auto-fix safe upgrades:
npm audit fix
⚠️ Do NOT blindly run npm audit fix --force it can downgrade major versions and break your app.
🛡️ 4단계: 최상위 패키지를 망가뜨리지 않고 전이(중첩) 의존성 업그레이드하기
This is the tricky part. Sometimes the vulnerable package isn't one you installed directly, it's a dependency of a dependency.
Option A: Use npm overrides (npm v8.3+)
In package.json, force a specific version of a transitive dep:


