Mini Shai-Hulud Strikes Again: TanStack + more npm Packages Compromised

Detect and mitigate malicious npm packages linked to the latest Mini Shai-Hulud supply chain campaign targeting high-value developer tooling.

On 11 May 2026, TeamPCP launched a coordinated supply chain attack against the npm and PyPi ecosystems, compromising packages across multiple namespaces simultaneously. Impacted packages include:

  • Packages in the  @tanstack namespace, which includes @tanstack/react-router, one of the most widely-used routing libraries in the React ecosystem with approximately 12 million weekly downloads.

  • Packages in the @uipath namespace, which provides tooling for UiPath's enterprise automation platform, including @uipath/apollo-core, CLI tools, and agent SDKs.

  • The @mistralai/mistralai package, which is the official TypeScript client for the Mistral AI platform. The mistralai PyPi packages was also impacted.

  • The guardrails-ai LLM guardrails Python package.

See Affected Packages for detailed versions.

The npm team is aware of the campaign and has been acting quickly to remove the malicious package versions from the registry.

May 12, 2026, 11AM UTC update: Added additional IOCs and updated the affected packages table.

The TanStack vulnerability

The TanStack compromise exploited a chain of three vulnerabilities in GitHub Actions. The attacker created a fork of the TanStack/router repository (renamed to zblgg/configuration to evade fork-list searches), then opened a pull request that triggered a pull_request_target workflow. This workflow checked out and executed the attacker's fork code, which poisoned the GitHub Actions cache with a malicious pnpm store.

When legitimate maintainer PRs were later merged to main, the release workflow restored the poisoned cache. Attacker-controlled binaries then extracted OIDC tokens directly from the GitHub Actions runner's process memory (/proc/<pid>/mem). The attacker was able to use these tokens to publish the malicious package versions without ever stealing npm credentials.

The published packages contain two infection vectors: an optionalDependencies entry pointing to an orphan commit (github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c) that executes a payload via a prepare script, and an embedded ~2.3MB obfuscated file router_init.js placed directly in the package tarball.

Shortly after the @tanstack attack, packages in the @uipath namespace were compromised. These packages use a preinstall script (node setup.mjs) that downloads the Bun runtime and executes the payload. This is the same delivery mechanism that was seen in the earlier SAP compromise. The UiPath variant uses a re-obfuscated version of the same payload with a different campaign key but identical C2 infrastructure.

When executed, the payload is a credential stealer and self-propagating worm. It targets CI/CD tokens (GitHub Actions OIDC, GitLab, CircleCI), cloud credentials (AWS IMDSv2, GCP, Azure), Kubernetes service accounts, HashiCorp Vault, and package registry tokens. It uses stolen npm tokens and GitHub Actions OIDC tokens to publish poisoned versions of additional packages the victim has write access to, functioning as a worm that spreads through the npm ecosystem.

The payload exfiltrates stolen credentials via three redundant channels: a typosquat domain (git-tanstack[.]com), the decentralized Session messenger network, and GitHub API dead drops using stolen tokens.

On developer machines, the malware installs a persistent gh-token-monitor daemon (via macOS LaunchAgent or Linux systemd) that polls GitHub every 60 seconds. On receiving a 40X error due to token revocation, the monitor attempts to run rm -rf ~/. The daemon automatically exits after 24 hours without triggering the destructive handler.

As with previous Mini Shai-Hulud variants, the malware checks if the system is configured for the Russian language and terminates without exfiltrating data if so.

Notable updates

This operation delivers a payload that uses the same methods used in previous TeamPCP operations but contains several notable evolutions.

Triple C2 architecture

The payload exfiltrates stolen credentials via three redundant channels:

  1. Typosquat domain: https://git-tanstack[.]com

  2. Session messenger network: Decentralized, encrypted exfiltration via *.getsession.org to recipient ID 05f9e609d79eed391015e11380dee4b5c9ead0b6e2e7f0134e6e51767a87323026

  3. GitHub API dead drops: Creates Dune-themed repositories using stolen tokens with Shai-Hulud: Here We Go Again as the repo description.

A message left on the C2 domain

The Session network channel is new. Decentralized and takedown-resistant, it is significantly harder to disrupt than dedicated domains or GitHub-based exfiltration.

GitHub token persistence wiper daemon

