Mini Shai-Hulud: TeamPCP’s Self-Propagating npm Worm Hits TanStack, OpenSearch, and Mistral AI Across 170 Packages

Between May 10 and May 12, 2026, TeamPCP — the group behind the Trivy, Checkmarx, and LiteLLM supply chain compromises — ran a self-propagating worm campaign across the npm and PyPI ecosystems. They named it Mini Shai-Hulud. The entry point was an orphaned commit in a TanStack CI workflow that still had OIDC trust federation configured with npm. No phished maintainer. No stored secret. The attacker extracted an OIDC token from the runner process and exchanged it for authenticated publish access to the entire TanStack namespace.

From there, the worm drove its own expansion: every infected CI run became a new publisher. Each compromised package version carried a preinstall hook that downloaded the Bun JavaScript runtime as a living-off-the-land binary, then launched a 2.3 MB obfuscated payload (router_init.js) that swept CI secrets, cloud credentials, Kubernetes tokens, and Vault secrets. On runners with active OIDC federation, the worm minted fresh npm tokens and republished infected versions under stolen maintainer identities — with valid Sigstore provenance attestations attached. By the time npm quarantine started, 170 packages across 19 namespaces were gone, including the AWS-maintained OpenSearch JavaScript client at 1.3 million weekly downloads and the official Mistral AI SDK family on both npm and PyPI.

Exfiltration ran through the Session P2P messaging network, not HTTP C2. The traffic is encrypted IM protocol — indistinguishable from legitimate messaging at the network layer. Persistence landed in Claude Code hook directories (.claude/) and VS Code task runners (.vscode/tasks.json). npm uninstall does not remove those. The worm fires again on every developer tool invocation until you explicitly clean the hook files. No CVE has been assigned. Traditional CVE-based vulnerability management had no visibility into any of this.

TL;DR for Engineering Teams – TeamPCP – Mini Shai Hulud

What it is: Self-propagating npm worm (Mini Shai-Hulud) attributed to TeamPCP. Entry via OIDC token extraction from a TanStack CI workflow orphaned commit. Worm republishes infected versions autonomously across maintainer namespaces using stolen OIDC federation tokens. Crosses into PyPI. No CVE assigned.

Phoenix Security Blue Malware Analysis – https://phxintel.security/malware.html 

Where it bites: Any environment that installed a compromised version from 170 npm packages across 19 namespaces, or PyPI mistralai==2.4.6 / guardrails-ai==0.10.1. The preinstall hook fires on npm install — the package does not need to be imported. Highest blast radius: @opensearch-project/opensearch (versions 3.5.3, 3.6.2, 3.7.0, 3.8.0) at 1.3M weekly downloads; @mistralai/mistralai (2.2.2-2.2.4); @tanstack/react-router (1.169.5, 1.169.8).

Why it matters: OIDC federation — designed to eliminate long-lived tokens — was weaponized to mint fresh publish credentials. Infected packages carry valid Sigstore provenance attestations, which defeats provenance-based trust checks. Exfiltration through Session P2P is indistinguishable from normal IM traffic. Persistence in .claude/ hooks survives npm uninstall.

Patch status: Compromised versions removed from npm. PyPI mistralai and guardrails-ai quarantined. Safe versions: @opensearch-project/opensearch <=3.5.2 (or confirmed-clean post-quarantine release); @mistralai/mistralai <=2.2.1; mistralai PyPI <=2.4.5; guardrails-ai <=0.10.0.

Immediate action: Grep lockfiles for affected namespaces. Check for /tmp/transformers.pyz, .claude/router_runtime.js, pgmon.service. Rotate every secret on any CI runner that installed a compromised version. Block filev2.getsession.org, git-tanstack.com, api.masscan.cloud at egress DNS. Set npm config set ignore-scripts true on all CI runners.

Vulnerability Overview – TeamPCP – Mini Shai Hulud

FieldValue
Threat GroupTeamPCP (self-attributed: “With Love TeamPCP”)
Campaign NameMini Shai-Hulud
Affected Ecosystemsnpm (170 packages, 19 namespaces), PyPI (2 packages)
Vulnerability TypeSupply chain compromise / OIDC federation abuse / self-propagating worm
CWECWE-829 (Inclusion of Functionality from Untrusted Control Sphere)
CVENone assigned
Operational SeverityCRITICAL
Attack VectorNetwork (npm install preinstall hook; PyPI import)
Active ExploitationConfirmed — self-propagated across 170 packages in under 24 hours
Exposure WindowMay 10–12, 2026
Sigstore BypassYes — malicious releases carry valid provenance attestations
KEV StatusNot listed

Technical Anatomy

Root Cause: OIDC Federation Abuse via Orphaned CI Commit

The attack did not start with a phished password or a stolen API key. It started with an orphaned commit.

On May 10–11, 2026, TeamPCP identified an orphaned commit in a TanStack repository that remained reachable from a GitHub Actions workflow. The workflow had OIDC trust federation configured with npm — the standard mechanism for passwordless publishing where CI can mint short-lived npm tokens on behalf of a registered publisher. By triggering a workflow run against the attacker-controlled commit, TeamPCP extracted the runner’s OIDC token and exchanged it with npm’s federation endpoint for a full publish credential on the TanStack namespace. Two-factor authentication was bypassed entirely: OIDC federation authenticates the CI workflow identity, not the human maintainer.

The TanStack postmortem attributes this to a chained attack — pull_request_target “Pwn Request” pattern, GitHub Actions cache poisoning across the fork-to-base trust boundary, and runtime memory extraction of an OIDC token from the runner process. No stored npm tokens were stolen.

Exploit Path

Step 1 — Entry via orphaned commit: An attacker-controlled commit in a fork runs inside a privileged workflow context because of a pull_request_target misconfiguration. The runner process holds an active OIDC JWT. The attacker reads it from runner memory during the test/cleanup phase.

Step 2 — OIDC token exchange for npm publish credential: The extracted OIDC JWT goes to npm’s trusted publisher federation endpoint. npm validates the token against the registered OIDC trust binding for the TanStack namespace and issues a publish token. The attacker now has authenticated publish access to every package in the namespace without any stored credentials.

Step 3 — Infected version publication with Sigstore provenance, then worm propagation: The malicious payload is packaged and published. Because the publish authenticates as the legitimate CI workflow identity, npm’s provenance system generates a valid Sigstore attestation. Consumers who inspect provenance records see a clean CI build. The worm then replicates: on any infected CI runner with OIDC federation, tanstack_runner.js repeats the token extraction and republishes under every accessible namespace.

The Three-Stage Payload (router_init.js, ~2.3 MB)

The payload is a single-line, 2.3 MB file obfuscated with javascript-obfuscator: string-array rotation, hex-encoded identifier lookups (_0x dispatcher called 2,864 times), control-flow flattening inside while(![]){} state machines, and a secondary XOR/AES decode layer (beautify()) that encodes 148 environment variable name accesses to defeat grep-based string extraction.

Stage 1 — Credential Harvest: The payload forks a detached child with all stdio suppressed (stdio: [‘ignore’,‘ignore’,‘ignore’]), then exits the parent cleanly. The child sweeps every major secrets plane:

  • GitHub Actions: reads GITHUB_TOKEN, ACTIONS_ID_TOKEN_REQUEST_TOKEN; calls GET /repos/{repo}/actions/secrets?per_page=100 to enumerate all repository secrets
  • AWS: reads AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ROLE_ARN; calls EC2 IMDSv2 (PUT /latest/api/token then role credential fetch); queries Secrets Manager and SSM Parameter Store across all regions via SigV4-signed API calls
  • Kubernetes: reads /var/run/secrets/kubernetes.io/serviceaccount/token and ca.crt
  • HashiCorp Vault: reads VAULT_TOKEN, VAULT_AUTH_TOKEN; connects to vault.svc.cluster.local:8200 (in-cluster Vault API)
  • ECS: reads ECS task metadata endpoint at 169.254.170.2

Stage 2 — OIDC-Powered Worm Propagation: On runners with active OIDC federation, the payload calls ACTIONS_ID_TOKEN_REQUEST_URL to mint a fresh npm OIDC JWT, exchanges it for a publish token, queries npms.io to enumerate maintainer packages, and republishes infected versions under the latest dist-tag with valid Sigstore provenance attestations.

Stage 3 — Repository Poisoning via GitHub GraphQL: Using stolen GITHUB_TOKEN values, the implant calls the createCommitOnBranch GraphQL mutation to write payload files directly to repository branches. Target paths: .claude/router_runtime.js, .claude/settings.json, .claude/setup.mjs, .vscode/setup.mjs, .vscode/tasks.json, and arbitrary .github/workflows/ files. All commits are authored as claude@users.noreply.github.com, impersonating the Anthropic Claude Code GitHub App.

The .claude/ Persistence Mechanism

Claude Code supports a hooks configuration in .claude/settings.json that executes shell commands in response to tool events. By writing a copy of the worm into .claude/router_runtime.js and registering it in .claude/settings.json, the worm re-executes every time a developer uses Claude Code in the affected project directory. This persistence survives npm uninstall and package cache clearing. Package removal is not sufficient remediation.

Protect yourself with the latest threat intelligence, get access to PHOENIX BLUE Today

Exfiltration via Session P2P Protocol – TeamPCP – Mini Shai Hulud

Harvested credentials are not POSTed to a conventional HTTPS C2 server. The payload routes exfiltration through the Session decentralized P2P messaging network using the full embedded signalservice Protocol Buffers stack (Envelope, Content, DataMessage, WebSocketMessage, SharedConfigMessage). Traffic uploads to http://filev2.getsession.org/file/ over plain HTTP with tls.rejectUnauthorized: false, honoring any CI runner outbound proxy. To a network observer, this is regular encrypted P2P messaging traffic. No CDN provider or domain registrar can take down Session’s distributed snode network — DNS-level blocking of .getsession.org is the only practical perimeter control.

The PyPI Dropper: Simpler, Same Infrastructure

The guardrails-ai==0.10.1 PyPI compromise uses a different mechanism. On import (not install) on Linux, the package fetches https://git-tanstack.com/transformers.pyz, writes it to /tmp/transformers.pyz, and runs it with python3. No hash check. No signature verification. The same git-tanstack.com domain used as the attacker self-attribution page serves this payload. TeamPCP made no attempt to separate infrastructure between the npm and PyPI sides of the campaign.

Sandbox Detection – TeamPCP – Mini Shai Hulud

The payload checks two environment variables — TESTING_TAR_FAKE_PLATFORM and FAKE_PLATFORM — as sandbox-detection canaries. If either is set, the payload runs cleanly, producing a benign execution trace in sandboxes that fake platform metadata.

Affected Versions

npm — Highest Impact Packages

