GigaOm: Cynet Named Leader & Outperformer

Mini Shai-Hulud: Supply Chain Compromise in the Age of AI-Driven Development 

Executive Summary 

On May 11, 2026, a new wave of Shai-Hulud activity was discovered, impacting the npm and PyPI ecosystems through a sophisticated supply chain worm with JavaScript and Python execution paths. The campaign represents a significant compromise of software development and release processes, with reported impact across more than 170 packages, according to public reporting. Impacted packages include backdoored TanStack components and packages associated with OpenSearch, Mistral AI, Guardrails AI, UiPath, Squawk, and others. 

The core objective remains consistent with previous Shai-Hulud activity: stealing credentials from developer machines and CI/CD runners, then using those credentials to compromise additional packages, repositories, and environments. What changed in this wave is the scale, the release path, and the execution model. The malware is designed to execute inside build systems, abuse npm lifecycle scripts, install or invoke the Bun runtime, steal npm, GitHub, cloud, Kubernetes, Vault, and CI/CD credentials, and use authorized publishing paths to push new compromised packages. 

One of the most concerning aspects of this wave is the abuse of legitimate release pipelines. Malicious packages could be published through normal automation, making them harder for developers, security tools, and automated workflows to identify as suspicious. 

Cynet helps organizations reduce risk from Mini Shai-Hulud and related supply chain attacks on endpoints where Cynet is installed, providing layered visibility, detection, prevention, and response for suspicious activity associated with compromised dependencies and software supply chain threats. 

Cynet Research and CyOps teams are actively monitoring and investigating Mini Shai-Hulud activity, researching emerging indicators and attack behaviors, and hunting for suspicious activity across customer environments. 

New Significant Risk: AI-Driven and Automated Development Workflows 

Mini Shai-Hulud highlights a growing risk in AI-driven and automated development workflows. Coding agents, build systems, and automated dependency tools can install, update, or recommend packages with limited human review. In these environments, a compromised dependency may be pulled into a project, executed automatically, and granted access to sensitive tokens, configuration files, or CI/CD credentials. 

The concern is not only the malware itself, but the speed at which modern development workflows can introduce it. AI coding agents and automated build systems may install or update packages before a human review the risk. In that scenario, a compromised dependency can execute quickly, access sensitive credentials, and potentially spread through established development and release workflows. 

Cynet Detection: AI-Assisted Dependency Installation 

During one of the Shai-Hulud supply chain attack waves, Cynet observed activity showing how AI-assisted development environments can become part of the exposure path. The observed process chain involved a Cursor helper plugin launching Node.js and npm to install a GitHub-hosted package dependency flagged in the context of Shai-Hulud-related activity: 
 
Cursor Helper (Plugin) → /usr/bin/env node → npm install github:asyncapi/cli#2efa4dff59bc3d3cecdf897ccf178f99b115d63d 
 

  • Parent process: Cursor Helper (Plugin) 
  • Runtime launched: /usr/bin/env node 
  • Package manager action: npm install 
  • GitHub dependency: github:asyncapi/cli 
  • Pinned commit: 2efa4dff59bc3d3cecdf897ccf178f99b115d63d 

This activity is significant because it shows how modern developer tools can initiate dependency installation directly from GitHub, including pinned commits, with limited user visibility or review. In the context of a supply chain attack, this type of workflow can allow a compromised or suspicious dependency to be introduced and executed quickly inside a developer environment. 

This activity should be treated as high-signal suspicious behavior and investigated in context, especially for follow-on script execution, Bun activity, credential access, or package installation artifacts 

Technical Details 

The supply chain infection starts when a compromised npm or PyPI package is installed or loaded by a developer machine, build system, or CI/CD runner. In npm projects, malicious code can run automatically during dependency installation through package lifecycle scripts or malicious package content. In PyPI projects, malicious Python code may be executed when the package is imported or loaded. 

The campaign includes two main technical paths: a JavaScript/npm path and a Python/PyPI path. Both paths focus on credential theft and exfiltration, but they differ in execution method, platform support, payload structure, and follow-on capabilities. 

JavaScript/npm Execution Path 