If the malware identifies any ghp_ (GitHub Personal Access Tokens) or gho_(Oauth Tokens) it runs them through a series of checks:

  • It must be a valid token that contains a login field

  • It must include repo or public_repo in its scope

  • It must have a public profile

  • It must have the ability to write to a repo

  • It must be a member of an org

If these all pass the malware installs a persistent gh-token-monitor daemon that polls GitHub every 60 seconds and triggers if the token checked is revoked.

  • macOS: LaunchAgent at ~/Library/LaunchAgents/com.user.gh-token-monitor.plist

  • Linux: systemd user service at ~/.config/systemd/user/gh-token-monitor.service

The handler command passed to the daemon is rm -rf ~/, wiping the home directory. The daemon automatically exits 24 hours after being started.

Python Variant

In addition to the npm compromises above, a malicious version of the PyPI package guardrails-ai@0.10.1 was published, as was mistralai@2.4.6.

These trojanized packages operates notably differently from the JavaScript versions distributed via npm. The malicious package itself only contains 13 lines of new code . This code downloads and executes git-tanstack[.]com/tmp/transformers.pyz. Unlike other TeamPCP payloads this one is not obfuscated, but instead contains a modular credential stealer.  

The stealer will only execute on linux machines and will exit if it is in an environment with Russian language settings or less than four CPUs. It gathers a variety of information, of note for the first time this includes password vaults (1Password, Bitwarden) and exfiltrates it to 83.142.209[.]194, with GitHub as a fallback, in which case PUSH UR T3MPRR is used as the repository description.

If the package is executed on a system with location settings in Israel or Iran (via timezone and language) it invokes random.randint(1,6) and if that equals 2, it plays an mp3 file at full volume and runs rm -rf, attempting deleting the files in the system.

Note that in modern Linux variants running that command without the flag --no-preserve-root will fail.

Attribution

Wiz assesses with high confidence that this is the work of TeamPCP, the same operators behind the SAP, Checkmarx, Bitwarden, Lightning, Intercom, and Trivy compromises.

Indicators of compromise

FileHash
router_init.js (2,341,681 bytes)SHA256: ab4fcadaec49c03278063dd269ea5eef82d24f2124a8e15d7b90f2fa8601266c
router_init.js (2,339,346 bytes)

SHA256: 2ec78d556d696e208927cc503d48e4b5eb56b31abc2870c2ed2e98d6be27fc96 SHA1: e7d582b98ca80690883175470e96f703ef6dc497

setup.mjs (5,047 bytes)

SHA256: 2258284d65f63829bd67eaba01ef6f1ada2f593f9bbe41678b2df360bd90d3df SHA1: 12f35b1081b17d21815b35feb57ab03d02482116

Trojanized tarballSHA256: 1e8538c6e0563d50da0f2e097e979ebd5294ce1defe01d0b9fe361ba3bed1898
opensearch_init.jsSHA1: 820fa07a7328b6cf2b417078e103721d4d8f2e79

Network indicators

TypeIndicator
C2 Domaingit-tanstack.com
Session Seed Nodesseed1.getsession.org, seed2.getsession.org, seed3.getsession.org
Session File Serverfilev2.getsession.org
Session Recipient ID05f9e609d79eed391015e11380dee4b5c9ead0b6e2e7f0134e6e51767a87323026
C2 IP Address83.142.209.194
PyPI Payload URLgit-tanstack.com/tmp/transformers.pyz

Additional Indicators

TypeIndicator
Service Namegh-token-monitor
macOS Persistence~/Library/LaunchAgents/com.user.gh-token-monitor.plist
Linux Persistence~/.config/systemd/user/gh-token-monitor.service
Runtime Artifactrouter_runtime.js
Runtime Artifacttanstack_runner.js
Hookpreinstall: node setup.mjs
Git Dependencygithub:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c
Bun Version1.3.13
Repository DescriptionShai-Hulud: Here We Go Again
Commit MessageIfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner
Destructive Commandrm -rf ~/

What steps should security teams take?

Wiz customers should refer to the Wiz Threat Intelligence Center Advisory on this incident.

  1. Immediately identify exposure: Search lockfiles and CI logs for affected package versions. Look for router_init.js or setup.mjs at package roots.

  2. Check for persistence: Search for the gh-token-monitor daemon on developer machines and remove it. Do this before revoking GitHub tokens, to avoid the wiper.

  3. Rotate all credentials: If exposure is suspected, rotate GitHub tokens, npm tokens, AWS credentials, Vault tokens, Kubernetes service accounts, and CI/CD secrets.

  4. Audit IDE directories: Check .claude/ and .vscode/ directories for router_runtime.js or setup.mjs. These persist after npm uninstall.

  5. Block C2 infrastructure: Block git-tanstack.com and *.getsession.org at DNS/proxy level.

For longer term hardening guidance, Wiz has developed:

Affected packages

PyPi Packages

  1. guardrails-ai@0.10.1

  2. mistralai@2.4.6

npm Packages

PackageAffected Versions
@beproduct/nestjs-auth0.1.2, 0.1.3, 0.1.4, 0.1.5, 0.1.6, 0.1.7, 0.1.8, 0.1.9, 0.1.10, 0.1.11, 0.1.12, 0.1.13, 0.1.14, 0.1.15, 0.1.16, 0.1.17, 0.1.18, 0.1.19
@cap-js/db-service2.10.1
@cap-js/postgres2.2.2
@cap-js/sqlite2.2.2
@dirigible-ai/sdk0.6.2, 0.6.3
@draftauth/client0.2.1, 0.2.2
@draftauth/core0.13.1, 0.13.2
@draftlab/auth0.24.1, 0.24.2
@draftlab/auth-router0.5.1, 0.5.2
@draftlab/db0.16.1, 0.16.2
@mesadev/rest0.28.3
@mesadev/saguaro0.4.22
@mesadev/sdk0.28.3
@mistralai/mistralai2.2.2, 2.2.3, 2.2.4
@mistralai/mistralai-azure1.7.1, 1.7.2, 1.7.3
@mistralai/mistralai-gcp1.7.1, 1.7.2, 1.7.3
@ml-toolkit-ts/preprocessing1.0.2, 1.0.3
@ml-toolkit-ts/xgboost1.0.3, 1.0.4
@opensearch-project/opensearch3.5.3, 3.6.2, 3.7.0, 3.8.0
@squawk/airport-data0.7.4, 0.7.5, 0.7.6, 0.7.7, 0.7.8
@squawk/airports0.6.2, 0.6.3, 0.6.4, 0.6.5, 0.6.6
@squawk/airspace0.8.1, 0.8.2, 0.8.3, 0.8.4, 0.8.5
@squawk/airspace-data0.5.3, 0.5.4, 0.5.5, 0.5.6, 0.5.7
@squawk/airway-data0.5.4, 0.5.5, 0.5.6, 0.5.7, 0.5.8
@squawk/airways0.4.2, 0.4.3, 0.4.4, 0.4.5, 0.4.6
@squawk/fix-data0.6.4, 0.6.5, 0.6.6, 0.6.7, 0.6.8
@squawk/fixes0.3.2, 0.3.3, 0.3.4, 0.3.5, 0.3.6
@squawk/flight-math0.5.4, 0.5.5, 0.5.6, 0.5.7, 0.5.8
@squawk/flightplan0.5.2, 0.5.3, 0.5.4, 0.5.5, 0.5.6
@squawk/geo0.4.4, 0.4.5, 0.4.6, 0.4.7, 0.4.8
@squawk/icao-registry0.5.2, 0.5.3, 0.5.4, 0.5.5, 0.5.6
@squawk/icao-registry-data0.8.4, 0.8.5, 0.8.6, 0.8.7, 0.8.8
@squawk/mcp0.9.1, 0.9.2, 0.9.3, 0.9.4, 0.9.5
@squawk/navaid-data0.6.4, 0.6.5, 0.6.6, 0.6.7, 0.6.8
@squawk/navaids0.4.2, 0.4.3, 0.4.4, 0.4.5, 0.4.6
@squawk/notams0.3.6, 0.3.7, 0.3.8, 0.3.9, 0.3.10
@squawk/procedure-data0.7.3, 0.7.4, 0.7.5, 0.7.6, 0.7.7
@squawk/procedures0.5.2, 0.5.3, 0.5.4, 0.5.5, 0.5.6
@squawk/types0.8.1, 0.8.2, 0.8.3, 0.8.4, 0.8.5
@squawk/units0.4.3, 0.4.4, 0.4.5, 0.4.6, 0.4.7
@squawk/weather0.5.6, 0.5.7, 0.5.8, 0.5.9, 0.5.10
@supersurkhet/cli0.0.2, 0.0.3, 0.0.4, 0.0.5, 0.0.6, 0.0.7
@supersurkhet/sdk0.0.2, 0.0.3, 0.0.4, 0.0.5, 0.0.6, 0.0.7
@tallyui/components1.0.1, 1.0.2, 1.0.3
@tallyui/connector-medusa1.0.1, 1.0.2, 1.0.3
@tallyui/connector-shopify1.0.1, 1.0.2, 1.0.3
@tallyui/connector-vendure1.0.1, 1.0.2, 1.0.3
@tallyui/connector-woocommerce1.0.1, 1.0.2, 1.0.3
@tallyui/core0.2.1, 0.2.2, 0.2.3
@tallyui/database1.0.1, 1.0.2, 1.0.3
@tallyui/pos0.1.1, 0.1.2, 0.1.3
@tallyui/storage-sqlite0.2.1, 0.2.2, 0.2.3
@tallyui/theme0.2.1, 0.2.2, 0.2.3
@tanstack/arktype-adapter1.166.12, 1.166.15
@tanstack/eslint-plugin-router1.161.9, 1.161.12
@tanstack/eslint-plugin-start0.0.4, 0.0.7
@tanstack/history1.161.9, 1.161.12
@tanstack/nitro-v2-vite-plugin1.154.12, 1.154.15
@tanstack/react-router1.169.5, 1.169.8
@tanstack/react-router-devtools1.166.16, 1.166.19
@tanstack/react-router-ssr-query1.166.15, 1.166.18
@tanstack/react-start1.167.68, 1.167.71
@tanstack/react-start-client1.166.51, 1.166.54
@tanstack/react-start-rsc0.0.47, 0.0.50
@tanstack/react-start-server1.166.55, 1.166.58
@tanstack/router-cli1.166.46, 1.166.49
@tanstack/router-core1.169.5, 1.169.8
@tanstack/router-devtools1.166.16, 1.166.19
@tanstack/router-devtools-core1.167.6, 1.167.9
@tanstack/router-generator1.166.45, 1.166.48
@tanstack/router-plugin1.167.38, 1.167.41
@tanstack/router-ssr-query-core1.168.3, 1.168.6
@tanstack/router-utils1.161.11, 1.161.14
@tanstack/router-vite-plugin1.166.53, 1.166.56
@tanstack/solid-router1.169.5, 1.169.8
@tanstack/solid-router-devtools1.166.16, 1.166.19
@tanstack/solid-router-ssr-query1.166.15, 1.166.18
@tanstack/solid-start1.167.65, 1.167.68
@tanstack/solid-start-client1.166.50, 1.166.53
@tanstack/solid-start-server1.166.54, 1.166.57
@tanstack/start-client-core1.168.5, 1.168.8
@tanstack/start-fn-stubs1.161.9, 1.161.12
@tanstack/start-plugin-core1.169.23, 1.169.26
@tanstack/start-server-core1.167.33, 1.167.36
@tanstack/start-static-server-functions1.166.44, 1.166.47
@tanstack/start-storage-context1.166.38, 1.166.41
@tanstack/valibot-adapter1.166.12, 1.166.15
@tanstack/virtual-file-routes1.161.10, 1.161.13
@tanstack/vue-router1.169.5, 1.169.8
@tanstack/vue-router-devtools1.166.16, 1.166.19
@tanstack/vue-router-ssr-query1.166.15, 1.166.18
@tanstack/vue-start1.167.61, 1.167.64
@tanstack/vue-start-client1.166.46, 1.166.49
@tanstack/vue-start-server1.166.50, 1.166.53
@tanstack/zod-adapter1.166.12, 1.166.15
@taskflow-corp/cli0.1.24, 0.1.25, 0.1.26, 0.1.27, 0.1.28, 0.1.29
@tolka/cli1.0.2, 1.0.3, 1.0.4, 1.0.5, 1.0.6
@uipath/access-policy-sdk0.3.1
@uipath/access-policy-tool0.3.1
@uipath/admin-tool0.1.1
@uipath/agent-sdk1.0.2
@uipath/agent-tool1.0.1
@uipath/agent.sdk0.0.18
@uipath/aops-policy-tool0.3.1
@uipath/ap-chat1.5.7
@uipath/api-workflow-tool1.0.1
@uipath/apollo-core5.9.2
@uipath/apollo-react4.24.5
@uipath/apollo-wind2.16.2
@uipath/auth1.0.1
@uipath/case-tool1.0.1
@uipath/cli1.0.1
@uipath/codedagent-tool1.0.1
@uipath/codedagents-tool0.1.12
@uipath/codedapp-tool1.0.1
@uipath/common1.0.1
@uipath/context-grounding-tool0.1.1
@uipath/data-fabric-tool1.0.2
@uipath/docsai-tool1.0.1
@uipath/filesystem1.0.1
@uipath/flow-tool1.0.2
@uipath/functions-tool1.0.1
@uipath/gov-tool0.3.1
@uipath/identity-tool0.1.1
@uipath/insights-sdk1.0.1
@uipath/insights-tool1.0.1
@uipath/integrationservice-sdk1.0.2
@uipath/integrationservice-tool1.0.2
@uipath/llmgw-tool1.0.1
@uipath/maestro-sdk1.0.1
@uipath/maestro-tool1.0.1
@uipath/orchestrator-tool1.0.1
@uipath/packager-tool-apiworkflow0.0.19
@uipath/packager-tool-bpmn0.0.9
@uipath/packager-tool-case0.0.9
@uipath/packager-tool-connector0.0.19
@uipath/packager-tool-flow0.0.19
@uipath/packager-tool-functions0.1.1
@uipath/packager-tool-webapp1.0.6
@uipath/packager-tool-workflowcompiler0.0.16
@uipath/packager-tool-workflowcompiler-browser0.0.34
@uipath/platform-tool1.0.1
@uipath/project-packager1.1.16
@uipath/resource-tool1.0.1
@uipath/resourcecatalog-tool0.1.1
@uipath/resources-tool0.1.11
@uipath/robot1.3.4
@uipath/rpa-legacy-tool1.0.1
@uipath/rpa-tool0.9.5
@uipath/solution-packager0.0.35
@uipath/solution-tool1.0.1
@uipath/solutionpackager-sdk1.0.11
@uipath/solutionpackager-tool-core0.0.34
@uipath/tasks-tool1.0.1
@uipath/telemetry0.0.7
@uipath/test-manager-tool1.0.2
@uipath/tool-workflowcompiler0.0.12
@uipath/traces-tool1.0.1
@uipath/ui-widgets-multi-file-upload1.0.1
@uipath/uipath-python-bridge1.0.1
@uipath/vertical-solutions-tool1.0.1
@uipath/vss0.1.6
@uipath/widget.sdk1.2.3
agentwork-cli0.1.4, 0.1.5
cmux-agent-mcp0.1.3, 0.1.4, 0.1.5, 0.1.6, 0.1.7, 0.1.8
cross-stitch1.1.3, 1.1.4, 1.1.5, 1.1.6, 1.1.7
git-branch-selector1.3.3, 1.3.4, 1.3.5, 1.3.6, 1.3.7
git-git-git1.0.8, 1.0.9, 1.0.10, 1.0.11, 1.0.12
guardrails-ai0.10.1
intercom-client7.0.4
lightning2.6.2, 2.6.3
mbt1.2.48
mistralai2.4.6
ml-toolkit-ts1.0.4, 1.0.5
nextmove-mcp0.1.3, 0.1.4, 0.1.5, 0.1.6, 0.1.7
safe-action0.8.3, 0.8.4
ts-dna3.0.1, 3.0.2, 3.0.3, 3.0.4, 3.0.5
wot-api0.8.1, 0.8.2, 0.8.3, 0.8.4

References

계속 읽기

맞춤형 데모 받기

맞춤형 데모 신청하기

"내가 본 최고의 사용자 경험은 클라우드 워크로드에 대한 완전한 가시성을 제공합니다."
데이비드 에슬릭최고정보책임자(CISO)
"Wiz는 클라우드 환경에서 무슨 일이 일어나고 있는지 볼 수 있는 단일 창을 제공합니다."
아담 플레처최고 보안 책임자(CSO)
"우리는 Wiz가 무언가를 중요한 것으로 식별하면 실제로 중요하다는 것을 알고 있습니다."
그렉 포니아토프스키위협 및 취약성 관리 책임자