Mini Shai-Hulud의 귀환: npm 생태계를 강타한 자가 전파형 공급망 공격 (5/11)

도입: 왜 이 소식을 주목해야 하는가
2026년 5월 11일, 개발자 커뮤니티에 충격적인 소식이 전해졌습니다. npm 생태계의 핵심 프레임워크인 TanStack의 42개 패키지에서 총 84개 버전이 악성 코드에 감염되었고, 이 공격은 불과 수시간 만에 Mistral AI, UiPath, OpenSearch, Guardrails AI 등 170개 이상의 패키지로 확산되었습니다.
이름하여 Mini Shai-Hulud. 사막의 벌레를 닮은 이 자가 전파형 악성코드 무기는 이번 공격에서 현재까지 확인된 가장 정교한 공급망 공격 기법을 선보였습니다. 특히 이번 공격은 유효한 SLSA Build Level 3 증명서를 동반한 최초의 npm 웜이라는 점에서, 개발자 보안 인식에 근본적 질문을 던지고 있습니다.
공격의 전체 흐름
1차 목표: TanStack 라우터 침투
2026년 5월 10일, 공격자는 zblgg라는 GitHub 계정을 생성하고 TanStack/router를fork하여 zblgg/configuration이라는 이름으로 저장했습니다. 이fork에는 악성 커밋(65bf499d)이 포함되어 있었는데, 주목할 점은 공격자가 Anthropic의 Claude GitHub App을 사칭한 claude 라는 작성자 정보를 사용했고, [skip ci] 접두사를 붙여 자동 CI 검증을 우회했다는 것입니다.
다음 날인 5월 11일 오전 10시 49분, 공격자는 "WIP: simplify history build"라는 제목의 PR #7378을 TanStack/router에 제출했습니다. 이 PR이 주목받은 이유는 TanStack의 bundle-size.yml 워크플로우가 pull_request_target 트리거를 사용하고 있었기 때문입니다.
pull_request_target은 Pull Request의fork에서 온 코드라 하더라도 신뢰할 수 있는 베이스 레포지토리의 컨텍스트에서 실행됩니다. 공격자는 이 취약한 워크플로우 구성을 역이용하여,fork의 악성 코드를 TanStack의 합법적인 빌드 환경에서 실행하는 데 성공했습니다.
2차: OIDC 토큰 추출
공격의 핵심은 GitHub Actions의 OpenID Connect(OIDC) 메커니즘을 오용한 것입니다. TanStack의 OIDC 신뢰 게시자(trusted publisher) 설정이 특정 보호 브랜치나 워크플로우 파일이 아닌 레포지토리 수준으로 설정되어 있었기 때문에,fork의 orphaned 커밋에서 트리거된 워크플로우 실행도 유효한 npm 게시 토큰을 요청할 수 있었습니다.
실제 공격 체인은 다음과 같습니다:
1. 악성 코드가 runner 프로세스의 메모리에서 OIDC 토큰을 추출
2. 이 토큰을 이용해 합법적인 npm 게시 파이프라인을 하이재킹
3. 악성 버전이 TanStack의 합법적 SLSA 프로venance와 함께 게시됨
4. SLSA가 "빌드 프로세스 자체는 정당하다"고 cryptographic하게 증명 — 코드의 악의는 증명하지 못함
3차: 자가 전파 메커니즘
TanStack 라우터 감염에 성공한 웜은 자체 전파 능력을 가동했습니다. 새로운 희생자의 환경에서:
1. npm 토큰 중 bypass_2fa가 true로 설정된 토큰 탐색
2. 동일 유지자가 게시한 모든 패키지 열거
3. GitHub OIDC 토큰을 각 패키지의 게시 토큰으로 교환
4.수해자의 게시 파이프라인을 통해 악성 버전 자동 게시
이 과정이 반복되면서 Mistral AI, UiPath, DraftLab 등 수십 개의 조직이 단 몇 시간 만에 악성 패키지 공개자를명단에 올랐습니다.
멀웨어의 정체: router_init.js
감염된 패키지들은 npm에 게시될 때 router_init.js라는 난독화된 JavaScript 파일을 포함하고 있었습니다. 이 파일의 기능을 분석한 보안 기업들은 다음과 같은 위협 기능을 보고했습니다:
크리덴셜 훔치기 대상:
• 주요 클라우드 제공자(AWS, GCP, Azure) API 키
• 암호화폐 지갑 파일
• AI 도구(Claude, OpenAI) API 키
• 메신저 앱의 세션 데이터
• GitHub Actions 시크릿
• SSH 키 및 GPG 키
데이터 유출 경로:
• 기본: filev2.getsession[.]org 도메인으로 전송 (Session Protocol P2P 인프라 활용 — 기업 방화벽에서 차단되기 어려움)
• 폴백: 탈취한 GitHub 토큰을 이용해 claude@users.noreply.github.com 명의로 attacker 통제의 GitHub 레포지토리에 암호화된 데이터 커밋
IDE 지속성:
• Claude Code와 Microsoft VS Code의 시작 시 자동 실행 훅 설치
• gh-token-monitor 서비스 설치 — 토큰을 주기적으로 재탈취

