TanStack npm 패키지 공급망 침해 사고 및 악성 코드 주입 취약점 (CVE-2026-45321)
실무자 핵심 요약 (Executive Summary)
SECOPS ASSESSMENT2026년 5월 11일 19:20 ~ 19:26 UTC 사이에 배포된 총 42개 @tanstack/* 범위 내 84개 악성 패키지 버전
공격자가 GitHub Actions OIDC 신뢰 토큰을 탈취하여 공식 권한으로 자격 증명 탈취용 악성코드가 포함된 패키지를 npm에 업로드함
감염된 버전의 패키지를 즉시 삭제하고, 안전한 최신 버전으로 강제 업데이트 및 빌드 환경의 자격 증명(API Key 등) 재설정
영향받는 제품 및 버전 범위
권장 패치 및 임시 완화(Workaround) 가이드
PATCH & WORKAROUND1. 감염된 패키지 확인 및 강제 업데이트
프로젝트의 package.json 및 락파일(package-lock.json, yarn.lock, pnpm-lock.yaml)에서 2026년 5월 11일에 배포된 @tanstack/* 패키지가 있는지 확인하고, 즉시 안전한 버전으로 업데이트하십시오.
# npm을 사용하는 경우 캐시 삭제 후 재설치
npm cache clean --force
npm install @tanstack/react-router@latest
# yarn을 사용하는 경우
yarn cache clean
yarn upgrade-interactive --latest2. 자격 증명(Credentials) 회수 및 재설정
해당 시간대에 악성 패키지가 설치된 환경(개발자 로컬 PC, CI/CD 빌드 서버, 프로덕션 환경)에서 사용된 모든 환경 변수, API 키, AWS/GCP 자격 증명, npm 토큰 등은 유출된 것으로 간주하고 즉시 폐기 후 재발급해야 합니다.
3. GitHub Actions 보안 강화 (DevSecOps)
유사한 공격을 방지하기 위해 pull_request_target 트리거 사용 시 쓰기 권한이나 비밀값(Secrets)에 접근하지 못하도록 워크플로우 권한을 최소화하십시오.
# GitHub Actions 워크플로우 권한 최소화 예시
permissions:
contents: read
id-token: write # OIDC가 필요한 단계에서만 제한적으로 사용내 GitHub/GitLab 레포지토리에 이 취약한 패키지가 숨어 있는지 30초 만에 스캔하세요
간접 의존성(Transitive Dependency)에 포함된 취약점은 수동 확인이 불가능합니다. Git 연동 한 번으로 취약 버전 탐지부터 호환성을 유지하는 최소 버전 업그레이드 PR까지 자동 생성하세요.
취약점 발생 원리 및 공격 메커니즘
본 취약점은 TanStack 라이브러리의 배포 파이프라인(CI/CD)을 겨냥한 고도로 정교한 공급망 공격(Supply Chain Attack)입니다. 공격자는 GitHub Actions의 설계 및 설정 취약점 3가지를 연쇄적으로 악용(Chaining)하였습니다:
- Pwn Request (pull_request_target 오설정): 외부 포크(Fork) 저장소의 PR 요청이 기본 저장소의 권한을 가진 컨텍스트에서 실행되도록 허용된 취약점을 악용했습니다.
- GitHub Actions 캐시 오염 (Cache Poisoning): 포크 경계 간의 신뢰 관계를 악용하여 빌드 캐시를 악성 코드로 오염시켰습니다.
- OIDC 토큰 메모리 추출: 실행 중인 Actions 러너 프로세스의 런타임 메모리에서 npm 레지스트리 인증용 OIDC(OpenID Connect) 신뢰 토큰을 추출하여 탈취했습니다.
결과적으로 공격자는 공식 배포 워크플로우 자체를 수정하지 않고도, 탈취한 OIDC 토큰을 사용해 npm 레지스트리에 정상적인 배포자로 위장하여 자격 증명을 탈취하는 악성 패키지를 업로드할 수 있었습니다.
공식 보안 권고문 및 참조 링크
On 2026-05-11, between approximately 19:20 and 19:26 UTC, 84 malicious versions across 42 @tanstack/* packages were published to the npm registry. The publishes were authenticated via the legitimate GitHub Actions OIDC trusted-publisher binding for TanStack/router, but the publish workflow itself was not modified. The attacker chained three known vulnerability classes — a pull_request_target "Pwn Request" misconfiguration, GitHub Actions cache poisoning across the fork↔base trust boundary, and runtime memory extraction of the OIDC token from the Actions runner process — to publish credential-stealing malware under a trusted identity. Each affected package received exactly two malicious versions, published a few minutes apart.
일간 취약점 브리핑 및 긴급 Zero-Day 경보 구독
보안 실무자와 인프라·백엔드 엔지니어를 위해 매일 아침 주요 취약점과 패치 우선순위를 요약해 발송합니다.