Skip to content
<UK/>

Supply chain security map

Dependency Nebula

Your app is a few thousand lines of your code inside a nebula of other people’s.

Real dependency snapshot · hypothetical attack

  • 40 packages you did not write
  • 14 accounts can publish them
  • 26 can be published by one account (A)
  • 6 hops from your code to the deepest package
  • 2 carry a provenance attestation
  • 0 declare an install script

Snapshot of “npm install [email protected] --package-lock-only --ignore-scripts”, resolved on 23 September 2026 from the public npm registry. Nothing is fetched while you use this page.

quorate@1.3.0

Arrow keys move between packages.
  • Your code
  • Publishable by the attacker

Blast radius

Choose an attack and publish it to see how far it reaches.

Selected package

Your app

Your code

This is your project. It declares one dependency, quorate ^1.3.0; the other 39 packages arrive with it.

Model boundaries

  • The tree and its metadata are real: “npm install [email protected] --package-lock-only --ignore-scripts”, resolved on 23 September 2026. The attack is hypothetical; no package or account here has been compromised.
  • Maintainer accounts other than mine are shown as letters, so this page names no one but me. The attack is hypothetical and says nothing about these maintainers’ security.
  • A malicious release is the next patch version. By default it is built on each package’s latest release, as Microsoft describes for ChainDrop; 7 of A’s 26 packages here sit on an older line whose ranges refuse it. “Version in your tree” is the worst case: an attacker who patches every line in use. Caret (^) and tilde (~) ranges accept a patch on their own line.
  • Every installed package is assumed to be loaded when the app runs, so import-time code always runs.
  • min-release-age delays a new version: npm installs only versions available for more than the set number of days, so on install day 3 a 3-day window still holds a release (install days are counted from the same time of day as the release). It only protects you if the bad release is caught and removed within the window; detection is not simulated.
  • A lockfile protects installs that honour it. npm update moves each package to the newest version its ranges allow, and without a lockfile npm install resolves every range afresh.

Read more

What I wrote about these incidents

Primary sources