DEEP DIVE REPORT

CVE-2026-45321: TanStack 미지정 취약점 영향과 대응 포인트

SecurityDesk
2026.05.30 조회 16

서론

2026년 5월 11일, 인기 있는 프론트엔드 프레임워크 생태계인 TanStack 프로젝트가 npm 공급망 공격을 받았습니다. 이 공격은 단일 취약점이 아니라, 세 가지 알려진 취약점 유형이 연쇄적으로 결합하여 발생한 복합적 보안 사고입니다. 공격자는 GitHub Actions의 pull_request_target 설정 오용, 캐싱 포이즈닝, 그리고 OIDC 토큰 메모리 추출 기법을 조합하여 42개의 TanStack 패키지에서 84개의 악성 버전을 성공적으로 배포했습니다.

이 사건은 현대 오픈소스 생태계가 직면한 공급망 보안의 심각성을 여실히 보여줍니다. TanStack은 Query, Router, Table, Form 등 프론트엔드 개발에서 널리 사용되는 라이브러리 모음으로, 전 세계 수만 개의 프로젝트에서 사용됩니다. 이번 공격은 단순히 특정 프로젝트의 문제가 아니라, CI/CD 파이프라인과 패키지 레지스트리의 신뢰 모델 전체를 재고해야 할 필요성을 제기합니다.

본론

취약점 상세 분석

공격 기법

공격자는 세 가지 취약점을 연쇄적으로 활용했습니다:

  1. pull_request_target "Pwn Request" 패턴
  2. GitHub Actions의 pull_request_target 이벤트는 PR 작성자가 아닌 타깃 저장소의 컨텍스트에서 워크플로우를 실행
  3. 이를 통해 포크 저장소의 코드가 기본 저장소의 권한으로 실행될 수 있음
  4. TanStack의 bundle-size.yml 워크플로우가 이 패턴을 사용하여 보안 경계를 우회

  5. GitHub Actions 캐싱 포이즈닝

  6. 공격자가 악성 코드가 포함된 캐시를 생성하고, 이를 프로덕션 워크플로우에서 복원하도록 유도
  7. 캐시 범위는 저장소별 공유되므로, PR 워크플로우에서 오염된 캐시가 메인 브랜치 배포 워크플로우에서 사용됨
  8. 캐시 키는 pnpm-lock.yaml 해시를 기반으로 생성되어 워크플로우 간 재사용됨

  9. OIDC 토큰 메모리 추출

  10. 워크플로우가 id-token: write 권한을 가지면 GitHub Actions 러너 프로세스 메모리에서 OIDC 토큰을 추출 가능
  11. 공격자는 /proc/*/maps/proc/*/mem을 사용하여 러너 프로세스의 메모리를 덤프
  12. 추출된 OIDC 토큰으로 npm 레지스트리에 직접 패키지를 게시

공격 시나리오

  1. 준비 단계 (2026-05-10)
  2. 공격자가 TanStack/router 저장소를 포크하고, zblgg/configuration으로 이름을 변경하여 포크 검색을 회피
  3. 악성 커밋(65sf499d)을 생성하여 30,000줄 이상의 악성 JS 페이로드를 주입

  4. 캐싱 포이즈닝 (2026-05-11 10:49-11:29)

  5. 공격자가 "WIP: simplify history build"라는 PR을 제출
  6. pull_request_target 워크플로우가 자동 실행되어 악성 코드 실행
  7. 오염된 pnpm 캐시가 GitHub Actions 캐시에 저장됨
  8. PR을 무효화하여 감시 회피

  9. 악성 패키지 배포 (2026-05-11 19:20-19:26)

  10. 정상적인 코드 머지로 트리거된 레귤러 워크플로우가 오염된 캐시를 복원
  11. 악성 코드가 워크플로우 러너에서 OIDC 토큰을 추출
  12. 추출된 토큰으로 npm 레지스트리에 직접 패키지를 게시
  13. 총 42개 패키지, 각 패키지당 2개의 악성 버전이 배포됨

악성 페이로드 동작

악성 패키지가 설치되면 다음 동작을 수행:

  • 자격증명 수집: AWS IMDS/Secrets Manager, GCP 메타데이터, Kubernetes 서비스 어카운트 토큰, Vault 토큰, ~/.npmrc, GitHub 토큰(환경변수, gh CLI, .git-credentials), SSH 개인키

  • 데이터 유출: Session/Oxen 메신저 파일 업로드 네트워크(filev2.getsession.org, seed{1,2,3}.getsession.org)를 통해 유출

  • 엔드투엔드 암호화되어 있어 IP/도메인 차단만으로 완화 가능
  • 공격자 제어 C2 서버 없이 유출

  • 자가 전파: registry.npmjs.org/-/v1/search?text=maintainer: API를 사용하여 피해자가 유지 관리하는 다른 패키지를 열거하고 동일한 주입으로 재배포

