OpenAI를 물어버린 npm 공급망 공격: TanStack 웜, AI 시대 보안의 민낯

48시간. 3개 패키지 레지스트리. 5억 1,800만 다운로드. 2026년 5월 11일 19:20 UTC, Mini Shai-Hulud라는 자가전파 웜이 TanStack의 합법적 CI/CD 파이프라인을 탈취했음. 42개 npm 패키지, 84개 악성 버전 — 전부 유효한 SLSA Build Level 3 서명을 달고 6분 만에 배포됨.

토큰 탈취가 아님. 타이포스쿼팅도 아님. 공급망 자체의 신뢰 인프라를 무기로 바꾼 것임. 피해자 목록에는 OpenAI 직원 2명, Mistral AI 소스코드 5GB 유출 위협, npm/PyPI/RubyGems 세 생태계에 걸친 수백 개 패키지가 포함됨.

npm 공급망 공격을 관통하는 핵심 질문은 하나임. npm은 보안 모델인가, 그냥 신뢰 모델인가.


Key Takeaways

  • Mini Shai-Hulud가 TanStack CI/CD 파이프라인을 탈취해 합법적 SLSA 서명이 달린 42개 패키지를 6분 만에 배포, OpenAI 직원 디바이스 감염
  • npm의 구조적 설계(postinstall 기본 실행, unpublish 불가, 캐시 공유)가 자가전파 웜을 가능하게 함 — pnpm은 이미 라이프사이클 스크립트를 기본 차단
  • TeamPCP가 웜 소스코드를 공개하고 $1,000 공격 콘테스트를 열어 카피캣 진입장벽을 붕괴시킴

웜의 귀환

FIG. 01 — 감염 체인

Mini Shai-Hulud 감염 체인
01

1단계

포크 PR 제출

공격자가 TanStack 저장소를 포크하고 pull_request_target 트리거를 노린 PR 제출. 베이스 저장소의 시크릿에 접근 가능.

02

1단계

캐시 오염

PR 워크플로가 pnpm-store 캐시 키를 덮어씀. GitHub Actions 캐시가 포크 PR과 베이스 저장소 간 공유.

03

2단계

합법적 릴리즈 실행

TanStack의 정상 릴리즈 워크플로가 오염된 캐시를 복원하며 악성 의존성 로드.

04

2단계

OIDC 토큰 추출

악성 코드가 러너 프로세스 메모리에서 OIDC 토큰을 추출. SLSA Build Level 3 서명으로 게시 가능.

05

3단계

42개 패키지 6분 만에 게시

84개 악성 버전이 합법적 서명과 함께 배포. npm 역사상 최초의 provenance-valid 웜.

06

3단계

자가전파

웜이 피해자의 npm 토큰으로 동일 maintainer의 모든 패키지에 악성 버전 재게시.

SOURCE: TanStack 포스트모템, StepSecurity, The Hacker News

3단계 체인 공격을 순서대로 보면 이렇게 됨. 쉽게 말해, 은행 금고를 은행 자체 보안 시스템으로 여는 강도 영화임.

1단계: Pwn Request

공격자가 TanStack 저장소를 포크(Fork)하고 풀 리퀘스트(Pull Request)를 제출했음. 여기까지는 GitHub에서 매일 수천 번 일어나는 일임. 그런데 이 PR이 노린 건 pull_request_target이라는 GitHub Actions 트리거였음. 포크가 아닌 원본 저장소의 시크릿 권한으로 실행되는 특수 트리거임. 비유하면, 방문자 출입증이 실수로 금고 접근 권한까지 포함된 격임 (StepSecurity).

악성 PR은 합법적 CI/CD 실행 중 활성화되는 워크플로 파일을 주입한 것임.

2단계: 캐시 오염

PR 워크플로 실행 중, 공격자가 TanStack의 pnpm-store 캐시 키를 덮어씀. 나중에 합법적 릴리즈 워크플로가 실행될 때 오염된 캐시를 복원하게 됨. 깨끗한 라벨이 붙은 식료품 창고에서 오염된 재료를 꺼내 쓰는 요리사와 같은 상황임.

GitHub Actions 캐시가 포크 PR과 원본 저장소 워크플로 사이에 범위를 공유하기 때문에 가능한 일임. 보안 격리보다 개발자 편의를 우선시한 설계 선택의 결과임 (TanStack 포스트모템).

3단계: OIDC 토큰 추출과 자가전파