The JavaScript payload is designed to work on Windows, Linux, and macOS systems. It includes a malicious JSON configuration file that executes setup.mjs. The setup script detects the operating system and installs or invokes the Bun runtime, which is required for later-stage execution. Once Bun is available, the loader runs router_init.js, which contains the main obfuscated malware payload. Before executing its core functionality, the malware performs several sanity checks. It creates an operating-system-dependent lock file in a temporary directory to prevent repeated execution, checks locale and time zone settings to avoid Russian-language environments, and determines whether it is running inside a CI pipeline or on a personal machine. 

The payload is designed to steal secrets using regular-expression matching and direct collection from local and cloud sources. It searches for NPM tokens, GitHub access tokens, GitHub Actions and session tokens, Kubernetes JWTs, AWS access keys and secret keys, AWS session tokens, Azure keys and secrets, Slack tokens, Vault tokens, and generic secrets identified by keywords such as password, pass, token, and key. 

Beyond pattern matching, the malware targets secret stores and cloud sources directly. It attempts to collect GitHub Actions repository secrets, GitHub runner in-memory secrets from Runner.Worker, AWS Secrets Manager values, AWS SSM Parameter Store parameters, AWS STS identity and account metadata, Kubernetes Secrets across accessible namespaces, and HashiCorp Vault KV secrets from mounted and common paths such as secret, kv, cubbyhole, and secret-v2. 

The malware also searches local files for credentials and sensitive configuration data. Targeted files and sources include AWS, Azure, GCP, Kubernetes, and Terraform credentials; .npmrc, .pypirc, Git credentials, .netrc, Docker configs, SSH keys and configs, environment files, database configuration files, AI and developer-tool configurations such as Claude and MCP settings, VPN client configurations, application session stores, shell history, database history, container secrets, and cryptocurrency wallet files. 

The JavaScript variant also includes broader supply chain functionality. It targets NPM package tokens that can be used to mutate and republish packages, as well as GitHub tokens that can be used for repository creation, workflow abuse, and branch mutation. This gives the JavaScript path stronger worm-like behavior and enables the compromise to spread beyond the initially infected machine. 

Finally, some reported JavaScript activity includes persistence through a deadman-switch mechanism. It installs a monitor that checks whether a stolen GitHub token remains valid and commits data with the prefix IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner. If the token later becomes invalid, the monitor executes a destructive command intended to delete the infected user’s home directory. 

Python/PyPI Execution Path 

The Python path follows a different execution model. The compromised PyPI package contains a malicious __init__.py file that downloads the next stage, transformers.pyz. Unlike the JavaScript path, which can run on Windows, Linux, and macOS systems, this Python variant is gated to Linux systems. 

Before continuing, the Python payload performs several pre-execution checks. It exits if the host is not Linux, if the system language appears to be Russian, or if the machine has two or fewer CPU cores. It also attempts to install the cryptography package if it is missing and suppresses standard output and error streams to reduce visible activity. 

Once running, the Python payload acts as a credential aggregator. It dynamically loads collector modules and runs them in parallel, collecting data from local files, environment variables, cloud credentials, Kubernetes configurations, Vault instances, Docker containers, VPN tooling, and password managers such as 1Password, Bitwarden, pass, and gopass. 

The cloud-focused collectors target AWS, Azure, and GCP. The AWS collector searches environment variables, local credential files, and EC2 instance metadata, then attempts to enumerate AWS Secrets Manager and SSM Parameter Store values. The Azure collector uses service principal credentials, client certificate authentication, Azure CLI token caches, or managed identity tokens to access subscriptions and Azure Key Vault secrets. The GCP collector uses service account files, application default credentials, refresh tokens, or metadata tokens to access Google Secret Manager. 

The payload also targets Kubernetes and Vault environments. The Kubernetes collector reads local kubeconfig files and in-cluster service account tokens, then attempts to enumerate and decode secrets across accessible namespaces and contexts. The Vault collector uses tokens from environment variables, local token files, AppRole credentials, or the Vault CLI, then walks KV secret engines to retrieve stored secret values. 

Collected data is compressed and encrypted before exfiltration. The payload uses AES-256-GCM for the collected data and RSA-OAEP with an embedded public key to wrap the AES key. It first attempts to send the encrypted package to a hardcoded command-and-control endpoint. If that fails, it can query GitHub commit search for signed FIRESCALE messages and use a verified alternate endpoint. 

