
Security News
The Code You Didn't Write Is Still Yours to Defend
AI agents are pulling packages into environments no scanner is watching, creating exposure before security teams can see it.
A security scanner that detects npm packages compromised by supply chain attacks, including the TanStack wave 4 attack (May 2026), the Axios attack (March 2026), and Shai-Hulud malware.
"We have wormsign the likes of which even God has never seen."
Worm Sign is a static-analysis scanner that finds npm supply-chain worms in your package.json and lockfile — focused on what npm audit misses: install-time manifest tampering, dropped-file hashes, campaign IOC strings, and suspicious binary-fetch hosts.
package-lock.json files that were committed before the unpublish.optionalDependencies, commit-pinned deps), and install-time vectors (non-standard binary.host).The package count alone isn't a strong differentiator — npm audit already covers the GHSA-listed name@versions. Worm Sign's value is the heuristic layer that catches install-time vectors before they're catalogued.
Now detecting the May 2026 TanStack supply chain attack — the fourth wave of the Shai-Hulud worm, which republished 42
@tanstack/*packages (84 versions) with valid SLSA provenance after extracting an OIDC token via GitHub Actions cache poisoning.
On May 11, 2026, attacker group TeamPCP poisoned the tanstack/router GitHub Actions cache via a fork pull request, extracted the legitimate OIDC publishing token, and republished 42 @tanstack/* packages with malware — producing valid SLSA Build Level 3 attestations. The worm then propagated to 170+ secondary victim packages (including @mistralai/mistralai, @uipath/*, @draftlab/*, @squawk/*, safe-action, cmux-agent-mcp, nextmove-mcp, ts-dna, cross-stitch).
Tracked as CVE-2026-45321 / GHSA-g7cv-rxg3-hmpx.
If you installed any @tanstack/* package between 11:29 UTC and 19:15 UTC on May 11, 2026, run worm-sign immediately.
Worm Sign detects this attack through multiple layers:
@tanstack/* packages × 2 versions each from GHSA-g7cv-rxg3-hmpx, plus secondary victim @mistralai/mistralai@2.2.2–2.2.4.router_init.js (ab4fcadaec…) and tanstack_runner.js (2ec78d556d…).analyzeManifest heuristic flags the malicious optionalDependencies entry "@tanstack/setup": "github:tanstack/router#79ac49eedf…", including the truncated form and any commit-pinned git ref in optionalDependencies.EveryBoiWeBuildIsAWormyBoi (campaign ID), IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner (dead-man's-switch trigger that runs rm -rf ~/ on token revocation), OhNoWhatsGoingOnWithGitHub (token-recovery magic string), and the unique PBKDF2 salt svksjrhjkcejg.filev2.getsession.org, api.masscan.cloud, git-tanstack.com, and second-stage payload URLs at litter.catbox.moe/h8nc9u.js / litter.catbox.moe/7rrc6l.mjs.router_init.js, tanstack_runner.js, router_runtime.js, gh-token-monitor.sh, gh-token-monitor.service, and com.user.gh-token-monitor.plist.dependabout/ branch impersonation and claude@users.noreply.github.com spoofed commit author used by the worm to push exfiltration commits.On March 31, 2026, the axios HTTP client was compromised after the primary maintainer's npm account was hijacked. Two malicious versions (1.14.1 and 0.30.4) injected plain-crypto-js as a phantom dependency — a package whose sole purpose was to execute a postinstall script that drops a cross-platform RAT targeting macOS, Windows, and Linux.
If you installed axios between ~00:21 and ~03:30 UTC on March 31, run worm-sign immediately.
Worm Sign detects this attack through multiple layers:
axios@1.14.1, axios@0.30.4, plain-crypto-js@4.2.1/4.2.0, and related attacker packages (@shadanai/openclaw, @qqbrowser/openclaw-qbot).sfrclak.com, calltan.com, callnrwise.com) and IP (142.11.206.73).com.apple.act.mond), Windows (6202033.ps1), and Linux (ld.py).execSync+nohup background execution, self-deleting setup.js scripts, XOR obfuscation with key OrDeR_7077, and the spoofed IE8 User-Agent string.irm|iex remote execution patterns used in Windows payload delivery.@npmcli/arborist to inspect the dependency tree without executing any lifecycle scripts — the malware never gets a chance to run.optionalDependencies entries and commit-pinned git refs used to smuggle payloads (the TanStack wave 4 vector).package.json binary.host pointing at non-standard domains — install-time binaries are not covered by lockfile integrity hashes.tests/unit.test.ts) asserting they do NOT fire on common benign inputs (RFC1918 IPs, curl --version, bun run, JWT-like strings, etc.).package.json scripts for suspicious patterns — RAT droppers, curl | bash, reverse shells, XOR obfuscation, self-deleting scripts, and more.package-lock.json, yarn.lock, or pnpm-lock.yaml.Worm Sign parses your lockfile directly (using Arborist.loadVirtual()) to build an in-memory dependency graph. It never runs npm install or executes preinstall/postinstall scripts during scanning — this is critical because both the Axios attack (postinstall RAT dropper) and Shai-Hulud 2.0 (retaliatory wiper "Dead Man's Switch") activate through lifecycle scripts.
All malware signatures (filenames, patterns, hashes) are stored in plain text within the source code. We explicitly avoid obfuscation techniques to distinguish this security tool from the malware it detects. You can inspect the signatures in src/generated/signatures.ts.
This package is published with npm provenance. You can verify the build attestation on the npm registry to confirm that the package you are installing was built from this specific GitHub repository and has not been tampered with.
Worm Sign also covers the Shai-Hulud 2.0 worm campaign (1,717+ compromised packages) with detection for high-entropy packed payloads, destructive wiper commands (shred, del), PowerShell installation vectors, and C2 signatures.
npm install -g worm-sign
Run the scanner in your project root. It uses the bundled list of banned packages by default.
worm-sign
Fetch the latest list of vulnerable packages from configured remote sources (e.g., Datadog, Koi).
worm-sign --fetch
Configured Remote Sources:
You can also fetch from a custom URL. You must specify the data format (json or csv).
JSON Format:
Expects an object with a packages array: { "packages": [ { "name": "pkg", "version": "1.0.0" } ] }.
worm-sign --url "https://example.com/vulns.json" --data-format json
Note: The scanner will attempt to fetch from this URL in addition to other configured sources. If the fetch fails, it will warn you but continue scanning with other available sources.
CSV Format:
Expects a CSV with name and version columns (headers are ignored if they don't look like package names, but standard format is name,version).
worm-sign --url "https://example.com/vulns.csv" --data-format csv
Hash Support:
The CSV format also supports an optional integrity column (or hash, shasum). If provided, the scanner will verify the package integrity against your lockfile.
name,version,integrity
safe-package,1.0.0,sha512-badhash...
Generate a SARIF report for security tools:
worm-sign --format sarif > results.sarif
Install a pre-commit hook to automatically scan before every commit:
worm-sign --install-hook
Disable caching if you need to force a fresh fetch:
worm-sign --fetch --no-cache
Add this to your GitHub Actions workflow:
- name: Run Worm Sign
run: npx worm-sign --format sarif
By default, worm-sign will:
.csv package lists from the sources/ directory.sources/*.json (e.g., Datadog, Koi).You do not need to pass --fetch explicitly; the scanner automatically processes all configured sources.
Worm Sign fetches threat intelligence from the following public endpoints. Ensure your firewall allows outbound HTTPS (443) access to:
raw.githubusercontent.comdocs.google.comWorm Sign respects standard proxy environment variables. If you are behind a corporate proxy, set:
HTTPS_PROXY (or https_proxy)HTTP_PROXY (or http_proxy)NO_PROXY (or no_proxy)For large organizations or high-volume CI/CD environments, we recommend mirroring the data sources internally to avoid rate limiting or external dependency failures.
To avoid rate limiting or external dependency failures, you can host the data sources on an internal server (e.g., Artifactory, S3).
If using the npm package directly:
Use the --offline flag to disable default remote fetches, and provide your internal mirror URL via the --url flag.
CSV Example:
npx worm-sign --offline --url "https://internal.example.com/compromised-packages.csv" --data-format csv
JSON Example:
npx worm-sign --offline --url "https://internal.example.com/compromised-packages.json" --data-format json
Self-Signed Certificates:
If your internal server uses a self-signed certificate, use the --insecure flag to bypass SSL verification:
npx worm-sign --offline --insecure --url "https://internal.example.com/compromised-packages.json" --data-format json
If maintaining a fork:
Update the sources/*.json files in your repository to point to your internal URLs. This allows you to distribute a pre-configured version of the scanner to your team.
If you prefer to rely solely on the bundled local CSVs (which are updated with each package release), you can disable remote fetching:
npx worm-sign --offline
This will only scan against the local .csv files found in the sources/ directory.
| Option | Description | Default |
|---|---|---|
-f, --fetch | Fetch the latest compromised packages from the API | false |
-u, --url <url> | Custom API URL to fetch compromised packages from | - |
--data-format <format> | Data format for custom URL (json, csv) | json |
-p, --path <path> | Path to the project to scan | . |
--format <format> | Output format (text, sarif) | text |
--no-cache | Disable caching of API responses | false |
--install-hook | Install a pre-commit hook to run worm-sign | false |
--dry-run | Run scan but always exit with 0 (useful for CI) | false |
--offline | Disable network requests (implies --no-fetch) | false |
--insecure | Disable SSL certificate verification | false |
--debug | Enable debug logging | false |
Scan a specific directory:
worm-sign --path ./projects/my-app
Run in CI (Dry Run):
Use --dry-run to see what would be found without failing the build (exit code 0).
worm-sign --dry-run
Debug Mode: Enable verbose logging to troubleshoot issues.
worm-sign --debug
Threat intelligence is aggregated from the security research community, including:
TanStack Attack (Wave 4):
Axios Attack:
Shai-Hulud:
This project is licensed under the MIT License - see the LICENSE file for details.
FAQs
A security scanner that detects npm packages compromised by supply chain attacks, including the TanStack wave 4 attack (May 2026), the Axios attack (March 2026), and Shai-Hulud malware.
The npm package worm-sign receives a total of 41 weekly downloads. As such, worm-sign popularity was classified as not popular.
We found that worm-sign demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
AI agents are pulling packages into environments no scanner is watching, creating exposure before security teams can see it.

Security News
GitHub Actions checkout now blocks risky pull_request_target checkouts by default to help prevent pwn request supply chain attacks.

Product
Socket now supports Custom Roles and Repository Access Permissions so organizations can control who can access specific repositories and actions.