오염된 캐시가 합법적 릴리즈 러너 안에서 활성화된 상태에서, 공격자가 러너 프로세스 메모리에서 OIDC 토큰을 직접 추출함. OIDC 토큰이란 ‘나는 합법적 게시자’라는 신분증임. 이 토큰으로 유효한 SLSA Build Level 3 provenance attestation — 공급망 최고 신뢰 등급 — 이 달린 패키지를 게시할 수 있게 됨.

결과: 42개 패키지, 84개 버전, 전부 합법적 서명 완비. 6분 이내 게시 완료. 페이로드는 피해자의 npm 토큰을 이용해 같은 개발자가 관리하는 모든 패키지로 자가전파됨. 백도어가 아닌 웜인 것임 (The Hacker News).

악성 페이로드 router_init.js(2.3MB 난독화)에는 자격증명 수집기, 4중 병렬 유출 채널(HTTPS POST, GitHub 커밋 데드드롭(4096비트 RSA 키), 공격자 저장소, 피해자 저장소), Claude Code/VS Code 지속성 훅이 포함됨 (The Hacker News).


OpenAI를 문 순간

FIG. 02 — 공격 피해 규모

TanStack npm 공격 피해 규모

5.18억+

Worm Returns
Worm Returns (Photo: Pexels) by Ant Armada

누적 영향 다운로드

170+

감염 패키지

CVSS 9.6

심각도 등급

6분

게시 소요 시간

2명

OpenAI 직원 감염

SOURCE: Wiz, OpenAI, TanStack 포스트모템, The Hacker News

OpenAI 직원 2명의 디바이스가 침해된 TanStack 패키지를 통해 감염됨. 내부 소스코드 저장소의 제한적 자격증명이 유출되었고, 해당 저장소에 iOS/macOS/Windows 코드서명 인증서가 포함되어 있었음 (OpenAI Blog).

OpenAI 대응: macOS 서명 인증서 전량 교체. macOS 사용자는 ChatGPT Desktop, Codex App, Codex CLI, Atlas를 2026년 6월 12일까지 반드시 업데이트해야 함. 데드라인을 넘기면 앱이 작동하지 않게 됨 (OpenAI Blog).

불편한 사실이 있음. 두 달 만에 두 번째 인증서 교체임. 첫 번째는 2026년 4월 Axios/UNC1069 사건 이후였음. 해당 사건 후 도입된 보안 통제가 아직 ‘단계적 배포’ 중이었고, 감염된 2대는 아직 패치가 적용되지 않은 디바이스였음 (The Hacker News, SecurityWeek).

핵심은 이것임. OpenAI는 해결책을 알고 있었지만 배포를 끝내지 못한 것임. 웜이 먼저 그 틈을 찾았음.

FIRESCALE 명령 인프라

Hunt.io 분석이 밝힌 공격 인프라의 코드명은 FIRESCALE임. GitHub 커밋 메시지를 데드드롭 통신 채널로 사용하고 4096비트 RSA 키로 암호화함. 3개 별도 유출 경로를 운용. AWS GovCloud 19개 가용 영역 전부가 타겟. 이스라엘/이란 소재 디바이스에 대해서는 1/6 확률로 파괴 행위를 트리거함 — 최대 볼륨 오디오 폭발 후 전체 파일 삭제 (The Hacker News).

아마추어 소행이 아님. 인프라 정교함은 자금이 풍부한 범죄 조직이거나 국가급 역량을 시사하는 것임.


npm은 보안 모델이 아님

외부 연구자가 악성 TanStack 패키지를 20분 이내에 탐지했음. TanStack 자체 내부 알림은? 침묵. 프로젝트 관리자는 npm이나 GitHub이 아닌 커뮤니티에서 침해 사실을 알게 됨 (TanStack 포스트모템).

npm Trust Model Problem
npm Trust Model Problem (Photo: Pexels) by Ann H

구조적 문제를 보면 이렇게 됨. npm은 처음부터 보안 모델이 아니라 신뢰 모델로 설계됨. 네 가지 설계 선택이 Mini Shai-Hulud 같은 웜을 가능하게만 하는 것이 아니라 예측 가능하게 만드는 것임.

구조적 결함의미악용 결과
postinstall 스크립트 기본 실행어떤 패키지든 설치 시 임의 코드 실행 가능npm install만으로 웜 활성화
의존성 있는 패키지 unpublish 불가악성 tarball이 수시간 유지탐지 후에도 감염 창 확대
OIDC 신뢰 게시자 바인딩에 게시별 검토 없음CI/CD 침해 시 모든 게시 자동 승인합법적 attestation으로 웜 게시
캐시 범위가 포크와 원본 저장소 사이 공유포크 PR이 원본 저장소 캐시 오염 가능체인 공격 2단계