• 두 개의 악성 GitHub Actions 워크플로우 주입 — 레포지토리 시크릿을 JSON으로 직렬화 후 api.masscan[.]cloud으로 유출
가장 불길한 기능: 데드맨 스위치
이 멀웨어는 npm 토큰 취소 시 컴퓨터를 완전 삭제하는 데드맨 스위치도 탑재하고 있습니다. 매 60초마다 api.github.com/user 엔드포인트를 폴링하여 토큰이 취소되었는지 확인하고, 취소된 경우 rm -rf ~/ 명령을 실행하여 감염된 머신의 모든 데이터를 삭제합니다. 단순 크리덴셜 도용이 아닌 wipwer 멀웨어로 진화한 것입니다.
대응 및 수습 조언
TanStack은 5월 11일당만 자체 포스트모텀을 공개했습니다. 핵심 결론은 "npm 토큰은 탈취되지 않았으며, npm 게시 워크플로우 자체는 침해되지 않았다"는 것입니다. 공격자는 npm 토큰 대신 GitHub OIDC 토큰을남용하여 합법적 게시 파이프라인을 하이재킹했습니다.
즉시 확인해야 할 사항
1.수영향 버전 사용 여부:
• @tanstack/react-router: 1.169.5, 1.169.8
• @tanstack/vue-router: 1.169.5, 1.169.8
• @tanstack/solid-router: 1.169.5, 1.169.8
• @tanstack/router-core: 1.169.5, 1.169.8
• @tanstack/react-start: 1.167.68, 1.167.71
• @tanstack/router-plugin: 1.167.38, 1.167.41
• @mistralai/mistralai: 2.2.2 ~ 2.2.4
2. 안전하다고 확인된 패밀리:
@tanstack/query, @tanstack/table, @tanstack/form, @tanstack/virtual, @tanstack/store*는 이번 공격과 무관합니다.
3. 감염 환경에서 해야 할 일:
• 5월 11일에 영향을 받는 버전을 설치한 환경은 완전히 침해된 것으로 간주해야 합니다
• 해당 호스트에서 접근 가능한 모든 시크릿을 즉시 순환(rotation)
• npm 토큰 취소 전 시스템 격리 및 포렌식 이미지 획득을 먼저 수행 (토큰 취소 시 데드맨 스위치 가동 위험)
• GitHub 계정의 경우,근기 활동 로그를 검토하고 의심스러운 세션을 폐기
왜 이번 공격이 특히 위험한가
이전의 공급망 공격이 시크릿을 탈취한 후 합법적 권한으로 악성 패키지를 게시했다면, 이번 Mini Shai-Hulud는 프로세스 자체를 하이재킹했습니다. 이 방식의 혁신적인 위험은 다음과 같습니다:
1. 증명 불가능한 정당성: SLSA Build Level 3 provenance는 "이 패키지가 TanStack의 빌드 파이프라인에서 나왔다"고 cryptographic하게 보장하지만, "그 코드가 안전하다"고는 보장하지 않습니다
2. 신뢰 체계 전복: 개발자들이 "provenance가 유효하면안전"이라고 믿는 전제를 무너뜨렸습니다
3. 자동 전파: 인간의 개입 없이 타인의pipi프라인을 통해 전파 — 속도와 규모가 이전 공격과 질적으로 다릅니다
개발자가 취해야 할 방어 조치
| 조치 | 설명 |
|---|---|
| OIDC 신뢰 게시자 제한 | 토큰 발행이 레포지토리가 아닌 특정 브랜치 + 특정 워크플로우 파일로 제한되도록 설정 |
pull_request_target 사용 금지 | fork 코드 실행이 필요한장경에서는 workflow_run 트리거로 대체 |
| npm 토큰 권한 최소화 | bypass_2fa 옵션 비활성화, 게시 전용 토큰에최소적 권한 부여 |
| 패키지 설치 전 해시 검증 | npm audit 및 Socket, Snyk 등의 보안 도구 활용 |
| CI 환경 격리 | CI runner에서 시크릿 접근 최소화, 워크플로우별 IAM 역할 분리 |
정리
Mini Shai-Hulud의 5월 공격은 공급망 보안에 대한 개발 생태계의 인식 수준을 다시 한 번 시험했습니다. SLSA와 같은 cryptographic 증명 체계가 "안전"을 보장한다는 환상을 깨뜨뜨렸고, OIDC 트러스트 구성의 미묘한 차이가 수백만 개발자의 환경을 위험에 빠뜨릴 수 있음을 보여주었습니다.
취약한 pull_request_target 설정, 과도한 OIDC 신뢰 범위, bypass_2fa 토큰 — 이 세 가지 각각은관리 가능한 사소한 실수처럼 보입니다. 그러나 이 세 가지가 함께 체인되면, 수백만 Weekly하재을 자랑하는 프레임워크가 하루아침에 악성코드 배포 통로가 됩니다.
토큰 취소 전에 시스템을 격리하라. 이 한 줄의 조언이 모든 개발자와 보안팀의 우선 순위여야 합니다.
📚 출처
'자동화&툴 리뷰' 카테고리의 다른 글
| Sovereign Tech Fund, KDE 소프트웨어 개발에 100만 유로 이상 투자 완벽 가이드 (0) | 2026.05.15 |
|---|---|
| GitHub를 떠나 Forgejo로 이동하기 — 개발자가 알아야 할 핵심 정리 (0) | 2026.05.15 |
| CodeBurn - AI 코딩 도구 토큰 사용량/비용 추적 TUI 대시보드 완벽 가이드 (0) | 2026.05.11 |
| 내 삶에 의미(부족)를 주기 위해 aarch64 어셈블리로 웹 서버 만들기 (0) | 2026.05.11 |
| React 및 Next.js에서 다수의 보안 취약점 공개, 즉시 패치 권고 완벽 가이드 (0) | 2026.05.09 |