영향 범위

영향받은 패키지

  • 42개의 @tanstack/* 패키지가 영향을 받음 (각 패키지당 2개의 악성 버전)
  • 대상 패키지: @tanstack/history, @tanstack/react-router, @tanstack/router-core 등 Router 계열
  • 안전한 패키지: @tanstack/query, @tanstack/table, @tanstack/form, @tanstack/virtual, @tanstack/store, @tanstack/start (메타 패키지)

시간적 범위

  • 배포 시간: 2026-05-11 19:20-19:26 UTC (6분 동안 84개 버전 배포)
  • 감지 시간: 배포 후 20-26분 만에 외부 연구자(StepSecurity)에 의해 감지
  • 대응 완료: 배포 후 약 4시간 35분 만에 모든 악성 패키지가 npm 레지스트리에서 제거됨

잠재적 피해

  • 2026-05-11에 악성 버전을 설치한 모든 시스템은 잠재적 타겟
  • 공격자는 CI/CD 환경의 자격증명을 탈취하여 더 광범위한 공격 가능
  • 자가 전파 기능으로 인해 타깃이 유지 관리하는 다른 npm 패키지도 감염될 수 있음

국내 기업/기관 관점 대응 방안

탐지 방법

  1. 패키지 버전 확인

    # 영향받은 패키지 버전 확인
    npm list @tanstack/history
    npm list @tanstack/react-router
    npm list @tanstack/router-core
    
    # 특정 버전이 설치된 패키지 식별
    npm audit
    

  2. 악성 아티팩트 검색

  3. 패키지 디렉토리에서 router_init.js 파일 존재 여부 확인
  4. 크기: 약 2.3 MB (정상 패키지에는 존재하지 않음)
  5. 위치: 패키지 루트 디렉토리

  6. 의심스러운 네트워크 연결 확인

  7. 다음 도메인에 대한 연결 기록 확인:

    • filev2.getsession.org
    • seed1.getsession.org, seed2.getsession.org, seed3.getsession.org
  8. CI/CD 로그 검토

  9. 2026-05-11 19:20-19:26 UTC 사이의 npm 설치 로그 확인
  10. 의심스러운 패키지 버전 설치 이력 확인

점검 체크리스트

즉시 확인 (24시간 이내)

  • [ ] 2026-05-11에 TanStack 패키지를 업데이트/설치한 CI/CD 파이프라인 식별
  • [ ] 설치된 패키지 버전 확인 (악성 버전 여부)
  • [ ] CI/CD 환경에서 router_init.js 파일 검색
  • [ ] 의심스러운 네트워크 연결 로그 확인

심층 점검 (72시간 이내)

  • [ ] AWS, GCP, Kubernetes, Vault 자격증명 회전 여부 확인
  • [ ] GitHub 토큰, SSH 키, npm 토큰 취약점 점검
  • [ ] 탈취 가능한 자격증명이 있는 환경 격리 여부 확인
  • [ ] 로그 분석을 통해 추가 감염 징후 탐지

완화 및 대응 방안

  1. 패키지 재설치

    # 영향받은 패키지 재설치
    npm install @tanstack/history@latest
    npm install @tanstack/react-router@latest
    

  2. 자격증명 회전 (긴급)

  3. AWS: IAM 액세스 키, EC2 인스턴스 프로파일 토큰, Secrets Manager에 저장된 자격증명
  4. GCP: 서비스 계정 키, 메타데이터 API 토큰
  5. Kubernetes: 서비스 어카운트 토큰, ConfigMap/Secret에 저장된 자격증명
  6. Vault: Vault 토큰
  7. GitHub: GitHub 토큰, 앱 자격증명
  8. npm: npm 토큰
  9. SSH: SSH 개인키

  10. 네트워크 차단

  11. 방화벽/프록시에서 다음 도메인 차단:

    • filev2.getsession.org
    • seed{1,2,3}.getsession.org
  12. 취약한 CI/CD 구성 개선

  13. pull_request_target 워크플로우 감사 및 권한 제한
  14. 캐시 사용 패턴 검토 및 격리 강화
  15. OIDC 토큰 사용 범위 최소화
  16. 타사 액션 SHA 고정 (floating ref 사용 금지)

장기적 방어 전략

  1. SBOM(Software Bill of Materials) 도입
  2. 사용하는 모든 패키지의 버전을 추적
  3. 취약점 발생 시 영향 범위 신속 파악

  4. 패키지 서명 검증

  5. npm provenance 사용하여 패키지 출처 검증
  6. 패키지가 신뢰할 수 있는 소스에서 게시되었는지 확인

  7. CI/CD 보안 강화

  8. pull_request_target 사용 시 명시적 승인 프로세스 도입
  9. 워크플로우별 캐시 격리 구현
  10. 타사 액션 SHA 고정 및 정적 업데이트

  11. 의존성 모니터링

  12. 사용하는 패키지의 보안 권고사항 실시간 모니터링
  13. 자동화된 취약점 스캐너 도입 (예: npm audit, Snyk)

  14. 비상 대응 계획 수립

  15. 공급망 공격 발생 시 대응 프로세스 정립
  16. 자격증명 회전 시나리오 연습
  17. 보안 연락망 구성

결론

CVE-2026-45321은 단순한 코드 취약점이 아니라, 현대 소프트웨어 개발 생태계의 신뢰 모델 전체를 흔드는 사건이었습니다. 공격자는 알려진 세 가지 취약점을 연쇄적으로 조합하여, 타깃 프로젝트의 코드를 수정하지 않고도 신뢰할 수 있는 패키지로 악성 코드를 배포했습니다.

이번 사건의 핵심 교훈은 세 가지입니다. 첫째, CI/CD 파이프라인의 보안 경계는 명시적으로 정의되고 감시되어야 합니다. pull_request_target과 같은 기능은 편의성을 제공하지만, 잘못 사용되면 치명적일 수 있습니다. 둘째, 캐싱과 같은 공유 자원은 신뢰 경계를 넘어 유출될 수 있음을 인지해야 합니다. 셋째, OIDC와 같은 현대적 인증 방법도 메모리 추출과 같은 공격에 취약할 수 있습니다.

국내 기업과 기관은 이번 사건을 계기로 공급망 보안을 재검토해야 합니다. 특히, CI/CD 파이프라인의 구성을 감사하고, 패키지 출처 검증 프로세스를 도입하며, 자격증명 회전과 같은 비상 대응 계획을 수행해야 합니다. 공급망 공격은 증가하는 추세며, 이번 사건은 언제든 다른 프로젝트가 타깃이 될 수 있음을 보여줍니다.

다행히 TanStack 팀은 공격을 신속하게 감지하고 대응했습니다. 20분 만에 감지되고 4시간 35분 만에 모든 악성 패키지가 제거되었습니다. 하지만 악성 버전을 설치한 조직은 즉각적인 자격증명 회전과 보안 점검을 수행해야 합니다. 보안은 끊임없는 경계와 준비에 비례합니다.

참고자료

  1. NVD
    https://nvd.nist.gov/vuln/detail/CVE-2026-45321

  2. CISA Known Exploited Vulnerabilities Catalog
    https://www.cisa.gov/known-exploited-vulnerabilities-catalog?field_cve=CVE-2026-45321

  3. TanStack Postmortem: npm supply-chain compromise
    https://tanstack.com/blog/npm-supply-chain-compromise-postmortem

  4. GitHub Security Advisory (GHSA-g7cv-rxg3-hmpx)
    https://github.com/TanStack/router/security/advisories/GHSA-g7cv-rxg3-hmpx

  5. TanStack/router Issue #7383
    https://github.com/TanStack/router/issues/7383

  6. StepSecurity Analysis
    https://www.stepsecurity.io/blog/mini-shai-hulud-is-back-a-self-spreading-supply-chain-attack-hits-the-npm-ecosystem


본 컨텐츠는 AI 기술로 생성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하시시면 댓글을 통해 소중한 의견 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.

로그인

아직 댓글이 없습니다.

첫 번째 댓글을 작성해보세요!

IT 도구 서랍

→ Unix: 2025-01-15T09:30:00
→ 날짜: 1736934600

→ ASCII: ABC
→ 문자: 65 66 67

ASCII 코드표 — 클릭하면 입력란에 추가

DecHex약어설명
DecHex문자
DecHex문자

→ 유니코드: 홍길동
→ 문자: \ud64d\uae38\ub3d9