npm 대변인의 솔직한 인정이 모든 것을 말해줌: “막을 수 있는 레지스트리 정책이나 빌드 샌드박스 가드레일은 없음” (GeekNews).

pnpm은 이미 해결한 문제

pnpm은 2025년 말부터 strictDepBuilds: true를 기본값으로 설정해 명시적으로 허용하지 않는 한 라이프사이클 스크립트를 차단함. 비유하면, 모든 방문자가 금속탐지기를 통과해야 하는 건물 vs 로비에서 그냥 통과시키는 건물의 차이임 (pnpm docs).

Go와 Rust는 한 발 더 나감. 강력한 표준 라이브러리 덕분에 서드파티 의존성을 최소화함. Go 프로젝트가 의존성 10개를 끌어올 때, 비슷한 JavaScript 프로젝트는 400개를 끌어옴. 공격 표면 차이는 선형이 아닌 지수적인 것임.

한 개발자의 표현이 정확함: “이런 일이 정기적으로 일어나는 유일한 패키지 매니저가 npm임” (GeekNews).


크로스 생태계 감염: npm에서 RubyGems, PyPI까지

FIG. 03 — 보안 모델 비교

npm vs pnpm 보안 모델 비교
보안 기능
npm
pnpm
라이프사이클 스크립트
기본 실행 (postinstall)
기본 차단 (strictDepBuilds)
캐시 격리
포크/베이스 간 공유
프로젝트별 격리
Unpublish 정책
의존 시 삭제 불가
동일 npm 레지스트리 정책
OIDC 게시 검증
게시별 검증 없음
게시별 검증 없음
2FA 강제
메인테이너에게 선택적
선택적 (레지스트리 수준)
자가전파 방어
없음 — 웜 재게시 가능
라이프사이클 차단으로 활성화 방지

SOURCE: pnpm 문서, Mondoo, GeekNews

Korean Developer Implications
Korean Developer Implications (Photo: Pexels) by Theodore Nguyen

TanStack이 침해된 같은 주간(5월 11-14일), 감염이 확산됨.

RubyGems: “수백 개 패키지가 관련된 대규모 악성 공격”을 탐지한 후 모든 신규 사용자 가입을 중단함. 레지스트리 역사상 처음인 조치임 (The Hacker News).

Node-IPC: 3개 버전(9.1.6, 9.2.3, 12.0.1)에 90개 카테고리 자격증명 수집기가 삽입됨. AWS, GCP, Azure, SSH 키, Claude AI 토큰, Kiro IDE 자격증명까지 타겟. 12.0.1 버전은 SHA-256 핑거프린트 매칭으로 사전 식별된 특정 머신에서만 선택적으로 실행됨. 배포 전에 어떤 개발자를 노릴지 정확히 계산해둔 것임 (The Hacker News).

Checkmarx: TeamPCP가 KICS Docker 이미지, VS Code 확장, GitHub Actions 침해 후 수주 만에 Checkmarx Jenkins AST 플러그인을 재침해함. “초기 복구가 불완전했거나 잔존 거점이 남아 있었던 것임” (The Hacker News).

GemStuffer: 150개 이상의 RubyGems가 데이터 유출 채널로 악용됨. 영국 지방정부 포털 데이터를 스크래핑해서 gem 아카이브에 임베딩한 것임 (The Hacker News).

모든 것을 바꾼 $1,000 콘테스트

TeamPCP가 Breached 사이버범죄 포럼과 협력하여 $1,000(약 140만 원) Monero 상금의 공급망 공격 콘테스트를 개최함. 점수 산정 기준은 침해 패키지의 주간/월간 다운로드 수 — 생태계 피해 극대화를 인센티브로 건 것임 (Socket).

그리고 Shai-Hulud 웜 소스코드를 Breached CDN에 오픈소스로 공개함. 공급망 공격의 진입 장벽이 무너진 것임 (SecurityWeek).

탈취된 자격증명은 랜섬웨어 그룹과 파트너십으로 수익화 중임. Mistral AI 사례가 대표적임: 내부 소스코드 5GB, 가격 $25,000(약 3,500만 원) BIN (The Hacker News).

