Supply-chain security · scanned in public
What each
repository can prove
Every listing here is a public record of one scan of one commit — what it could prove, and what it could not.
Already listed.
Open the listing →Not listed yet. Ask for a scan — a person reviews every result before it appears.
— and what only its maintainer could.
An unperformed check is never a verdict. It is shown, and never counted.
A check that could not run is never a pass.
Every listing says what the scan saw, what it could not see, and who ran it. The second list is the one nobody usually publishes.
This lists defences the scan found, not weaknesses it found. A missing defence is not a break-in, and a full set of checks is not safety: nine groups and 54 checks do not cover everything. — the rule every list of defences on this site is published under
Nine ways in, and how many checks answer each.
The groups are drawn from the public catalogues of what has actually gone wrong. Every bar is the number of checks mapped to that group, split by where an answer could come from. A tall bar is not safety. It is how many questions we know to ask, and where the hatched part is most of a bar, an outside scan leaves most of that group’s questions open.
answerable from outside only on a maintainer’s own machine
One record covers the whole lifecycle.
Code moves from a commit to a published package. The 54 checks sit along that road in 6 groups, and one scan reads all 6 at once — including the ones it could not answer. (The tool's own stage model is T1–T7; this site groups the checks into 6 phases.)
- 1Commit integrity
- 2Dependencies
- 3Build receipts
- 4Code & build hardening
- 5Ongoing posture
- 6Distribution & publishing
Three ways a record gets made, and they do not carry equal weight.
A record made in the project's own build is signed there, and the repository, the workflow and the branch are burned into that signature by an issuer neither side controls. A scan from outside proves nothing about who ran it — and anybody can run it again. A maintainer's own machine is the only place the last group of checks can be looked at, and the only lane where the party being measured is the party asserting the result.
Nine ways in
Each group below is a thing attackers have actually done. Open one to see which checks defend it, and one time it happened.
Every incident below links to a primary source — a CVE record, a government alert, or the affected project’s own write-up. Where this site has not opened that document, the line is marked reported.
-
Code nobody authorised or reviewed lands in the source.
Checks that defend it
commit-signing,agent-signing,signing-model,branch-protection,gittuf,ai-trailers,pr-template,ai-receipts,binary-artifacts,scorecardWhen it happened xz / liblzma backdoor 2024-03-29
A contributor spent about two years earning maintainer trust, then hid a prebuilt object file inside a disguised test file so the build patched a backdoor into the shipped library.
-
The account or key that ships releases is used by someone who should not have it.
Checks that defend it
commit-signing,agent-signing,signing-model,branch-protection,gittuf,sigstore-signing,provenance-verify,release-immutability,octo-sts,trusted-publishing,maintainer-mfa,publish-tokens,publish-provenanceWhen it happened Shai-Hulud npm worm 2025-09
The worm authenticated to the registry as each developer it had compromised and republished their other packages as them.
-
You install something that is not what you meant — a typo, a name collision, or a name an AI made up.
Checks that defend it
ai-dep-gate,dependency-pinning,package-trust,socket-firewall,socket-firewall-ciWhen it happened PyTorch torchtriton 2022-12
Someone registered the same name on the public index, which takes precedence, and the resulting binary shipped the developer's SSH keys and git config off the machine.
-
The genuine package you depend on ships malware, or a known hole in it is left open.
Checks that defend it
actions-audit,ai-dep-gate,sbom,vuln-scan,dependency-pinning,scorecard,renovate,package-trust,bumblebee,grype,socket-firewall,socket-firewall-ci,sbom-attestation,model-signing,dependency-track,guac,openvex,orasWhen it happened Shai-Hulud npm worm 2025-09
The first self-replicating supply-chain worm reached more than 500 packages, spreading itself through each one it reached.
-
The build system becomes the attacker's build machine, or hands over its credentials.
Checks that defend it
secrets,actions-audit,webhooks,scorecard,renovate,socket-firewall-ci,slsa-provenance,github-attestations,provenance-verify,octo-sts,harden-runner,witness,workflow-audit-extended,wait-for-secrets,trusted-publishingWhen it happened tj-actions/changed-files 2025-03-15
A widely used build step's tags were repointed at malicious code that dumped every caller's secrets into logs anyone could read.
-
The laptop, the editor extension, or the coding agent is the way in.
Checks that defend it
agent-signing,signing-model,ai-trailers,ai-dep-gate,pr-template,ai-receipts,bumblebee,socket-firewallWhen it happened Malicious models on Hugging Face 2024-02-27
Around 100 models were built so that merely loading one opened a shell on the data scientist's own workstation.
-
A key in the repository, the logs, or the build environment becomes the front door.
Checks that defend it
secrets,webhooks,vuln-scan,octo-sts,harden-runner,workflow-audit-extended,wait-for-secrets,publish-tokensWhen it happened tj-actions/changed-files 2025-03-15
The record's own words: it let remote attackers discover secrets by reading build logs. No repository access needed.
-
The hole is yours, and you ship it to everyone downstream.
Checks that defend it
vuln-scan,sast,sighthound,codeql,fuzzingWhen it happened Log4Shell 2021-12-10
The same event as A4, seen from the other end: one project's own bug, everybody else's dependency crisis.
-
What people download cannot be tied back to what you built.
Checks that defend it
binary-artifacts,sbom,dependency-pinning,sigstore-signing,slsa-provenance,github-attestations,sbom-attestation,model-signing,provenance-verify,release-immutability,witness,guac,oras,publish-provenance,dist-manifestsWhen it happened Ultralytics 2024-12
The second malicious release carried no build receipts at all — which is how it was spotted.
01 — The record
What a listing holds
One scan, one commit, one date. Every check it ran, every check it could not, and the evidence behind both.
Who can see what
What anyone can read
Three groups of checks answer from things the project itself publishes. Every lane below starts here.
Committed files
26 checks the tree at one commit policy files never executed
Committed build files
6 checks the project's own build files read, never run
Live settings
4 checks branch rules repository settings read live
A scan from outside
Anyone can ask for a public repository to be read.
Nothing more
The shared row, read from outside. Nobody has to take the scanner's word for what it saw — the same files are there to read.
The project's own build
The same scan, run in the project's own CI.
A signature
Which build produced the record burned in by the issuer not asserted by the record
A maintainer's machine
The only place the last group can be looked at.
The maintainer's machine
16 checks signing keys local hooks what no outside scan reaches
The standard set, grouped by the phase it belongs to. Each chip is one check; open it to read the question it answers.
Commit integrity
13 checks belong to this phase.
committed build files
Are build steps pinned to an exact version, with narrow permissions?
Maintainer’s machine only
the maintainer's machine
Are commits on protected branches signed by a person?
the maintainer's machine
Do AI agents sign their commits with their own key?
the maintainer's machine
Is signing set up the same way in every environment?
the maintainer's machine
Do commits record which AI tool and model helped write them?
the maintainer's machine
Do AI commits that add dependencies get extra review?
the maintainer's machine
Is there a signed receipt linking a commit to its AI tool?
Dependencies
10 checks belong to this phase.
committed files
Are base images, lockfiles and downloads pinned to exact contents?
committed files
Are dependency updates automated and pinned to exact versions?
committed build files
Does the build install its dependencies behind that block?
Maintainer’s machine only
the maintainer's machine
Is a new dependency checked before anyone installs it?
the maintainer's machine
Are installed tools and extensions checked against known compromises?
the maintainer's machine
Is that parts list itself scanned for known vulnerabilities?
the maintainer's machine
Are malicious packages blocked at the moment of install?
Build receipts
10 checks belong to this phase.
committed files
Does the build use short-lived credentials instead of stored tokens?
committed build files
Is each build job watched for unexpected network traffic?
Maintainer’s machine only
the maintainer's machine
Are the build steps themselves recorded and checked against a policy?
Code & build hardening
7 checks belong to this phase.
committed files
Is the code checked for known-dangerous patterns before merging?
Maintainer’s machine only
the maintainer's machine
Is that check also run locally, before a commit lands?
Ongoing posture
8 checks belong to this phase.
committed files
Does the project publish a machine-readable security summary?
about the tool
Are the checks mapped to the frameworks an auditor asks about?
Maintainer’s machine only
the maintainer's machine
Are receipts and parts lists linked into one searchable graph?
the maintainer's machine
Does the project say which vulnerabilities actually apply to it?
the maintainer's machine
Are parts lists and receipts stored where anyone can fetch them?
Distribution & publishing
6 checks belong to this phase.
committed build files
Does publishing use short-lived identity instead of a stored token?
committed build files
Are publishing credentials kept out of the repository and short-lived?
live settings
Can anyone check that a published package came from this project?
committed files
Do the packaging files pin a checksum for what they install?
Maintainer’s machine only
the maintainer's machine
Is the account that can publish protected by strong two-factor?
Best scoring
Top rated
The listings that passed the most of what could be checked.
A "best scoring" list needs 12 listings and more than one grade among them. Otherwise it is just a tie, broken by a number this site says not to hold against anyone. There are 3 listings and 1 grade so far.
Browse every listing →Freshest evidence
Recently scanned
A scan is a snapshot of one commit. These are the newest.
Every listing here was scanned by the same scheduled run, minutes apart, so ordering them by date would be ordering noise. This fills in once projects run their own scans on their own schedules.
Browse every listing →Across every listing
Still unchecked
The checks that most often have no answer here — and why.
-
Does the project say which vulnerabilities actually apply to it?
openvex3 of 3 only a maintainer's own machine can answer this -
Does the project publish an OpenSSF Scorecard result?
scorecard3 of 3 no source could answer it -
Is signing set up the same way in every environment?
signing-model3 of 3 only a maintainer's own machine can answer this -
Are installed tools and extensions checked against known compromises?
bumblebee2 of 3 only a maintainer's own machine can answer this
3 of these 4 describe a developer's own machine. No scan from outside can see them — a maintainer answers them by running the scan themselves and signing the result. How that is checked →
02 — The loop
How a listing is made
Five steps, and one record in the middle of them — signed when the lane can sign it. A scan is a snapshot, so the loop runs again rather than editing what it said last time.
- Scan Clone, never run
- Record Answered, or left open
- Review A person reads it
- Answer Run it, then sign it
- Rescan One commit, one snapshot
Nobody has to wait for us. Run it in your own build, or on your own machine, and sign the result.
03 — Every check
All 54, as questions
Pick a phase. Every check in it is a card, and every card is a question you can answer yes or no.
Key what the project commits a live read of its settings only a maintainer's machine about the tool, never counted the phase these checks belong to
Inputs
Checks
Record
13 checks belong to this phase. Each card opens the question that check answers.
the maintainer's machine
Are commits on protected branches signed by a person?
the maintainer's machine
Do AI agents sign their commits with their own key?
the maintainer's machine
Is signing set up the same way in every environment?
committed build files
Are build steps pinned to an exact version, with narrow permissions?
the maintainer's machine
Do commits record which AI tool and model helped write them?
the maintainer's machine
Do AI commits that add dependencies get extra review?
the maintainer's machine
Is there a signed receipt linking a commit to its AI tool?
10 checks belong to this phase. Each card opens the question that check answers.
committed files
Are base images, lockfiles and downloads pinned to exact contents?
committed files
Are dependency updates automated and pinned to exact versions?
the maintainer's machine
Is a new dependency checked before anyone installs it?
the maintainer's machine
Are installed tools and extensions checked against known compromises?
the maintainer's machine
Is that parts list itself scanned for known vulnerabilities?
the maintainer's machine
Are malicious packages blocked at the moment of install?
committed build files
Does the build install its dependencies behind that block?
10 checks belong to this phase. Each card opens the question that check answers.
committed files
Does the build use short-lived credentials instead of stored tokens?
committed build files
Is each build job watched for unexpected network traffic?
the maintainer's machine
Are the build steps themselves recorded and checked against a policy?
7 checks belong to this phase. Each card opens the question that check answers.
committed files
Is the code checked for known-dangerous patterns before merging?
the maintainer's machine
Is that check also run locally, before a commit lands?
8 checks belong to this phase. Each card opens the question that check answers.
the maintainer's machine
Are receipts and parts lists linked into one searchable graph?
the maintainer's machine
Does the project say which vulnerabilities actually apply to it?
the maintainer's machine
Are parts lists and receipts stored where anyone can fetch them?
committed files
Does the project publish a machine-readable security summary?
about the tool
Are the checks mapped to the frameworks an auditor asks about?
6 checks belong to this phase. Each card opens the question that check answers.
committed build files
Does publishing use short-lived identity instead of a stored token?
the maintainer's machine
Is the account that can publish protected by strong two-factor?
committed build files
Are publishing credentials kept out of the repository and short-lived?
live settings
Can anyone check that a published package came from this project?
committed files
Do the packaging files pin a checksum for what they install?
04 — Scan your own
Three ways to start
They see different amounts, and the page always says which one produced a listing.
Run it in your build
The scan runs in your own CI and signs the record there. The signature proves which build made it.
Run it on your machine
Some checks describe a developer's laptop. You are the only one who can answer those. Sign the result and send it in.
Ask for a scan
Anyone can ask for any public repository to be read from outside. A person reviews the result before it appears.
What the checks are for
Nine ways supply chains get attacked
Every check defends against at least one of these — or says plainly that it defends against none, and only tells outsiders what a project does.