Cross-ecosystem package supply chain risk scorer. A small supply chain utility by Hijack Security.
Look up any package on npm, PyPI, Maven Central, Go, or NuGet and get a one-page risk report combining live registry metadata with OSV.dev advisories — including confirmed-malicious packages from the OpenSSF Malicious Packages dataset.
- Single-package lookup with a letter grade and prioritized findings
- Lockfile / multi-package scan — paste a
package.json,package-lock.json,yarn.lock,pnpm-lock.yaml,requirements.txt,Pipfile,Pipfile.lock,pyproject.toml,go.mod,pom.xml, or.csprojand scan every dependency in parallel - Version-aware — findings are split into "affects current version" and "historical advisories" so the grade reflects current risk, not history
- Confirmed-malicious detection —
MAL-*IDs from OpenSSF plus keyword-matched malware advisories trigger an explicit "do not install" warning - Cross-ecosystem typosquat detection — Levenshtein distance vs popular-package baselines, with download-threshold suppression to cut false positives
- Shareable URL state — every result has a permalink (
#eco=npm&pkg=lodash) you can paste into incident threads - Markdown / JSON export — copy a clean report into Jira, Slack, GitHub PR comments, or audit logs
- README badge — embed a live grade badge in your project's README, fetched fresh from OSV on every render
- No backend, no tracking — every fetch happens in the user's browser. Hosted as a single static HTML file.
- Production: https://supplycheck.hijacksecurity.com
- Single package: append
#eco=npm&pkg=lodashto the URL - Lockfile scan: switch to "Lockfile / multi-package scan" tab and paste a manifest
- README badge:
— supportseco=npm|pypi|maven|go|nuget. The result page has a "Copy README badge" button that produces this snippet for any package you look up.
| Query | What you'll see |
|---|---|
lodash (npm) |
Clean baseline. Grade A, ~10 historical advisories all properly tagged with fix versions. |
loadsh (npm) |
Typosquat detection — distance 2 from lodash. |
event-stream (npm) |
Republished safe version (4.0.1). The infamous flatmap-stream advisory is in historical. |
ua-parser-js (npm) |
Post-incident clean version. Embedded-malware GHSA correctly stays in historical. |
com.fasterxml.jackson.core:jackson-databind (Maven) |
0 current findings, 60+ historical CVEs — perfect demo of the version-aware split. |
github.com/gin-gonic/gin (Go) |
Clean Go baseline; positive checksum-database signal. |
- Registries: registry.npmjs.org, pypi.org, deps.dev (Maven, Go), api.nuget.org
- Download stats: api.npmjs.org
- Vulnerabilities & malicious packages: OSV.dev — aggregates GHSA, OpenSSF Malicious Packages, PyPA, Go vulnerability database, RustSec, and more
All requests are made directly from the user's browser.
Single-file static site. ~1700 lines of HTML/CSS/vanilla JS. No build step, no dependencies, no backend.
supplycheck/
├── index.html # the entire app
├── vercel.json # security headers + routing
├── README.md
└── LICENSE
Per-ecosystem adapters share a normalized package shape (fetchPkg(name) → NormalizedPackage, analyze(pkg) → Finding[]). Universal heuristics (age, maintainer count, repo presence, typosquat) run on every lookup; ecosystem-specific signals layer on top.
Universal
- Newly-published / fairly-young package
- Stale (latest > 2 years old)
- Single maintainer
- Missing source repository
- Typosquat distance vs ecosystem top-N (suppressed when query is itself popular)
- Non-ASCII / homoglyph in name
npm
preinstall/install/postinstalllifecycle scripts- Sigstore provenance attestation present / missing
binentries colliding with system binaries- Package version deprecated
PyPI
- Source distribution only (no wheel) — install runs setup.py
- PEP 740 attestations present / missing
- Yanked release
- Self-declared early development status
Maven Central
- Shallow groupId (non-reverse-DNS)
com.github.<user>namespace mismatch with declared repo
Go modules
- Module-path host outside the well-known set
- Positive: protected by Go checksum database
NuGet
- Unlisted version
- Deprecated package
- Vulnerability advisories present in NuGet catalog
OSV.dev (cross-ecosystem)
MAL-*IDs →critical+ "DO NOT INSTALL"- Keyword-detected malware (
embedded malware,malicious code,backdoor,crypto-stealer,info-stealer,protestware, ...) →critical - Standard advisories with severity mapped from OSV CVSS scores
- Removed-from-registry packages with malicious history are still flagged
./scripts/dev-up.sh # → http://127.0.0.1:3004
./scripts/dev-down.sh # stopThe scripts wrap python3 -m http.server with PID tracking and an idempotent up. Or roll your own with any static file server — nothing to install.
Hosted on Vercel as a static site:
| Branch | Environment | URL |
|---|---|---|
main |
Production | https://supplycheck.hijacksecurity.com |
test |
Staging / preview | auto-generated by Vercel |
To deploy:
- Push this repo to GitHub (
hijacksecurity/supplycheck). - In Vercel, Add New → Project and import the repo.
- Framework preset: Other (static). Build command: leave blank. Output directory:
.(root). - Set Production Branch to
mainin Settings → Git. - Push to
testto get an auto-generated preview URL with a stable slug likesupplycheck-git-test-hijacksecurity.vercel.app.
Security headers (X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy) are applied via vercel.json.
MIT — use it, fork it, embed it, build on it.
Issues and PRs welcome at hijacksecurity/supplycheck.
Reasonable additions:
- More signals per ecosystem (e.g. PyPI maintainer 2FA status when surfaced, RubyGems / crates.io adapters)
- Nightly refresh of the typosquat top-N lists via a small build script
- An SVG badge endpoint (
/badge?eco=npm&pkg=lodash→ grade SVG) for embedding in READMEs
supplycheck is a triage aid, not a verdict. Findings are heuristic — high severity ≠ malicious, info ≠ safe. Use it to focus manual review and pair it with your own threat modelling. The MAL-* and keyword-matched malware findings are ground-truth from public datasets, but no automated tool catches every supply chain attack.
Built by Hijack Security.