위협 행위자공격 벡터규모수익화
TeamPCP (Mini Shai-Hulud)CI/CD 파이프라인 탈취 + 자가전파170+ 패키지, 5.18억 다운로드자격증명 판매 + 랜섬웨어 파트너십
TeamPCP (Checkmarx)Jenkins 플러그인 침해기업 CI/CDBitwarden CLI 연쇄 공격
TeamPCP (콘테스트)$1,000 Monero 현상금공개 경쟁다운로드 수 기반 점수 산정
미상 (Node-IPC)SHA-256 타겟팅 실행90개 자격증명 카테고리타겟 개발자 스파이
GemStufferRubyGems 데이터 유출150+ gems정부 데이터 스크래핑

한국 개발자에게 주는 의미

한국 프론트엔드 생태계는 React와 Next.js — npm 기반 — 위에서 돌아감. TanStack Query(구 React Query)와 TanStack Router는 국내 기업 프로젝트에서 표준 의존성임. 5월 11일 19:20~19:50 UTC 사이에 npm install을 실행한 모든 개발자가 잠재적 영향권에 있는 것임.

Career Takeaway: Supply Chain Security
Career Takeaway: Supply Chain Security (Photo: Pexels) by Tiger Lily

가정이 아님. 해당 30분 감염 윈도우에 CI/CD 빌드가 실행되었는지를 한국 기업 개발팀이 실제로 확인해야 함.

기업 대응 체크리스트

한국 개발팀을 위한 5가지 즉시 실행 항목:

우선순위조치기한
P0package-lock.json / pnpm-lock.yaml에서 2026-05-11 게시된 TanStack 버전 감사즉시
P1영향 받은 CI/CD 러너에서 접근 가능한 모든 자격증명 교체48시간
P2GitHub Actions 워크플로의 pull_request_target 사용 여부 감사1주
P3npm에서 pnpm(strictDepBuilds: true)으로 마이그레이션 평가1개월
P4GitHub Actions 캐시 정책 검토 — 포크 PR 캐시를 원본 저장소에서 격리1개월

OpenAI macOS 도구(ChatGPT Desktop, Codex App, Codex CLI, Atlas)를 사용하는 조직이라면 6월 12일 업데이트 데드라인은 협상 불가임. 해당 날짜 이후 기존 인증서로 서명된 앱은 작동하지 않게 됨 (OpenAI Blog).

더 넓은 교훈이 있음. 소프트웨어 자재 명세서(SBOM, Software Bill of Materials) — 쉽게 말해, 소프트웨어의 영양성분표로 모든 구성 요소와 출처를 나열하는 것 — 가 규제 산업에서 컴플라이언스 요건이 되어가고 있는 것임.


한줄 코멘트와 직장인 시사점

3년 전만 해도 “소프트웨어 공급망 보안”은 니치 전문 분야였음. Mini Shai-Hulud 이후, 필수 역량이 됨. SBOM 생성, CI/CD 파이프라인 하드닝, 의존성 감사를 이해하는 개발자가 뚜렷한 커리어 우위를 가지게 된 것임.

Career Takeaway: Supply Chain Security
Career Takeaway: Supply Chain Security (Photo: Pexels) by Tiger Lily

지금 중요한 스킬: SLSA provenance 레벨과 그 한계 이해, GitHub Actions 보안 설정(특히 pull_request_target과 캐시 격리), 의존성 잠금 파일 감사, 패키지 매니저의 보안 속성 평가.

Mini Shai-Hulud가 증명한 것: 합법적 CI/CD 파이프라인을 통해 최고 신뢰 등급인 provenance attestation을 위조할 수 있다는 것임. ‘신뢰하되 검증하라’는 원칙은 죽었음. 의존성에 대한 제로 트러스트(Zero Trust) — 공항 보안처럼 아무리 자주 와도 매번 검사하는 방식 — 가 새로운 기준인 것임.


한줄 코멘트. npm은 보안 모델이 아님. 신뢰 모델임. Mini Shai-Hulud는 시스템을 깨뜨린 것이 아니라 시스템이 설계된 대로 사용한 것임.

직장인 시사점. CI/CD 파이프라인을 감사하고 SLSA provenance의 빈틈을 비기술 관리자에게 설명할 수 있는 개발자 — 다음 웜이 터졌을 때 승진하는 사람이 바로 그 사람일 것임.


자주 묻는 질문 (FAQ)

Q. npm 공급망 공격에서 TanStack AI 웜이란 무엇인가요?

