Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
tanscript-exploit-check — TanStack/Mini Shai-Hulud npm 공급망 공격(CVE-2026-45321)에 대한 IOC 검사기 | Kitploit
도구/GitHubGitHub/nkopylov/tanscript-exploit-check
Indicator of Compromise (IOC) ManagementVulnerability AnalysisForensicsThreat IntelligenceSupply Chain SecurityIncident Response
GitHubnkopylov/tanscript-exploit-check

tanscript-exploit-check

TanStack/Mini Shai-Hulud npm 공급망 공격(CVE-2026-45321)에 대한 IOC 검사기

저장소 보기
12개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

미니 샤이-훌루드 공급망 공격 — IOC 점검기

root@kitploit:~
curl -fsSL https://raw.githubusercontent.com/nkopylov/tanscript-exploit-check/main/check-tanstack-exploit.sh | bash

또는 클론하여 로컬에서 실행:

root@kitploit:~
git clone https://github.com/nkopylov/tanscript-exploit-check.git
cd tanscript-exploit-check
./check-tanstack-exploit.sh [프로젝트_디렉토리 ...]

발생한 일

이 점검기는 TeamPCP의 미니 샤이-훌루드 공급망 공격 캠페인 두 차례의 물결을 다룹니다:

1차 물결: TanStack CI/CD 침해 (2026년 5월 11일)