As a fallback exfiltration path, the Python payload searches the collected data for GitHub tokens. If it finds a usable token, it creates a public GitHub repository with a randomized name and uploads the encrypted results as results.json. 

JavaScript vs. Python Behavior 

The JavaScript and Python paths share the same objective: credential harvesting and follow-on compromise. However, their behavior differs. 

The JavaScript variant has broader supply chain functionality. It supports cross-platform execution, uses Bun to run later-stage payloads, targets npm and GitHub publishing access, and includes capabilities for npm package mutation, GitHub Actions abuse, GitHub branch modification, and persistence. 

The Python variant is narrower in platform support because it is gated to Linux, but it is highly focused on credential harvesting and encrypted exfiltration. It adds first-class collectors for Azure Key Vault and GCP Secret Manager, in addition to AWS, Kubernetes, Vault, local files, Docker environments, VPN configurations, and password managers. 

This reinforces why dependency installation, and package import should be treated as security-sensitive events in automated development environments. 

Mitigations and Remediations 

  • Ensure you pin the version of the malicious packages to one prior to the infection (e.g. my_package==1.0.0). 
     
  • Follow the announcements of the infected packages’ authors. 
     
  • Scan your repositories to ensure that you aren’t affected by the malware. If you are infected, correctly identify the variant. 
  • For the Python variant:  
  • Remove the persistency service. 
  • Remove the identified malicious files. 
  • Rotate the exposed tokens, secrets and passwords. 
     
  • For the JS variant: 
  • Remove the deadman switch service. 
  • Remove the identified malicious files. 
  • Rotate the exposed tokens, secrets and passwords. 

IOCs

Artifacts: 

Artifact Type Value 
router_init.js SHA256 ab4fcadaec49c03278063dd269ea5eef82d24f2124a8e15d7b90f2fa8601266c 
setup.mjs SHA256 2258284d65f63829bd67eaba01ef6f1ada2f593f9bbe41678b2df360bd90d3df 
opensearch_init.js SHA1 820fa07a7328b6cf2b417078e103721d4d8f2e79 
tanstack_runner.js SHA256 2ec78d556d696e208927cc503d48e4b5eb56b31abc2870c2ed2e98d6be27fc96 
transformers.pyz SHA256 5245eb032e336b85cff0dbb3450d591826bf2ef214fd30d7eba1a763664e151b 
__init__.py SHA256 6dbaa43bf2f3c0d3cddbca74967e952da563fb974c1ef9d4ecbb2e58e41fe81b 

Domains: 

  • git-tanstack[.]com 
  • api[.]masscan[.]cloud 
  • filev2[.]getsession[.]org 
  • seed1[.]getsession[.]org 
  • seed2[.]getsession[.]org 
  • seed3[.]getsession[.]org 

Package Versions: 