A. Mini Shai-Hulud는 TanStack의 합법적 GitHub Actions CI/CD 파이프라인을 3단계 체인 공격으로 탈취한 자가전파형 웜입니다. pull_request_target 트리거 악용, pnpm-store 캐시 오염, 러너 프로세스 메모리에서 OIDC 토큰 추출을 결합해 유효한 SLSA Build Level 3 서명이 달린 42개 패키지 84개 악성 버전을 6분 만에 배포했습니다.

Q. OpenAI 직원은 어떻게 TanStack npm 침해에 영향을 받았나요?

A. 침해된 TanStack 패키지를 통해 OpenAI 직원 2명의 디바이스가 감염되었고, 코드서명 인증서가 포함된 내부 저장소의 제한적 자격증명이 유출되었습니다. OpenAI는 macOS 인증서를 전량 교체했으며 2026년 6월 12일까지 ChatGPT Desktop, Codex App, Codex CLI, Atlas 업데이트를 완료해야 합니다.

Q. 개발자가 npm 공급망 웜으로부터 보호하려면 어떻게 해야 하나요?

A. 핵심 방어책은 pnpm의 strictDepBuilds: true 기본값으로 라이프사이클 스크립트를 차단하고, GitHub Actions 워크플로의 pull_request_target 사용을 감사하며, 포크 PR 캐시를 원본 저장소에서 격리하고, 침해 의심 시 CI/CD 러너에서 접근 가능한 모든 자격증명을 교체하는 것입니다.

Q. TeamPCP의 공격 콘테스트는 왜 중요한가요?

A. TeamPCP는 Mini Shai-Hulud 캠페인의 위협 그룹으로, 웜 소스코드를 공개하고 Breached 사이버범죄 포럼에서 $1,000 Monero 현상금 콘테스트를 개최했습니다. 침해 패키지의 다운로드 수로 점수를 매기는 방식이어서 카피캣 공급망 공격의 진입장벽을 크게 낮추었습니다.


References

  1. TanStack. “Postmortem: TanStack npm supply-chain compromise.” (2026-05-12) https://tanstack.com/blog/npm-supply-chain-compromise-postmortem
  2. OpenAI. “Our response to the TanStack npm supply chain attack.” (2026-05-13) https://openai.com/index/our-response-to-the-tanstack-npm-supply-chain-attack/
  3. The Hacker News. “Mini Shai-Hulud Worm Compromises TanStack, Mistral AI, Guardrails AI.” (2026-05-12) https://thehackernews.com/2026/05/mini-shai-hulud-worm-compromises.html
  4. The Hacker News. “TanStack Supply Chain Attack Hits Two OpenAI Employee Devices.” (2026-05-15) https://thehackernews.com/2026/05/tanstack-supply-chain-attack-openai.html
  5. Wiz. “Mini Shai-Hulud Strikes Again: TanStack + more npm Packages Compromised.” (2026-05-12) https://www.wiz.io/blog/mini-shai-hulud-strikes-again-tanstack-more-npm-packages-compromised
  6. StepSecurity. “Mini Shai-Hulud Is Back: A Self-Spreading Supply Chain Attack.” (2026-05-12) https://www.stepsecurity.io/blog/mini-shai-hulud-is-back-a-self-spreading-supply-chain-attack-hits-the-npm-ecosystem
  7. Socket. “TeamPCP and BreachForums Launch $1,000 Supply Chain Attack Contest.” (2026-05-13) https://socket.dev/blog/teampcp-supply-chain-attack-contest
  8. SecurityWeek. “TeamPCP Ups the Game, Releases Shai-Hulud Source Code.” (2026-05-14) https://www.securityweek.com/teampcp-ups-the-game-releases-shai-hulud-worms-source-code/
  9. SecurityWeek. “OpenAI Hit by TanStack Supply Chain Attack.” (2026-05-15) https://www.securityweek.com/openai-hit-by-tanstack-supply-chain-attack/
  10. Mondoo. “npm Supply Chain Security in 2026.” (2026-05) https://mondoo.com/blog/npm-supply-chain-security-package-manager-defenses-2026
  11. pnpm. “Mitigating supply chain attacks.” https://pnpm.io/supply-chain-security
  12. GeekNews (Hada.io). “사후 분석: TanStack npm 공급망 침해.” (2026-05-12) https://news.hada.io/topic?id=22879

이 글은 정보 제공 목적의 사이버보안 분석이며, 전문 보안 컨설팅을 구성하지 않음. 조직별 보안 평가는 전문가와 함께 수행해야 함.

이 글이 도움이 되셨나요?

Buy me a coffee