요약 / 핵심 포인트
악명 높은 Shai-Hulud 웜이 진화하여 npm에서 Go ecosystem으로 확산되었습니다. 더 이상 종속성 내에 숨어 있지 않고, 프로젝트를 여는 순간 VS Code 및 Claude 설정을 무기화하여 비밀을 훔칩니다.
웜이 새로운 호스트를 찾다
Shai-Hulud, 자체 복제하는 위협은 이전에 npm ecosystem을 지배했습니다. 개발자들이 감염된 패키지를 설치하면 의도치 않게 스캔이 트리거되어 npm 토큰, GitHub 토큰, AWS, GCP, 그리고 Azure 키와 같은 중요한 자격 증명을 훔쳤습니다. 이렇게 도난당한 토큰은 자동 전파를 촉진하여 피해자 자신의 npm 패키지의 손상된 버전을 게시하는 데 사용되었습니다.
2025년 9월에 처음 발견되어 11월에 더 큰 규모로 돌아온(500개 이상의 패키지와 700개 버전에 영향을 미침) 이 은밀한 위협은 이제 심각하게 확대되었습니다. Socket.dev에 의해 플래그 지정된 새로운 물결은 Shai-Hulud가 Go ecosystem, 특히 Verana Blockchain project를 침해했음을 보여줍니다. 이는 전통적인 JavaScript 환경을 넘어선 위험한 도약을 의미합니다.
결정적으로, 이것은 Go 취약점이 아닙니다. 이 공격은 Go의 빌드 프로세스를 완전히 우회합니다. 대신, Go 모듈의 소스 아카이브 내에 악성 JavaScript 파일을 삽입하여 개발자의 도구를 표적으로 삼습니다. 지속성은 `.claude` 및 `.vscode` 폴더를 통해 설정되며, `settings.json` 파일에는 Claude Code SessionStart 훅이 포함되어 있고, `tasks.json` 파일에는 `node .claude/setup.mjs`를 실행하는 VS Code 폴더 열기 작업이 포함되어 있습니다. 따라서 이 악성코드는 개발자가 프로젝트를 열거나 코딩 세션을 시작하는 순간 실행되어 에디터를 강력한 새로운 공격 벡터로 변모시킵니다.
이제 에디터가 공격 벡터입니다
Shai-Hulud 웜은 진화하여 패키지 레지스트리에 대한 의존성을 버리고 개발자 환경을 직접 표적으로 삼습니다. 이 정교한 새로운 벡터는 .vscode/tasks.json 및 .claude/settings.json과 같은 중요한 구성 파일 내에 악성 훅을 심어 신뢰하는 에디터를 직접적인 위협으로 만듭니다.
이 설계는 프로젝트 폴더가 열리거나 Claude Code 세션이 시작되는 즉시 악성코드가 활성화되도록 하여 전통적인 방어를 완전히 우회합니다. 이전에 중요한 보호 장치였던 `npm install --ignore-scripts` 플래그는 페이로드를 트리거하는 데 패키지 설치가 필요하지 않으므로 이제 아무런 보호도 제공하지 않습니다.
활성화되면 악성코드는 Bun을 활용하여 다음 단계를 디코딩하고, 정밀한 자격 증명 탈취 작업을 실행합니다. GitHub 토큰, AWS, GCP, 그리고 Azure 키를 포함한 민감한 데이터를 위해 .env files 및 기타 접근 가능한 위치를 표적으로 삼아 시스템을 체계적으로 공격합니다.
이 데이터 보물을 유출하기 전에 웜은 CrowdStrike, Defender, 그리고 SentinelOne과 같은 활성 보안 소프트웨어를 지능적으로 탐지합니다. 이 정찰 단계는 최대의 은밀성을 보장하여 기업의 확립된 보안 경계를 우회하고 도난당한 자산을 감지되지 않게 전송할 수 있도록 합니다.
전장은 종속성을 넘어섰습니다
전장은 근본적으로 변화했습니다. 귀사의 보안 태세는 더 이상 `node_modules` 및 패키지 종속성 감사에만 국한될 수 없습니다. Socket.dev에 의해 Go 모듈에서 감지된 새로운 Shai-Hulud 변종은 심오한 패러다임 변화를 보여줍니다. 공격 표면은 이제 전체 개발 환경, 특히 `.vscode/tasks.json` 및 `.claude/settings.json`과 같은 프로젝트 수준 구성을 포함합니다. 이는 선언된 종속성뿐만 아니라 복제된 저장소 내의 모든 파일에 대한 포괄적인 조사를 요구합니다.
결과적으로, 기존의 복구 조치는 이제 완전히 비효율적입니다. 악성 코드가 관리 가능한 패키지가 아니라 편집기 자동화를 위해 설계된 구성 파일 내에 직접 상주할 경우, `npm uninstall`은 아무런 방어책을 제공하지 못합니다. 웜의 지속성 메커니즘은 전통적인 종속성 관리를 우회하여, 설치 스크립트를 건드리지 않고도 폴더가 열리거나 코딩 세션이 시작되는 순간 코드를 실행할 수 있도록 합니다.
이는 심각한 다운스트림 위험을 초래합니다. 감염된 개발자는 손상된 `.vscode` 또는 `.claude` 파일을 인지하지 못한 채 이 악성 코드를 공유 코드베이스에 무심코 커밋할 수 있습니다. 이는 공격을 CI/CD 파이프라인으로 밀어 넣어 잠재적으로 프로덕션 환경과 중요 인프라를 손상시킬 수 있습니다. 이러한 진화하는 위협을 이해하는 것은 리더들에게 중요합니다. 웜의 역사에 대한 더 많은 정보는 Shai-Hulud npm Supply Chain Attack: What You Need to Know를 참조하십시오.
로컬 환경 강화
로컬 환경을 보호하려면 인식의 근본적인 변화가 필요합니다. IDE 및 AI 지원 구성, 특히 `.vscode` 및 `.claude` 폴더 내의 파일을 실행 가능한 코드로 취급하십시오. 새 프로젝트를 열기 전에 이러한 중요한 디렉터리를 수동으로 검사하십시오. 이러한 사전 예방적 조사는 Shai-Hulud가 사용하는 것과 같은 악성 후크가 폴더를 열거나 세션을 시작할 때 실행되는 것을 방지하여 즉각적인 침해로부터 시스템을 보호합니다.
Enjoying this? Get one like it in your inbox each morning.
one email a day · unsubscribe in two clicks · no third-party tracking
결정적으로, VS Code에서 자동 작업 실행을 비활성화하십시오. "Task: Manage Automatic Tasks" 명령으로 이동하여 이 기능이 꺼져 있는지 확인하십시오. 이 설정은 잠재적으로 악의적인 '폴더 열기' 작업이 명시적인 동의 없이 실행되는 것을 방지하여 은밀한 코드 실행에 대한 중요한 방어 계층을 추가합니다.
로컬 보호 조치를 넘어, 강력한 다층 방어 전략을 구현하십시오. GitHub, AWS, Azure와 같은 모든 서비스에 OIDC를 활용하는 단기적이고 최소 권한 토큰을 사용하십시오. 이는 도난당한 자격 증명의 가치를 크게 제한합니다. 또한, GitHub 워크플로우와 같은 CI 러너에 엄격한 송신 필터링을 적용하여 무단 데이터 유출 시도를 차단하고, 공격이 침투하더라도 민감한 데이터가 통제된 환경을 벗어날 수 없도록 보장하십시오.
자주 묻는 질문
Shai-Hulud 웜이란 무엇입니까?
Shai-Hulud는 소프트웨어 패키지를 감염시키는 자가 복제 웜입니다. 이는 npm 토큰, 클라우드 키, SSH 키와 같은 개발자 자격 증명을 훔쳐 더 많은 패키지를 오염시키고 자동으로 확산됩니다.
이 새로운 공급망 공격은 어떻게 변화했습니까?
패키지 설치 스크립트를 사용하는 대신, 새로운 공격 방식은 `.vscode/tasks.json` 및 `.claude/settings.json`과 같은 프로젝트 구성 파일에 악성 코드를 삽입합니다. 이 코드는 개발자가 편집기에서 프로젝트를 열 때 실행되어 일반적인 방어 수단을 우회합니다.
이 공격에 대해 'npm install --ignore-scripts' 플래그가 작동하지 않는 이유는 무엇입니까?
`--ignore-scripts` 플래그는 패키지 설치 중에 스크립트가 실행되는 것을 방지할 뿐입니다. 이 공격 벡터는 설치 스크립트를 사용하지 않으며, 폴더 열기 또는 코딩 세션 시작과 같은 편집기 작업을 통해 트리거되므로 해당 플래그는 효과가 없습니다.
개발자가 안전을 유지하기 위해 취할 수 있는 가장 중요한 조치는 무엇입니까?
개발 환경 구성을 실행 가능한 코드로 취급하십시오. 프로젝트를 열기 전에 복제된 저장소의 `tasks.json`과 같은 파일을 항상 검사하고, 편집기 설정에서 자동 작업 실행을 비활성화하십시오.