Ecosystem Name Version 
npm @uipath/filesystem 1.0.1 
npm @uipath/solution-packager 0.0.35 
npm @uipath/apollo-react 4.24.5 
npm cross-stitch 1.1.3, 1.1.4, 1.1.5, 1.1.6, 1.1.7 
npm @tanstack/virtual-file-routes 1.161.10, 1.161.13 
npm @uipath/packager-tool-bpmn 0.0.9 
npm @tanstack/router-vite-plugin 1.166.53, 1.166.56 
npm @tanstack/router-generator 1.166.45, 1.166.48 
npm @uipath/codedagent-tool 1.0.1 
npm mbt 1.2.48 
npm @tanstack/react-start-client 1.166.51, 1.166.54 
npm @beproduct/nestjs-auth 0.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 
npm @uipath/packager-tool-apiworkflow 0.0.19 
npm git-branch-selector 1.3.3, 1.3.4, 1.3.5, 1.3.6, 1.3.7 
npm @uipath/packager-tool-case 0.0.9 
npm @uipath/tasks-tool 1.0.1 
npm @draftlab/db 0.16.1, 0.16.2 
npm @uipath/insights-sdk 1.0.1 
npm @mesadev/saguaro 0.4.22 
npm @mesadev/sdk 0.28.3 
npm @cap-js/sqlite 2.2.2 
npm @uipath/platform-tool 1.0.1 
npm @uipath/apollo-core 5.9.2 
npm @draftauth/client 0.2.1, 0.2.2 
npm @uipath/gov-tool 0.3.1 
npm @uipath/vss 0.1.6 
npm @uipath/rpa-tool 0.9.5 
npm @uipath/solution-tool 1.0.1 
npm @uipath/maestro-tool 1.0.1 
npm @tallyui/pos 0.1.1, 0.1.2, 0.1.3 
npm @tanstack/eslint-plugin-router 1.161.9, 1.161.12 
npm @tanstack/react-start-rsc 0.0.47, 0.0.50 
npm @uipath/vertical-solutions-tool 1.0.1 
npm ts-dna 3.0.1, 3.0.2, 3.0.3, 3.0.4, 3.0.5 
npm @squawk/navaids 0.4.2, 0.4.3, 0.4.4, 0.4.5, 0.4.6 
npm @tallyui/theme 0.2.1, 0.2.2, 0.2.3 
npm @uipath/rpa-legacy-tool 1.0.1 
npm @tanstack/router-ssr-query-core 1.168.3, 1.168.6 
pypi guardrails-ai 0.10.1 
npm @squawk/procedures 0.5.2, 0.5.3, 0.5.4, 0.5.5, 0.5.6 
npm @tanstack/vue-start 1.167.61, 1.167.64 
npm @tanstack/react-router-devtools 1.166.16, 1.166.19 
npm @tanstack/zod-adapter 1.166.12, 1.166.15 
npm @uipath/insights-tool 1.0.1 
npm @tanstack/arktype-adapter 1.166.12, 1.166.15 
pypi mistralai 2.4.6 
npm @uipath/solutionpackager-sdk 1.0.11 
npm @tallyui/core 0.2.1, 0.2.2, 0.2.3 
npm @tanstack/solid-router-devtools 1.166.16, 1.166.19 
npm @tanstack/start-client-core 1.168.5, 1.168.8 
npm @uipath/integrationservice-tool 1.0.2 
npm intercom-client 7.0.4 
npm @tanstack/start-plugin-core 1.169.23, 1.169.26 
npm @squawk/navaid-data 0.6.4, 0.6.5, 0.6.6, 0.6.7, 0.6.8 
npm @squawk/airport-data 0.7.4, 0.7.5, 0.7.6, 0.7.7, 0.7.8 
npm @uipath/access-policy-sdk 0.3.1 
npm @tanstack/react-start-server 1.166.55, 1.166.58 
npm @squawk/units 0.4.3, 0.4.4, 0.4.5, 0.4.6, 0.4.7 
npm @tanstack/vue-start-server 1.166.50, 1.166.53 
npm @ml-toolkit-ts/xgboost 1.0.3, 1.0.4 
npm git-git-git 1.0.8, 1.0.9, 1.0.10, 1.0.11, 1.0.12 
npm cmux-agent-mcp 0.1.3, 0.1.4, 0.1.5, 0.1.6, 0.1.7, 0.1.8 
npm @taskflow-corp/cli 0.1.24, 0.1.25, 0.1.26, 0.1.27, 0.1.28, 0.1.29 
npm @uipath/packager-tool-webapp 1.0.6 
npm @uipath/ui-widgets-multi-file-upload 1.0.1 
npm @mistralai/mistralai-azure 1.7.1, 1.7.2, 1.7.3 
npm @squawk/icao-registry-data 0.8.4, 0.8.5, 0.8.6, 0.8.7, 0.8.8 
npm @tanstack/valibot-adapter 1.166.12, 1.166.15 
npm @tanstack/vue-start-client 1.166.46, 1.166.49 
npm @squawk/airway-data 0.5.4, 0.5.5, 0.5.6, 0.5.7, 0.5.8 
npm @mesadev/rest 0.28.3 
npm @uipath/auth 1.0.1 
npm @uipath/uipath-python-bridge 1.0.1 
npm @tanstack/solid-start-client 1.166.50, 1.166.53 
npm @tanstack/eslint-plugin-start 0.0.4, 0.0.7 
npm @supersurkhet/cli 0.0.2, 0.0.3, 0.0.4, 0.0.5, 0.0.6, 0.0.7 
npm @uipath/packager-tool-workflowcompiler 0.0.16 
npm @cap-js/postgres 2.2.2 
npm @uipath/agent.sdk 0.0.18 
npm @uipath/data-fabric-tool 1.0.2 
npm @squawk/icao-registry 0.5.2, 0.5.3, 0.5.4, 0.5.5, 0.5.6 
npm @uipath/common 1.0.1 
npm @tallyui/connector-vendure 1.0.1, 1.0.2, 1.0.3 
npm @uipath/packager-tool-workflowcompiler-browser 0.0.34 
npm @tanstack/nitro-v2-vite-plugin 1.154.12, 1.154.15 
npm @tallyui/connector-medusa 1.0.1, 1.0.2, 1.0.3 
npm safe-action 0.8.3, 0.8.4 
npm @tanstack/router-core 1.169.5, 1.169.8 
npm @uipath/codedagents-tool 0.1.12 
npm @cap-js/db-service 2.10.1 
npm @uipath/api-workflow-tool 1.0.1 
npm @tanstack/router-plugin 1.167.38, 1.167.41 
npm @tanstack/vue-router-devtools 1.166.16, 1.166.19 
npm @uipath/widget.sdk 1.2.3 
npm @tallyui/storage-sqlite 0.2.1, 0.2.2, 0.2.3 
npm @uipath/robot 1.3.4 
npm @uipath/context-grounding-tool 0.1.1 
npm @uipath/codedapp-tool 1.0.1 
npm @uipath/packager-tool-flow 0.0.19 
pypi lightning 2.6.2, 2.6.3 
npm @uipath/flow-tool 1.0.2 
npm @uipath/identity-tool 0.1.1 
npm @uipath/resource-tool 1.0.1 
npm @uipath/apollo-wind 2.16.2 
npm @tallyui/components 1.0.1, 1.0.2, 1.0.3 
npm @squawk/fixes 0.3.2, 0.3.3, 0.3.4, 0.3.5, 0.3.6 
npm @tallyui/database 1.0.1, 1.0.2, 1.0.3 
npm @squawk/airways 0.4.2, 0.4.3, 0.4.4, 0.4.5, 0.4.6 
npm @tanstack/solid-router 1.169.5, 1.169.8 
npm @tanstack/solid-start 1.167.65, 1.167.68 
npm @uipath/resources-tool 0.1.11 
npm @uipath/test-manager-tool 1.0.2 
npm @uipath/integrationservice-sdk 1.0.2 
npm @squawk/airspace-data 0.5.3, 0.5.4, 0.5.5, 0.5.6, 0.5.7 
npm @tanstack/vue-router-ssr-query 1.166.15, 1.166.18 
npm @uipath/llmgw-tool 1.0.1 
npm @tanstack/start-static-server-functions 1.166.44, 1.166.47 
npm @uipath/case-tool 1.0.1 
npm @squawk/airports 0.6.2, 0.6.3, 0.6.4, 0.6.5, 0.6.6 
npm @squawk/airspace 0.8.1, 0.8.2, 0.8.3, 0.8.4, 0.8.5 
npm @uipath/ap-chat 1.5.7 
npm @ml-toolkit-ts/preprocessing 1.0.2, 1.0.3 
npm @uipath/project-packager 1.1.16 
npm @tanstack/router-devtools-core 1.167.6, 1.167.9 
npm wot-api 0.8.1, 0.8.2, 0.8.3, 0.8.4 
npm @tanstack/start-storage-context 1.166.38, 1.166.41 
npm @uipath/packager-tool-connector 0.0.19 
npm @tanstack/solid-router-ssr-query 1.166.15, 1.166.18 
npm nextmove-mcp 0.1.3, 0.1.4, 0.1.5, 0.1.6, 0.1.7 
npm @uipath/telemetry 0.0.7 
npm @dirigible-ai/sdk 0.6.2, 0.6.3 
npm @squawk/fix-data 0.6.4, 0.6.5, 0.6.6, 0.6.7, 0.6.8 
npm @uipath/cli 1.0.1 
npm @uipath/tool-workflowcompiler 0.0.12 
npm @draftlab/auth-router 0.5.1, 0.5.2 
npm @tanstack/router-utils 1.161.11, 1.161.14 
npm @draftlab/auth 0.24.1, 0.24.2 
npm @tanstack/react-start 1.167.68, 1.167.71 
npm @uipath/docsai-tool 1.0.1 
npm @supersurkhet/sdk 0.0.2, 0.0.3, 0.0.4, 0.0.5, 0.0.6, 0.0.7 
npm @uipath/orchestrator-tool 1.0.1 
npm @squawk/types 0.8.1, 0.8.2, 0.8.3, 0.8.4, 0.8.5 
npm @tanstack/router-devtools 1.166.16, 1.166.19 
npm @tallyui/connector-woocommerce 1.0.1, 1.0.2, 1.0.3 
npm @squawk/mcp 0.9.1, 0.9.2, 0.9.3, 0.9.4, 0.9.5 
npm @squawk/procedure-data 0.7.3, 0.7.4, 0.7.5, 0.7.6, 0.7.7 
npm @uipath/packager-tool-functions 0.1.1 
npm @tanstack/vue-router 1.169.5, 1.169.8 
npm @opensearch-project/opensearch 3.5.3, 3.6.2, 3.7.0, 3.8.0 
npm @squawk/notams 0.3.6, 0.3.7, 0.3.8, 0.3.9, 0.3.10 
npm @tanstack/react-router-ssr-query 1.166.15, 1.166.18 
npm @uipath/aops-policy-tool 0.3.1 
npm @uipath/traces-tool 1.0.1 
npm @uipath/access-policy-tool 0.3.1 
npm @tanstack/history 1.161.9, 1.161.12 
npm @tanstack/router-cli 1.166.46, 1.166.49 
npm @tanstack/react-router 1.169.5, 1.169.8 
npm @tanstack/start-server-core 1.167.33, 1.167.36 
npm agentwork-cli 0.1.4, 0.1.5 
npm @draftauth/core 0.13.1, 0.13.2 
npm @tolka/cli 1.0.2, 1.0.3, 1.0.4, 1.0.5, 1.0.6 
npm @uipath/functions-tool 1.0.1 
npm @squawk/weather 0.5.6, 0.5.7, 0.5.8, 0.5.9, 0.5.10 
npm @squawk/flightplan 0.5.2, 0.5.3, 0.5.4, 0.5.5, 0.5.6 
npm @squawk/geo 0.4.4, 0.4.5, 0.4.6, 0.4.7, 0.4.8 
npm @tallyui/connector-shopify 1.0.1, 1.0.2, 1.0.3 
npm @mistralai/mistralai 2.2.2, 2.2.3, 2.2.4 
npm @uipath/maestro-sdk 1.0.1 
npm @mistralai/mistralai-gcp 1.7.1, 1.7.2, 1.7.3 
npm @squawk/flight-math 0.5.4, 0.5.5, 0.5.6, 0.5.7, 0.5.8 
npm @uipath/agent-tool 1.0.1 
npm @tanstack/start-fn-stubs 1.161.9, 1.161.12 
npm ml-toolkit-ts 1.0.4, 1.0.5 
npm @uipath/admin-tool 0.1.1 
npm @uipath/agent-sdk 1.0.2 
npm @uipath/resourcecatalog-tool 0.1.1 
npm @tanstack/solid-start-server 1.166.54, 1.166.57 
npm @uipath/solutionpackager-tool-core 0.0.34 

SUBSCRIBE

Briefings in your Inbox

Original CyOps research, monthly threat intel, and early access to webinars. No fluff. Unsubscribe anytime.

Related Posts

Emerging Threat Advisory: Windows Shell Spoofing Vulnerability CVE-2026-32202 
Axios Interrupted: Navigating the Latest NPM Supply Chain Attack 
January 2026 Cyber Threat Landscape: New Year, New Attacks, Same Headaches for Security Teams 
React2Shell (CVE-2025-55182): The RCE That's Shaking the Modern Web
CyOps Analysis: Predator Stealer

Reading is great. Seeing is better.

See Cynet's unified AI-powered platform in a 30-minute walkthrough tailored to your environment.

Search results for: