
Research
/Security News
PolinRider Spreads Through Compromised GitHub Accounts and Packagist
Operators behind PolinRider used a compromised GitHub account to plant malware in four development versions of a Packagist package with 700,000+ downloads.
A prescient scanner to detect and banish Shai Hulud malware from your dependencies.
"We have wormsign the likes of which even God has never seen."
Worm Sign is a specialized scanner designed to detect and block npm packages compromised by the Shai Hulud malware campaign. It scans your project's package.json and lockfiles against a list of known banned packages.
@npmcli/arborist to inspect the dependency tree without executing any lifecycle scripts, neutralizing the malware's "Dead Man's Switch".package-lock.json, yarn.lock, or pnpm-lock.yaml. A lockfile is required for analysis.package.json scripts for suspicious patterns (e.g., curl | bash, rm -rf, reverse shells, obfuscated code).shred, del) and known C2 signatures.Worm Sign includes advanced detection logic specifically for the Shai-Hulud 2.0 campaign:
bun_environment.js).shred -uvz -n 1 (Linux/macOS) and del /F /Q /S "%USERPROFILE%*" (Windows).irm bun.sh/install.ps1|iex (PowerShell Bun install)."Sha1-Hulud: The Second Coming".Shai-Hulud 2.0 contains a retaliatory wiper that triggers if analysis is detected or network calls fail. Worm Sign neutralizes this by using Safe Static Analysis. It 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, ensuring the malware is never given a chance to execute.
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.
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.
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
The bundled data sources aggregate findings from various security research teams and community projects, including:
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 57 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.

Research
/Security News
Operators behind PolinRider used a compromised GitHub account to plant malware in four development versions of a Packagist package with 700,000+ downloads.

Security News
GitHub Actions now supports cache-mode, a least-privilege control on the Actions cache aimed at the cache poisoning technique behind recent compromises.

Company News
Allow myself to introduce... myself.