PackageCompromised VersionsSafe VersionsWeekly Downloads
@opensearch-project/opensearch3.5.3, 3.6.2, 3.7.0, 3.8.0<=3.5.2~1.3M
@mistralai/mistralai2.2.2, 2.2.3, 2.2.4<=2.2.1
@mistralai/mistralai-azure1.7.1, 1.7.2, 1.7.3<=1.7.0
@mistralai/mistralai-gcp1.7.1, 1.7.2, 1.7.3<=1.7.0
@tanstack/react-router1.169.5, 1.169.8<=1.169.4~12M
@tanstack/router-core1.169.5, 1.169.8<=1.169.4
@tanstack/solid-router1.169.5, 1.169.8<=1.169.4
@tanstack/vue-router1.169.5, 1.169.8<=1.169.4
@uipath/* (64 packages)VariousVerify per OSM CSV
@squawk/* (22 packages)VariousVerify per OSM CSV
@tallyui/* (10 packages)VariousVerify per OSM CSV
@beproduct/nestjs-auth0.1.2 through 0.1.19<=0.1.1

PyPI

PackageCompromised VersionSafe VersionNotes
mistralai2.4.6<=2.4.5PyPI quarantined
guardrails-ai0.10.1<=0.10.0Executes on import; no hash check; fetches from git-tanstack.com

Full 170-package inventory available at OpenSourceMalware.com under tag #mini-shai-hulud and Socket’s Mini Shai-Hulud campaign tracker at socket.dev/supply-chain-attacks/mini-shai-hulud.

Campaign Scope and Timeline

Date / Time (UTC)Event
May 10–11, 2026Orphaned TanStack CI commit exploited via pull_request_target; OIDC token extracted from runner memory
May 11, ~19:20 UTCFirst wave: @tanstack/* — 42 packages, 84 malicious version pairs published
May 11, ~20:15–21:00 UTCWave expands to @uipath/* (64 packages), @squawk/* (22), @tallyui/* (10)
May 11, ~22:45 UTC@mistralai/mistralai, @mistralai/mistralai-azure, @mistralai/mistralai-gcp compromised
May 12, ~00:30 UTC@opensearch-project/opensearch compromised — versions 3.5.3, 3.6.2, 3.7.0, 3.8.0
May 12, ~00:47 UTCPyPI: mistralai==2.4.6 and guardrails-ai==0.10.1 published
May 12, ~03:05 UTCOpenSearch and PyPI mistralai compromises; all-clear alert triggered
May 12 (during campaign)TeamPCP serves “With Love TeamPCP” message from git-tanstack.com while campaign is live
May 12All npm compromised versions removed; PyPI projects quarantined

Exposure Analysis

EnvironmentRisk LevelReason
CI/CD pipelines (affected packages installed)CRITICALpreinstall hook fires on install; OIDC token extraction; all runner secrets compromised
Kubernetes clustersCRITICALService account token harvest; in-cluster Vault API access; lateral movement capability
Cloud workloads (AWS EC2/ECS/GCE/Azure)CRITICALIMDSv2 credential extraction; Secrets Manager and SSM queried across all regions
Developer machinesHIGHSSH keys, .env files, shell history, Git creds swept; .claude/ persistence survives package removal
CI with OIDC-federated npm publishingCRITICALWorm self-propagates under stolen maintainer identity with valid Sigstore provenance
guardrails-ai==0.10.1 environmentsHIGHPayload fires on import; remote code execution with no integrity check
Pipelines with ignore-scripts=trueNot affected (npm)Blocks preinstall hook chain at first hop

Real-World Impact of TeamPCP – Mini Shai Hulud

Automated tooling detected 84 compromised TanStack artifacts within six minutes of publication — meaning detection exists and fires quickly. Six minutes is fast. It is not fast enough: CI pipelines that run on push will have installed compromised versions before any detection fires.

OpenSearch is the single highest blast-radius package in this campaign. At 1.3 million weekly npm downloads, it lands in observability stacks, search-backed services, and OpenSearch/Elasticsearch ingestion pipelines across thousands of organizations. Any application or pipeline that resolved versions 3.5.3, 3.6.2, 3.7.0, or 3.8.0 between May 12 00:29 UTC and quarantine time is in scope.

The Mistral AI SDK compromise hit npm and PyPI simultaneously. For organizations running LLM applications on the Mistral SDK, both the JavaScript and Python clients were poisoned in the same campaign wave.

The Sigstore provenance bypass is a structural problem with how provenance works. Organizations that implemented provenance verification as a supply chain control would have seen “verified provenance” badges on the malicious TanStack releases. The provenance record accurately shows that the package was published from a GitHub Actions run in the TanStack repository. It cannot indicate that the run evaluated attacker-controlled code. Provenance tells you where a package was built; it does not tell you whether that build environment was clean.

The Session P2P exfiltration channel is the hardest part to address at the network layer. No CDN provider, domain registrar, or certificate authority can take down Session’s snode swarm. Organizations that rely on domain reputation scoring for C2 detection have no visibility into this channel.

Detection Guidance

Indicators of Compromise

TypeIndicatorContext
C2 / exfilfilev2.getsession.orgSession P2P file upload — npm-side exfiltration
C2 bootstrapseed1.getsession.orgSession P2P service node bootstrap
Attacker APIapi.masscan.cloudAttacker-controlled infrastructure
PyPI dropper domaingit-tanstack.comServes transformers.pyz and self-attribution page
PyPI dropper URLgit-tanstack.com/transformers.pyzRemote payload fetched by guardrails-ai 0.10.1 on import
Persistence path.claude/router_runtime.jsClaude Code hook worm persistence — survives npm uninstall
Persistence path.claude/settings.jsonRegisters worm as Claude Code tool event handler
Persistence path.claude/setup.mjsESM loader shim
Persistence path.vscode/setup.mjsVS Code ESM loader
Persistence path.vscode/tasks.jsonVS Code workspace task auto-run
PyPI dropper write/tmp/transformers.pyzWritten by guardrails-ai 0.10.1 on import
Commit author spoofclaude@users.noreply.github.comInjected commits masquerading as Claude Code agent
Attacker GitHubgithub.com/voicproducoesRepo: “A Mini Shai-Hulud has Appeared”; ID 269549300

File Hashes (SHA-256)

SHA-256 HashArtifact
ab4fcadaec49c03278063dd269ea5eef82d24f2124a8e15d7b90f2fa8601266crouter_init.js / router_runtime.js (~2.3 MB obfuscated implant)
2ec78d556d696e208927cc503d48e4b5eb56b31abc2870c2ed2e98d6be27fc96tanstack_runner.js (worm propagation loader)

Detection Queries

Lockfile scan:

grep -E “(@tanstack|@uipath|@squawk|@mistralai|@opensearch-project)/” \
  package-lock.json pnpm-lock.yaml yarn.lock 2>/dev/null

Filesystem persistence check:

ls -la ~/.claude/router_runtime.js ~/.claude/setup.mjs \
  ~/.vscode/setup.mjs /tmp/transformers.pyz /tmp/pglog 2>/dev/null

Git history check (run per repo):

git log –all –author=’claude@users.noreply.github.com’ –since=’2026-05-10′

router_init.js hash check:

find . -path ‘*/node_modules/*/router_init.js’ -exec sha256sum {} \; 2>/dev/null

MITRE ATT&CK Mapping

TechniqueDescriptionCampaign Application
T1195.002Supply Chain Compromise: Software Supply Chain170 npm packages, 2 PyPI packages poisoned
T1552.005Cloud Instance Metadata APIIMDSv2 credential extraction from EC2/ECS
T1552.004Unsecured Credentials: Private KeysSSH keys, TLS certs, cloud service principal files
T1543.002Create/Modify System Process: Systemd Servicepgmon.service persistence (consistent with prior TeamPCP waves)
T1048.002Exfiltration Over Alternative ProtocolSession P2P network instead of HTTP C2
T1036MasqueradingCommits spoofed as claude@users.noreply.github.com; pgmon service name
T1059.007Command and Scripting Interpreter: JavaScriptBun runtime used as LOLBin for payload execution
T1176Browser Extensions / IDE PersistencePersistence via .vscode/tasks.json and .claude/settings.json

Remediation Guidance

Immediate Actions

  1. Pin away from compromised versions. Update all lockfiles to exclude compromised version ranges. For @tanstack/* packages, pin to versions prior to 1.169.5 or the latest verified clean release post-quarantine.
  2. Block C2 infrastructure at DNS egress: filev2.getsession.org, seed1.getsession.org, git-tanstack.com, api.masscan.cloud. IP-based blocking is impractical for the Session snode swarm — DNS-level blocking is required.
  3. Rotate all secrets on any affected CI runner. Any workflow that ran npm install during May 10–12, 2026 and resolved a compromised version should treat all runner secrets as compromised: GitHub PATs, OIDC federation bindings, AWS access keys, Kubernetes service account tokens, HashiCorp Vault tokens, Docker registry credentials, npm publish tokens.
  4. Remove .claude/ and .vscode/ persistence artifacts. npm uninstall is not sufficient. Check all developer home directories and project roots for: .claude/router_runtime.js, .claude/settings.json (inspect for unknown hooks), .vscode/tasks.json (inspect for unknown tasks), .claude/setup.mjs, .vscode/setup.mjs.
  5. Audit recent commits for spoofed claude@ authorship. Run git log –all –author=‘claude@users.noreply.github.com’ –since=‘2026-05-10’ across every repository your CI has write access to. Commits with this identity not initiated through the legitimate Claude Code GitHub App are attacker-injected.
  6. Uninstall affected PyPI packages. Remove mistralai==2.4.6 and guardrails-ai==0.10.1 immediately. Delete /tmp/transformers.pyz if present.
  7. Revoke and re-establish npm Trusted Publisher OIDC bindings for any package published from affected repositories. Confirm the publishing workflow is clean before re-establishing federation.
  8. Audit npm publish logs for unexpected version bumps from your organization’s packages, particularly versions published from GitHub Actions runners not initiated by a team member.

Long-Term Hardening

Disable npm install scripts on all CI runners: npm config set ignore-scripts true (or pnpm config set ignore-scripts true). This single line blocks the entire preinstall chain at the first hop. Most CI environments do not legitimately need lifecycle hooks from dependencies.

Restrict OIDC token scopes in GitHub Actions. Set permissions: id-token: none in all workflows that do not publish. Restrict id-token: write to only the specific job that publishes. Never grant OIDC token permissions to jobs that run attacker-influenced code.

Do not treat Sigstore provenance as a security gate on its own. Provenance verifies that a package was published from a specific CI workflow — not that the workflow ran trusted code. An attacker who can execute in GitHub Actions can generate valid Sigstore attestations for malicious packages.

Audit all pull_request_target workflows for PWN request patterns. If any step checks out PR head code, it is exploitable. Use poutine (Boost Security) or Zizmor for automated scanning.

Implement a version adoption delay policy. Community detection of supply chain attacks typically happens within minutes to hours. A 24–48 hour hold on new patch versions for non-critical CI dependencies provides a meaningful window for community detection to surface before your pipelines install.

Phoenix Security Recommendations

Mini Shai-Hulud had no CVE, no CVSS score, and no NVD entry. It compromised developer tooling and AI SDK infrastructure running with elevated trust in CI environments. For organizations with any of the 170 affected packages across their repository estate, the remediation surface is large and ownership is fragmented across multiple teams.

Attack surface management: Phoenix identifies which CI/CD pipelines and container images reference compromised package versions and maps whether those pipelines run in environments with OIDC federation enabled. For organizations with hundreds of repositories consuming @tanstack/, @mistralai/, or @opensearch-project/* packages, Phoenix provides a single view of which pipelines resolved compromised versions during the exposure window.

Contextual deduplication: The same compromised @opensearch-project/opensearch version appearing across 50 repositories does not generate 50 separate tickets. Phoenix correlates findings across all environments into a single prioritized backlog, surfacing the highest-risk instances — those with active cloud credentials or Kubernetes service account access — first.

Reachability analysis: Phoenix distinguishes between repositories where a compromised package version was declared in a lockfile versus those where the preinstall hook actually ran during a CI job. An environment with the package in its lockfile but no recent CI run has a materially different risk profile than one that ran npm install in the exposure window. That distinction drives remediation prioritization: secret rotation is urgent only where the hook executed.

Remediation campaigns: Create a Phoenix campaign to track lockfile remediation across all affected repositories, secret rotation completion per CI runner, .claude/ and .vscode/ persistence cleanup, OIDC federation rebuild, and Kubernetes pod cleanup for environments with the lateral movement variant. Assign owners per repository and track fix verification through to confirmed clean state.

Ownership attribution: Mini Shai-Hulud hit 19 namespaces across packages likely owned by multiple teams in any large organization. Phoenix maps vulnerable package references to responsible engineering teams automatically, making cross-team coordination tractable at scale.

The results are clear:

  • Bazaarvoice saved $6.3M in developer time and for teams removed critical in the first weeks of adoption
  • ClearBank cut critical container vulnerabilities by 96–99% and reclaimed 4 hours per engineer per week.
  • IAS saved an equivalent of 1.5M in development hours and reduced SCA-to-container noise by 82.4%
  • Optimizely has been able to act on vulnerabilities sitting on the backlog.

👉 Book a demo today

Or learn how Phoenix Security slashed millions in wasted dev time for fintech, retail, and adtech leaders.

Fix with remediaiton don’t chase ghost vulnerabilities

Phoenix Security correlates vulnerable components with runtime workloads, identifies exposed pipelines via attack surface management, and assigns remediation ownership. A 170-package supply chain compromise becomes a trackable backlog with clear team accountability.

Full list of packages  

Mini Shai-Hulud — TeamPCP IOC Package List
Campaign: Mini Shai-Hulud  |  Group: TeamPCP  |  Date: May 12, 2026  |  Severity: CRITICAL  |  CVE: None Assigned
EcosystemPackageCompromised VersionsHashMalware Report
NPMagentwork-cli0.1.4, 0.1.5b5f37efeOpen report
NPM@beproduct/nestjs-auth0.1.2–0.1.19904a8527Open report
NPMcmux-agent-mcp0.1.3–0.1.8588fe58dOpen report
NPMcross-stitch1.1.3–1.1.61d13cd83Open report
NPM@dirigible-ai/sdk0.6.2, 0.6.3e5fa1971Open report
NPM@draftauth/client0.2.1, 0.2.20a7db862Open report
NPM@draftauth/core0.13.1, 0.13.2fd55db4aOpen report
NPM@draftlab/auth0.24.1, 0.24.26020ac60Open report
NPM@draftlab/auth-router0.5.1, 0.5.2a917e41aOpen report
NPM@draftlab/db0.16.1, 0.16.2661ccd3fOpen report
NPMgit-branch-selector1.3.3–1.3.700e1a756Open report
NPMgit-git-git1.0.8–1.0.12daedb15aOpen report
NPM@mesadev/rest0.28.31def5734Open report
NPM@mesadev/saguaro0.4.22706a6977Open report
NPM@mesadev/sdk0.28.32940431bOpen report
NPM@mistralai/mistralai2.2.2–2.2.4ec1e411fOpen report
NPM@mistralai/mistralai-azure1.7.1–1.7.371c588c0Open report
NPM@mistralai/mistralai-gcp1.7.1–1.7.328280339Open report
NPMml-toolkit-ts1.0.4, 1.0.56496842aOpen report
NPM@ml-toolkit-ts/preprocessing1.0.2, 1.0.3e561cf93Open report
NPM@ml-toolkit-ts/xgboost1.0.3, 1.0.4c5466941Open report
NPMnextmove-mcp0.1.3–0.1.79bb8a216Open report
NPM@opensearch-project/opensearch3.5.3, 3.6.2, 3.7.0, 3.8.0e31da725Open report
NPMsafe-action0.8.3, 0.8.4c8785460Open report
NPM@squawk/airport-data0.7.4–0.7.736bfb918Open report
NPM@squawk/airports0.6.2–0.6.594ebfc48Open report
NPM@squawk/airspace0.8.1–0.8.48c4dc91cOpen report
NPM@squawk/airspace-data0.5.3–0.5.648af1665Open report
NPM@squawk/airway-data0.5.4–0.5.7ebbfe371Open report
NPM@squawk/airways0.4.2–0.4.55d4a85beOpen report
NPM@squawk/fix-data0.6.4–0.6.706297647Open report
NPM@squawk/fixes0.3.2–0.3.59494fe5dOpen report
NPM@squawk/flight-math0.5.4–0.5.70d78f3edOpen report
NPM@squawk/flightplan0.5.2–0.5.5ef8807a2Open report
NPM@squawk/geo0.4.4–0.4.757cb33b9Open report
NPM@squawk/icao-registry0.5.2–0.5.5f68f876cOpen report
NPM@squawk/icao-registry-data0.8.4–0.8.7acee99b8Open report
NPM@squawk/mcp0.9.1–0.9.43a9bd6aaOpen report
NPM@squawk/navaid-data0.6.4–0.6.7eadc7ec8Open report
NPM@squawk/navaids0.4.2–0.4.552f63026Open report
NPM@squawk/notams0.3.6–0.3.9525979b5Open report
NPM@squawk/procedure-data0.7.3–0.7.697751a26Open report
NPM@squawk/procedures0.5.2–0.5.5d8af4c4aOpen report
NPM@squawk/types0.8.1–0.8.4591fb4baOpen report
NPM@squawk/units0.4.3–0.4.6302d4845Open report
NPM@squawk/weather0.5.6–0.5.9e46ab84eOpen report
NPM@supersurkhet/cli0.0.2–0.0.7ac64aaa6Open report
NPM@supersurkhet/sdk0.0.2–0.0.7fa0ac9a0Open report
NPM@tallyui/components1.0.1–1.0.300de55fdOpen report
NPM@tallyui/connector-medusa1.0.1–1.0.3aa6a17caOpen report
NPM@tallyui/connector-shopify1.0.1–1.0.3bd70560cOpen report
NPM@tallyui/connector-vendure1.0.1–1.0.3fe919e83Open report
NPM@tallyui/connector-woocommerce1.0.1–1.0.393a7e6ceOpen report
NPM@tallyui/core0.2.1–0.2.3f8e985a8Open report
NPM@tallyui/database1.0.1–1.0.3ded08135Open report
NPM@tallyui/pos0.1.1–0.1.3e9156aebOpen report
NPM@tallyui/storage-sqlite0.2.1–0.2.32d41338eOpen report
NPM@tallyui/theme0.2.1–0.2.35df95aa4Open report
NPM@tanstack/arktype-adapter1.166.12, 1.166.1591234410Open report
NPM@tanstack/eslint-plugin-router1.161.9, 1.161.1214fb2495Open report
NPM@tanstack/eslint-plugin-start0.0.4, 0.0.7cdb165c8Open report
NPM@tanstack/history1.161.9, 1.161.12f6ffd5f9Open report
NPM@tanstack/nitro-v2-vite-plugin1.154.12, 1.154.156f3e7475Open report
NPM@tanstack/react-router1.169.5, 1.169.815985b6dOpen report
NPM@tanstack/react-router-devtools1.166.16, 1.166.197a08d8feOpen report
NPM@tanstack/react-router-ssr-query1.166.15, 1.166.18d42cb346Open report
NPM@tanstack/react-start1.167.68, 1.167.714736d32cOpen report
NPM@tanstack/react-start-client1.166.51, 1.166.5434db812eOpen report
NPM@tanstack/react-start-rsc0.0.47, 0.0.50b361bd85Open report
NPM@tanstack/react-start-server1.166.55, 1.166.583ae49017Open report
NPM@tanstack/router-cli1.166.46, 1.166.495b7b2709Open report
NPM@tanstack/router-core1.169.5, 1.169.83c293319Open report
NPM@tanstack/router-devtools1.166.16, 1.166.19a8736ed8Open report
NPM@tanstack/router-devtools-core1.167.6, 1.167.98c35dfb4Open report
NPM@tanstack/router-generator1.166.45, 1.166.483955088bOpen report
NPM@tanstack/router-plugin1.167.38, 1.167.418901fc32Open report
NPM@tanstack/router-ssr-query-core1.168.3, 1.168.649e9a874Open report
NPM@tanstack/router-utils1.161.11, 1.161.145eba8fe2Open report
NPM@tanstack/router-vite-plugin1.166.53, 1.166.562842b408Open report
NPM@tanstack/solid-router1.169.5, 1.169.82db64fd2Open report
NPM@tanstack/solid-router-devtools1.166.16, 1.166.19b1d15516Open report
NPM@tanstack/solid-router-ssr-query1.166.15, 1.166.18cfaee4f1Open report
NPM@tanstack/solid-start1.167.65, 1.167.6814dbc4d1Open report
NPM@tanstack/solid-start-client1.166.50, 1.166.53afee37a8Open report
NPM@tanstack/solid-start-server1.166.54, 1.166.57a908bcc1Open report
NPM@tanstack/start-client-core1.168.5, 1.168.839cfb9f5Open report
NPM@tanstack/start-fn-stubs1.161.9, 1.161.12b521315fOpen report
NPM@tanstack/start-plugin-core1.169.23, 1.169.2606d1d2d6Open report
NPM@tanstack/start-server-core1.167.33, 1.167.369207214bOpen report
NPM@tanstack/start-static-server-functions1.166.44, 1.166.47b1f4ed87Open report
NPM@tanstack/start-storage-context1.166.38, 1.166.416507eed0Open report
NPM@tanstack/valibot-adapter1.166.12, 1.166.15fd476fc4Open report
NPM@tanstack/virtual-file-routes1.161.10, 1.161.1377708e64Open report
NPM@tanstack/vue-router1.169.5, 1.169.8ebb92079Open report
NPM@tanstack/vue-router-devtools1.166.16, 1.166.19403e6f37Open report
NPM@tanstack/vue-router-ssr-query1.166.15, 1.166.181f84186aOpen report
NPM@tanstack/vue-start1.167.61, 1.167.648cdeb387Open report
NPM@tanstack/vue-start-client1.166.46, 1.166.49a8d8dbb2Open report
NPM@tanstack/vue-start-server1.166.50, 1.166.5306ce8407Open report
NPM@tanstack/zod-adapter1.166.12, 1.166.151e5b2bc5Open report
NPM@taskflow-corp/cli0.1.24–0.1.29a45d9d22Open report
NPM@tolka/cli1.0.2–1.0.66bf13e1fOpen report
NPMts-dna3.0.1–3.0.4ee883dc3Open report
NPM@uipath/access-policy-sdk0.3.159e2a822Open report
NPM@uipath/access-policy-tool0.3.1223b9860Open report
NPM@uipath/admin-tool0.1.1c33ed30dOpen report
NPM@uipath/agent-sdk1.0.2fbd1cc97Open report
NPM@uipath/agent-tool1.0.1af03c66bOpen report
NPM@uipath/agent.sdk0.0.182dad695dOpen report
NPM@uipath/aops-policy-tool0.3.1e899f883Open report
NPM@uipath/ap-chat1.5.70d55d09aOpen report
NPM@uipath/api-workflow-tool1.0.13586fcacOpen report
NPM@uipath/apollo-core5.9.2b474b9d8Open report
NPM@uipath/apollo-react4.24.528ef6224Open report
NPM@uipath/apollo-wind2.16.29996baf4Open report
NPM@uipath/auth1.0.116f0dac0Open report
NPM@uipath/case-tool1.0.12221a9a6Open report
NPM@uipath/cli1.0.1b1dcf660Open report
NPM@uipath/codedagent-tool1.0.136505247Open report
NPM@uipath/codedagents-tool0.1.12f723c55dOpen report
NPM@uipath/codedapp-tool1.0.112dd9af5Open report
NPM@uipath/common1.0.1e24eaf7aOpen report
NPM@uipath/context-grounding-tool0.1.154469eb3Open report
NPM@uipath/data-fabric-tool1.0.21411a718Open report
NPM@uipath/docsai-tool1.0.194c751c3Open report
NPM@uipath/filesystem1.0.1cbad130eOpen report
NPM@uipath/flow-tool1.0.25e9f8b89Open report
NPM@uipath/functions-tool1.0.12e5ba6e7Open report
NPM@uipath/gov-tool0.3.11a7a15a9Open report
NPM@uipath/identity-tool0.1.1ecceca59Open report
NPM@uipath/insights-sdk1.0.1c57f6597Open report
NPM@uipath/insights-tool1.0.1db82e9e1Open report
NPM@uipath/integrationservice-sdk1.0.207b8c78fOpen report
NPM@uipath/integrationservice-tool1.0.2bbb1e8b4Open report
NPM@uipath/llmgw-tool1.0.18ace4fe1Open report
NPM@uipath/maestro-sdk1.0.14f1dcc04Open report
NPM@uipath/maestro-tool1.0.144d30254Open report
NPM@uipath/orchestrator-tool1.0.15e7f4237Open report
NPM@uipath/packager-tool-apiworkflow0.0.196d9453beOpen report
NPM@uipath/packager-tool-bpmn0.0.91d14151dOpen report
NPM@uipath/packager-tool-case0.0.974699f93Open report
NPM@uipath/packager-tool-connector0.0.19d2208b8eOpen report
NPM@uipath/packager-tool-flow0.0.1977c064caOpen report
NPM@uipath/packager-tool-functions0.1.17ad737b8Open report
NPM@uipath/packager-tool-webapp1.0.63b733a99Open report
NPM@uipath/packager-tool-workflowcompiler0.0.16a70cbe6eOpen report
NPM@uipath/packager-tool-workflowcompiler-browser0.0.34c5627a92Open report
NPM@uipath/platform-tool1.0.1de8b09deOpen report
NPM@uipath/project-packager1.1.166c451c11Open report
NPM@uipath/resource-tool1.0.1259aad08Open report
NPM@uipath/resourcecatalog-tool0.1.11fbb6ffdOpen report
NPM@uipath/resources-tool0.1.1149f0cf1eOpen report
NPM@uipath/robot1.3.4fb306900Open report
NPM@uipath/rpa-legacy-tool1.0.1d36db974Open report
NPM@uipath/rpa-tool0.9.522123e3eOpen report
NPM@uipath/solution-packager0.0.35b2f81c2fOpen report
NPM@uipath/solution-tool1.0.1e71c67c1Open report
NPM@uipath/solutionpackager-sdk1.0.11edacfc1eOpen report
NPM@uipath/solutionpackager-tool-core0.0.3453d0c3ffOpen report
NPM@uipath/tasks-tool1.0.1163ebcbfOpen report
NPM@uipath/telemetry0.0.7fb3bbfb4Open report
NPM@uipath/test-manager-tool1.0.2f14cb0ffOpen report
NPM@uipath/tool-workflowcompiler0.0.1210fe3010Open report
NPM@uipath/traces-tool1.0.1c4e9cf61Open report
NPM@uipath/ui-widgets-multi-file-upload1.0.17d5bb13aOpen report
NPM@uipath/uipath-python-bridge1.0.13322b323Open report
NPM@uipath/vertical-solutions-tool1.0.17fe7518fOpen report
NPM@uipath/vss0.1.6eb22a95dOpen report
NPM@uipath/widget.sdk1.2.36b8ea3b6Open report
NPMwot-api0.8.1–0.8.406203927Open report
PYPIguardrails-ai0.10.17285a55eOpen report
PYPImistralai2.4.608b296b4Open report
GITHUBvoicproducoesn/a67ffb546attacker account

References

  • OpenSourceMalware.com — Mini Shai-Hulud Campaign Tracker (tag: #mini-shai-hulud): https://opensourcemalware.com
  • Socket Security Research — TanStack npm Packages Compromised in Ongoing Mini Shai-Hulud Supply-Chain Attack: https://socket.dev/blog/tanstack-npm-packages-compromised-mini-shai-hulud
  • Socket Security — Mini Shai-Hulud Campaign Tracker (live): https://socket.dev/supply-chain-attacks/mini-shai-hulud
  • TanStack — Postmortem: OIDC Token Extraction via pull_request_target (GitHub repository)
  • OpenSourceMalware.com — 6mile: TeamPCP Hits 160+ Packages Including OpenSearch and Mistral AI
  • Wiz Research — Trivy Compromised by TeamPCP: https://wiz.io/blog/trivy-compromised-teampcp-supply-chain-attack
  • Endor Labs — TeamPCP Isn’t Done: LiteLLM PyPI Compromise (upstream campaign context)
  • Socket Security — CanisterWorm: npm Publisher Compromise Deploys Backdoor Across 29 Packages
  • Aikido Security — TeamPCP Deploys CanisterWorm on NPM Following Trivy Compromise
  • GitHub Advisory Database — GHSA-69fq-xp46-6×23 (Trivy ecosystem, upstream TeamPCP attribution)
  • MITRE ATT&CK — T1195.002 Supply Chain Compromise: Software Supply Chain

Francesco is an internationally renowned public speaker, with multiple interviews in high-profile publications (eg. Forbes), and an author of numerous books and articles, who utilises his platform to evangelize the importance of Cloud security and cutting-edge technologies on a global scale.

Discuss this blog with our community on Slack

Join our AppSec Phoenix community on Slack to discuss this blog and other news with our professional security team

From our Blog

TeamPCP’s Mini Shai-Hulud worm hit 170 npm packages across TanStack, OpenSearch, and Mistral AI via OIDC token theft. Full IOCs, detection, and remediation.
Francesco Cipollone
A coordinated npm supply chain attack hit SAP’s Cloud Application Programming Model toolchain on April 29, 2026, branding itself “Mini Shai-Hulud.” Four packages totalling 570,000 weekly downloads were poisoned in a 2-hour window. The payload uses Bun as a runtime to evade Node.js detection, pulls 134 credential paths from infected hosts, dumps GitHub Actions runner memory, and persists through Claude Code SessionStart hooks and VS Code tasks.json folderOpen triggers. Over 1,197 victim repositories were live on GitHub within hours. Zero CVEs assigned.
Francesco Cipollone
Between 21:57 and 23:30 UTC on April 22, 2026, a malicious @bitwarden/cli@2026.4.0 was live on npm for 93 minutes — long enough to reach CI/CD pipelines, developer workstations, and cloud automation hosts. The payload steals credentials across GitHub, AWS, GCP, and Azure, propagates as a self-replicating npm worm, injects GitHub Actions workflow stealers, and poisons AI coding assistants by injecting an invisible manifesto into shell configuration files. This is the first documented npm supply chain attack executed through Trusted Publishing.
Francesco Cipollone
Phoenix Security launched Phoenix Blue at VulnCon 2026 — a standalone agentic vulnerability intelligence platform at phxintel.security. The platform indexes 300K+ CVE records and 2,080,512 advisory references from 15+ sources, adds six proprietary scoring systems, zero-day pre-CVE detection, and malicious package monitoring. Free for everyone, built agent-first with REST, GraphQL, and MCP integration.
Francesco Cipollone
Contents
Derek

Derek Fisher

Head of product security at a global fintech

Derek Fisher – Head of product security at a global fintech. Speaker, instructor, and author in application security.

Derek is an award winning author of a children’s book series in cybersecurity as well as the author of “The Application Security Handbook.” He is a university instructor at Temple University where he teaches software development security to undergraduate and graduate students. He is a speaker on topics in the cybersecurity space and has led teams, large and small, at organizations in the healthcare and financial industries. He has built and matured information security teams as well as implemented organizational information security strategies to reduce the organizations risk.

Derek got his start in the hardware engineering space where he learned about designing circuits and building assemblies for commercial and military applications. He later pursued a computer science degree in order to advance a career in software development. This is where Derek was introduced to cybersecurity and soon caught the bug. He found a mentor to help him grow in cybersecurity and then pursued a graduate degree in the subject.

Since then Derek has worked in the product security space as an architect and leader. He has led teams to deliver more secure software in organizations from multiple industries. His focus has been to raise the security awareness of the engineering organization while maintaining a practice of secure code development, delivery, and operations.

In his role, Jeevan handles a range of tasks, from architecting security solutions to collaborating with Engineering Leadership to address security vulnerabilities at scale and embed security into the fabric of the organization.

Jeevan Singh

Jeevan Singh

Founder of Manicode Security

Jeevan Singh is the Director of Security Engineering at Rippling, with a background spanning various Engineering and Security leadership roles over the course of his career. He’s dedicated to the integration of security practices into software development, working to create a security-aware culture within organizations and imparting security best practices to the team.
In his role, Jeevan handles a range of tasks, from architecting security solutions to collaborating with Engineering Leadership to address security vulnerabilities at scale and embed security into the fabric of the organization.

James

James Berthoty

Founder of Latio Tech

James Berthoty has over ten years of experience across product and security domains. He founded Latio Tech to help companies find the right security tools for their needs without vendor bias.

christophe

Christophe Parisel

Senior Cloud Security Architect

Senior Cloud Security Architect

Chris

Chris Romeo

Co-Founder
Security Journey

Chris Romeo is a leading voice and thinker in application security, threat modeling, and security champions and the CEO of Devici and General Partner at Kerr Ventures. Chris hosts the award-winning “Application Security Podcast,” “The Security Table,” and “The Threat Modeling Podcast” and is a highly rated industry speaker and trainer, featured at the RSA Conference, the AppSec Village @ DefCon, OWASP Global AppSec, ISC2 Security Congress, InfoSec World and All Day DevOps. Chris founded Security Journey, a security education company, leading to an exit in 2022. Chris was the Chief Security Advocate at Cisco, spreading security knowledge through education and champion programs. Chris has twenty-six years of security experience, holding positions across the gamut, including application security, security engineering, incident response, and various Executive roles. Chris holds the CISSP and CSSLP certifications.

jim

Jim Manico

Founder of Manicode Security

Jim Manico is the founder of Manicode Security, where he trains software developers on secure coding and security engineering. Jim is also the founder of Brakeman Security, Inc. and an investor/advisor for Signal Sciences. He is the author of Iron-Clad Java: Building Secure Web Applications (McGraw-Hill), a frequent speaker on secure software practices, and a member of the JavaOne Rockstar speaker community. Jim is also a volunteer for and former board member of the OWASP foundation.

Join our Mailing list!

Get all the latest news, exclusive deals, and feature updates.

The IKIGAI concept
x  Powerful Protection for WordPress, from Shield Security PRO
This Site Is Protected By
Shield Security PRO