2026년 5월 11일 (19:20-19:26 UTC), 공격자가 6분 간격으로 42개의 @tanstack/* npm 패키지에 걸쳐 84개의 악성 버전을 게시했습니다. 이 공격은 Mistral AI, UiPath, OpenSearch 등의 패키지에도 영향을 미쳐 npm과 PyPI 전체에서 총 170개 이상의 패키지가 피해를 입었습니다.

유지 관리자 자격 증명은 도난당하지 않았습니다. 공격자는 3단계 공격을 통해 CI/CD 신뢰 체인 자체를 악용했습니다:

  1. pull_request_target 익스플로잇 — 버려진 GitHub 포크가 기본 리포지토리의 보안 컨텍스트에서 공격자 코드를 실행하는 PR을 열었습니다
  2. GitHub Actions 캐시 오염 — 포크의 코드가 공유된 pnpm 캐시를 오염시켜, 이후 합법적인 릴리스 워크플로에 감염시켰습니다
  3. 프로세스 메모리에서 OIDC 토큰 추출 — 악성 코드가 GitHub Actions 러너의 메모리에서 직접 npm 게시 토큰을 추출하여 유효한 SLSA Build Level 3 증명 어태스테이션이 포함된 패키지를 생성했습니다

2차 물결: "atool" npm 계정 탈취 (2026년 5월 19일)

2026년 5월 19일 (01:39-02:06 UTC), 손상된 atool npm 계정 ([email protected])이 두 차례의 자동화된 물결로 314개 패키지에 걸쳐 637개의 악성 버전을 게시했습니다. 영향이 큰 대상은 다음과 같습니다:

  • size-sensor (월 420만 다운로드)
  • echarts-for-react (월 380만 다운로드)
  • @antv/scale (월 220만 다운로드)
  • timeago.js (월 115만 다운로드)
  • 310개 이상의 추가 @antv/* 및 기타 패키지

이 물결은 Bun 기반 페이로드(498KB index.js)를 "preinstall": "bun run index.js"를 통해 트리거했으며, 2단계 페이로드는 포크 객체 공유 익스플로잇을 통해 antvis/G2 GitHub 리포지토리에 푸시된 가짜 커밋에 숨겨졌습니다.

악성 코드의 기능 (두 물결 모두)

두 물결 모두 동일한 "미니 샤이-훌루드" 도구 키트 계열을 사용합니다:

  • 자격 증명 수확: 80개 이상의 환경 변수, AWS 전체 체인(환경 변수 → 설정 → IMDSv2 → ECS → Secrets Manager), GitHub PAT, npm 토큰, SSH 키, K8s 토큰, Vault 토큰, 비밀번호 관리자(1Password, Bitwarden, pass, gopass)
  • 지속성: gh-token-monitor(1차 물결) 및 kitty-monitor(2차 물결) 데몬(LaunchAgent/systemd 이용); .claude/settings.json 및 .vscode/tasks.json에 훅 삽입
  • 유출: P2P 네트워크(1차 물결), GitHub Git Data API + OpenTelemetry 추적으로 위장한 HTTPS(2차 물결)
  • CI/CD 남용: toJSON(secrets)를 덤프하는 워크플로우 인젝션, npm OIDC 토큰 교환
  • 데드맨 스위치: 데몬 활성 상태에서 GitHub 토큰이 취소되면 rm -rf ~/ 실행
  • 데드 드롭 C2(2차 물결): GitHub 커밋 검색 API에서 firedalazer 키워드를 폴링, RSA-PSS 서명된 명령 수신

이 스크립트가 확인하는 항목

영향을 받은 패키지

1차 물결: TanStack (42개 패키지)

@tanstack/router* 및 @tanstack/start* 패키지만 영향을 받았습니다. 영향 없음: @tanstack/query*, @tanstack/table*, @tanstack/form*, @tanstack/virtual*, @tanstack/store.

전체 42개 패키지 목록은 전체 권고를 참조하세요.

2차 물결: atool 계정 (314개 패키지)

npm 사용자 atool([email protected])이 게시한 모든 패키지가 2026년 5월 19일에 악성 버전을 받았습니다. 영향이 큰 패키지는 다음과 같습니다:

패키지월간 다운로드 수
size-sensor420만
echarts-for-react380만
@antv/scale220만
timeago.js

그 외 310개 이상의 패키지는 주로 @antv/* 범위(@antv/g2, @antv/g6, @antv/l7, @antv/s2, @antv/x6, @antv/f2 등), ai-figure, timeago-react, jest-canvas-mock, jest-date-mock 등입니다.

전체 목록은 SafeDep 분석을 참조하세요.

대응 방법 (침해된 경우)

중요: 토큰을 취소하기 전에 데드맨 스위치를 비활성화하십시오. 데몬이 활성 상태인 동안 토큰이 취소되면 악성코드가 $HOME을 삭제합니다.

  1. 지속성 데몬(gh-token-monitor 및 kitty-monitor)을 종료하고 LaunchAgent/systemd 서비스를 제거하십시오
  2. 지속성 파일(.claude/router_runtime.js, .vscode/setup.mjs, ~/.local/share/kitty/cat.py, /var/tmp/.gh_update_state 등)을 삭제하십시오
  3. node_modules와 잠금 파일을 삭제하고 --ignore-scripts로 다시 설치하십시오
  4. 모든 자격 증명(npm, GitHub, AWS, GCP, SSH 키, Vault 토큰, 비밀번호 관리자 토큰 등)을 교체하십시오
  5. DNS/방화벽 수준에서 공격자 도메인을 차단하십시오(api.masscan.cloud, filev2.getsession.org, git-tanstack.com, t.m-kosche.com)
  6. 2026년 5월 11~19일 기간의 클라우드 제공업체 로그를 감사하십시오

공식 공지 및 참고 자료

1차 물결: TanStack (5월 11일)

  • CVE-2026-45321 (CVSS 9.6 심각) — CVE 레코드
  • GHSA-g7cv-rxg3-hmpx — GitHub 권고
  • TanStack 사후 분석 — tanstack.com/blog/npm-supply-chain-compromise-postmortem
  • TanStack 강화 후속 조치 — tanstack.com/blog/incident-followup
  • GitHub 추적 이슈 — TanStack/router#7383

2차 물결: atool 계정 탈취 (5월 19일)

  • SafeDep 분석 — safedep.io/mini-shai-hulud-strikes-again-314-npm-packages-compromised

보안 연구원 분석

  • Socket.dev
  • Snyk
  • StepSecurity (최초 발견자)
  • Wiz
  • Orca Security
  • SecurityWeek

AI 코딩 에이전트용 강화 프롬프트

다음 프롬프트를 AI 코딩 에이전트(Claude Code, Cursor, Cline/OpenClaw, Windsurf, Hermes 등)에 복사하여 붙여넣으면 이와 같은 공급망 공격에 대해 프로젝트를 강화할 수 있습니다.

프롬프트 1: npm 게시 지연 (새 버전 격리)

공급망 공격에 대비하여 이 프로젝트의 npm 구성을 강화하십시오. 다음을 수행하십시오:

  1. 정확한 버전 고정: package.json의 모든 종속성에서 ^ 및 ~ 접두사를 제거하여 npm install이 새로 게시된 버전을 자동으로 가져오지 않도록 하십시오.

  2. 기본적으로 postinstall 스크립트 비활성화: .npmrc에 ignore-scripts=true를 추가하십시오. 그런 다음 package.json에 이 프로젝트가 실제로 필요로 하는 알려진 안전한 라이프사이클 스크립트만 실행하는 명시적인 "preinstall" 스크립트를 추가하십시오(있는 경우).

  3. CI에서 잠금 파일 기반 설치 강제: CI가 npm install이 아닌 npm ci를 사용하도록 하십시오. CI 구성 파일이 있으면 확인하고, 없으면 수동 단계로 기록하십시오.

  4. 증명 확인 추가: CI 파이프라인과 pre-push git 훅에 npm audit signatures 단계를 추가하십시오.

  5. 업데이트 정책 스크립트 생성: scripts/safe-update.sh를 생성하여 다음을 수행하도록 하십시오:

프롬프트 2: AI 에이전트 구성 강화

공급망 인젝션 공격(TanStack/Mini Shai-Hulud 캠페인이 .claude/settings.json 및 .vscode/tasks.json에 악성 훅을 주입한 것과 같은)에 대비하여 이 프로젝트의 AI 코딩 에이전트 구성을 감사하고 강화하십시오. 다음을 수행하십시오:

Claude Code (.claude/):

  1. .claude/settings.json 및 .claude/settings.local.json에서 셸 명령을 실행하는 hooks 항목을 검토하십시오. 특히 .claude/, .vscode/ 또는 node_modules/ 내에서 .js, .mjs 또는 .sh 파일을 실행하는 항목을 플래그하십시오.
  2. 합법적인 사용자 생성 목적으로 추적할 수 없는 훅을 제거하십시오.
  3. .claude/settings.local.json이 커밋되지 않도록 규칙을 추가하십시오(로컬로 유지되어야 함).

프롬프트 3: GitHub Actions 강화

CI/CD 공급망 공격에 대비하여 이 리포지토리의 GitHub Actions 구성을 감사하고 강화하십시오. 다음을 수행하십시오:

  1. pull_request_target 트리거 제거 또는 리팩토링 — 이 트리거는 포크에 의해 트리거되더라도 비밀에 접근할 수 있는 기본 리포지토리 컨텍스트에서 워크플로우 코드를 실행합니다. 필요한 경우 pull_request + 별도의 승인 게이트 워크플로우로 대체하십시오.

  2. 모든 서드파티 액션을 전체 커밋 SHA로 고정(태그나 브랜치가 아님). 예를 들어 actions/checkout@v4를 actions/checkout@<전체-sha>로 바꾸십시오. 가독성을 위해 태그를 주석으로 추가하십시오.

  3. 모든 워크플로우에 최소 권한 적용. 명시적인 permissions: 블록을 추가하십시오. 대부분의 워크플로우는 contents: read만 있으면 됩니다. 게시 워크플로우는 id-token: write가 필요하며 그 외에는 아무것도 필요하지 않습니다.

  4. 캐시 범위 제한: actions/cache를 사용하는 경우 캐시 키가 브랜치 범위로 지정되어 브랜치 간 오염을 방지하도록 하십시오. restore-keys를 신중하게 추가하십시오 — 신뢰할 수 없는 브랜치의 캐시를 복원하지 마십시오.

  5. 모든 작업의 첫 번째 단계로 StepSecurity Harden-Runner 추가: step-security/harden-runner@v2를 egress-policy: audit(허용된 엔드포인트를 알고 있으면 )와 함께 사용하십시오.

라이선스

MIT

도구 다운로드
#확인 항목설명
1데드맨 스위치지속성 데몬: gh-token-monitor(1차 물결), kitty-monitor(2차 물결)
2악성 프로세스알려진 공격자 프로세스 이름(두 물결 모두)
3페이로드 파일이름과 SHA-256 해시로 알려진 악성 파일(4개 해시)
4Claude Code 훅.claude/settings.json에 삽입된 훅 + 일반 SessionStart 휴리스틱
5VS Code 작업.vscode/tasks.json에 삽입된 작업 + 일반 runOn: folderOpen 휴리스틱
6GitHub Actions모든 워크플로우의 toJSON(secrets) + pull_request_target 경고
7npm 잠금 파일잠금 파일 내 손상된 패키지 버전
8선택적 종속성악성 @tanstack/setup 및 @antv/setup + 4개의 가짜 커밋 SHA
9네트워크 연결C2 인프라에 대한 활성 연결(5개 도메인/IP)
10DNS 캐시공격자 도메인의 이전 해상도(4개 도메인)
11Git 브랜치Dune 테마의 공격자 브랜치 명명 패턴
12수명 주기 스크립트휴리스틱: preinstall/postinstall의 bun run(설치된 패키지)
13데드 드롭 C2git 기록의 firedalazer 키워드 및 "Shai-Hulud" 마커
14GitHub 종속성휴리스틱: optionalDeps에서 커밋 SHA로 고정된 github: 종속성
패키지악성 버전최초 안전 버전
@tanstack/react-router1.169.5, 1.169.81.169.9
@tanstack/router-core1.169.5, 1.169.81.169.9
@tanstack/vue-router1.169.5, 1.169.81.169.9
@tanstack/solid-router1.169.5, 1.169.81.169.9
@tanstack/react-start1.167.68, 1.167.711.167.72
@tanstack/router-plugin1.167.38, 1.167.411.167.42
115만
  • 패키지 이름을 인수로 받음
  • 최신 버전이 게시된 시점 확인(npm view <pkg> time --json)
  • 버전이 3일 미만이면 업데이트 거부
  • 3일보다 오래되었으면 npm install <pkg>@latest --save-exact 실행
  • 변경 사항 요약 출력

애플리케이션 코드는 변경하지 마십시오. 구성 파일, .npmrc, package.json 스크립트 및 CI 구성만 수정하십시오.

.gitignore

VS Code (.vscode/):

  1. .vscode/tasks.json 및 .vscode/launch.json에서 예상치 못한 스크립트나 바이너리를 실행하는 작업을 검토하십시오.
  2. setup.mjs, router_runtime.js 등 이 프로젝트에 속하지 않는 파일을 참조하는 작업 항목을 제거하십시오.
  3. .vscode/extensions.json에서 인식하지 못하는 확장을 확인하십시오.

Cursor (.cursor/):

  1. .cursor/settings.json 및 규칙 파일에서 주입된 명령이나 훅을 검토하십시오.
  2. 위 VS Code와 동일한 검사 — Cursor는 .vscode/ 구성을 상속합니다.

일반:

  1. package.json에서 직접 작성하지 않은 preinstall, postinstall, prepare 또는 prestart 스크립트를 확인하십시오. 의심스러운 것은 플래그하십시오.
  2. .github/workflows/에서 pull_request_target을 사용하는 워크플로우를 확인하고, 보안 위험으로 플래그하고 이유를 설명하는 주석을 추가하십시오.
  3. .gitignore가 자격 증명을 유출할 수 있는 에이전트 세션 파일(.claude/projects/, .cursor/logs/ 등)을 제외하는지 확인하십시오.

발견한 사항과 변경한 사항을 보고하십시오. 애플리케이션 코드를 수정하지 마십시오.

block
  • 워크플로우 로그에서 비밀 확인: 어떤 워크플로우 단계도 ${{ secrets.* }} 또는 ${{ toJSON(secrets) }}를 stdout으로 출력하지 않는지 확인하십시오.

  • 모든 변경 사항을 보고하십시오. 애플리케이션 코드를 수정하지 마십시오.