Docs / CLI / Supply-chain Threat DB

Supply-chain Threat Database

arcis sca ships with 100 curated supply-chain advisories embedded in the binary. Browse what we cover, see how new entries get added, and understand how the OSV layer extends it.

Transparent by design. Every entry below is auditable in packages/arcis-rust/crates/arcis-data/data/threat-db.json with a source advisory link. No black-box detections, no proprietary feed.

Coverage summary

DimensionCount
Total entries100
npm ecosystem59
PyPI ecosystem41
Critical severity47
High severity46
Medium severity7
Last shipped refresh2026-05-07

Attack classes covered

Notable advisories

A representative slice. Run arcis sca --list-threats to dump the full list with severities, malicious versions, and source URLs.

PackageEcosystemClassReference
axiosnpmTrojanized plain-crypto-js dep ships a RAT via postinstall2026 advisory
litellmPyPICredential harvester + persistent .pth backdoor that survives pip uninstall2026 advisory
colouramaPyPITyposquat of colorama, exfiltrates wallet keysCVE-2018-1000877
event-streamnpmTrojanized flatmap-stream dep targeting bitcoin walletsCVE-2018-1000620
flatmap-streamnpmThe payload half of the event-stream incident, indexed separately so re-imports are caughtCVE-2018-1000620
ua-parser-jsnpmMaintainer credentials stolen; trojanized versions deployed cryptominersCVE-2021-3962
rcnpmSame attack chain as ua-parser-jsCVE-2021-43138
peacenotwarnpmProtestware sabotage propagating through node-ipcCVE-2022-23812
@solana/web3.jsnpmWallet-connect hijack via maintainer compromise2024 advisory
fakernpmMaintainer self-sabotage shipped empty / protestware versionsCVE-2022-42003
torch / torchtritonPyPIPyPI typosquat shipping a credential exfiltrator that survived the index for hoursCVE-2024-31580 / CVE-2022-45907
pytorch-lightningPyPITrojanized release with credential exfiltration2024 advisory
crossenvnpmTyposquat of cross-env, postinstall exfiltrates env vars2017 advisory

Entry schema

Every entry in threat-db.json follows this shape:

{
  "ecosystem": "npm",           // "npm" | "pypi"
  "name": "axios",
  "malicious_versions": ["1.14.1", "0.30.4"],
  "vulnerable_ranges": [],
  "attack_vector": "Trojanized dependency plain-crypto-js@4.2.1 deploys a remote access trojan...",
  "severity": "critical",     // "critical" | "high" | "medium"
  "cve": "no-cve-assigned",
  "disclosure_date": "2026-03-12",
  "source": "npm Security Advisory",
  "references": ["https://github.com/axios/axios/security/advisories/..."],
  "trojanized_deps": ["plain-crypto-js@4.2.1"],
  "persistence_artifacts": [],          // e.g. .pth files for Python
  "remediation": "pin axios to 1.13.x or 0.30.3; audit lockfile for plain-crypto-js"
}

How detection works

For each lockfile or manifest arcis sca walks the dependency tree (including transitive deps) and looks up every (ecosystem, name, version) tuple in the embedded DB. A match against either malicious_versions or a vulnerable_ranges entry triggers a finding with severity, attack class, remediation, and the full path-to-root through the dep tree.

For Python, --system also walks site-packages for .pth files matching known persistence artifacts (an entry in persistence_artifacts).

OSV layer

The embedded DB is curated and stays small (advisories worth a hand-written entry). For breadth, pass --osv and the scanner also queries osv.dev for each package found in your lockfiles and merges its findings on top of the embedded results.

arcis sca .                # embedded DB only (offline)
arcis sca . --osv          # + live OSV.dev advisories
arcis sca . --no-cache     # bypass the 24h OSV cache

Responses are cached at ~/.arcis/osv-cache.json with a 24h TTL. --osv is the only flag in the CLI that touches the network; everything else runs fully offline.

Contributing a new entry

  1. Open the source advisory (GHSA, PyPI advisory, OSV record, or a credible blog post that names versions).
  2. Add an entry to threat-db.json following the schema above. Severity, malicious versions, attack vector, and at least one reference URL are required.
  3. Run cargo test --package arcis-engine to validate the schema.
  4. Open a PR to nwl. CI verifies the JSON shape and runs the SCA test suite against the fixtures.

Curation policy. The embedded DB is intentionally small. Each entry has to be worth a hand-written advisory record: versions, attack class, source. Pure ReDoS-only or low-severity advisories get pushed to the OSV layer instead.

False positives and dropping a finding

If arcis sca flags a package you have already addressed (pinned to a safe version inside a malicious range, vendored the patched source, etc.) you can suppress it via a baseline file:

arcis sca . --baseline ./.arcis-sca-baseline.json

The baseline schema mirrors the audit baseline. Findings already in the baseline are reported as baseline and do not affect the exit code.