Welcome to the most comprehensive dataset on software supply-chain attacks in the world!
This repository only includes cases where an open-source project or commercial product distributed malware knowingly or unknowingly. We also include edge cases, such as when an open-source project has shut down and an attacker later takes over its online presence.
- Malware uploaded to a random website with no relationship to the project or product
- Random USB keys found on a sidewalk
- Projects only known in the context of delivering malware (for example, a project created solely to demonstrate an attack)
- Typosquatting attacks
- Campaigns describe one bounded operation across multiple attacks. OSS campaigns live under
oss/campaigns/; attacks link to them withcampaigns:. Actor groups such as TeamPCP belong inactor, not as broad campaign records, and each attack should link to at most one campaign. - Attacks describe one compromised trust boundary: a vendor, maintainer account, project organization, provider, registry account, release pipeline, or official distribution surface
idis a stable machine identifier. Keep it lowercase, URL-safe, and durable; do not rewrite it just to improve display texttarget.nameis the canonical attacked entity: the project, vendor, product, service, maintainer account, registry, or distribution surface whose trust boundary failedartifact.nameandartifact.packageidentify concrete affected things: packages, plugins, actions, images, releases, installers, archives, update channels, or source trees. Use package names and official product names here, not prosetitleis the human headline. It should make sense as a timeline label and detail-page heading. Include the target and the compromise path, payload, or downstream impact. Keep it short, usually 5-9 words, with a hard cap of 90 characters and no sentence-ending punctuation. Do not put a full synopsis, date range, month, year, or every affected package in the title unless the date is needed to distinguish otherwise identical records.synopsisis the compact factual summary. Use 2 sentences normally, or 1 sentence when the event is simple, with a hard cap of 280 characters. State what happened and why it mattered; do not merely repeat the title. Prefer scope, delivery path, payload, or impact over colorstoryis optional narrative detail for notable records. Use 3-4 paragraphs for attack method, delivery method, code or artifact changes, impact, discovery, and response details that would make the synopsis too dense. Write stories in a concise, technical, straightforward voice — think Wietse Venema or Rob Pike: accurate, declarative, not bombastic. Short sentences, concrete nouns, active verbs, no hype, no metaphor, no invented drama. Prefer periods to em-dashes. No punchlines, no volume metaphors, no characterization of evidence. State the facts and trust the reader to notice what mattersmethod.phaseis the lifecycle point where the malicious change entered the trusted path, such assource,dependency,ci_cd, ordistribution. It is not the name or type of the service. A package registry, vendor download site, update server, CDN, GitHub Release, FTP server, app store, or physical media can all bephase: distributiontarget.nameandartifact.nameare proper names: the project, vendor, product, package, plugin, installer, source archive, update channel, or service that was attacked or served to userstarget.kindandartifact.kindare type labels: what sort of thing the name refers to, such aslibrary,application,firmware,package_registry,distribution_site,update_service,source_archive,binary_archive,installer, orci_cd_actionartifact.ecosystemnames the package or distribution ecosystem when there is one, such asnpm,pypi,rubygems,wordpress.org,docker,github_actions, orwindows installer- Artifacts live under
artifacts:inside an attack. Use them for concrete packages, plugins, actions, images, releases, installers, source archives, artifact-specific dates, hashes, and artifact-specific impact counts - Targets and artifacts can include
website:andrepo:for official project, package, vendor, or product locations locations:records durable artifact locations only. Userole: distributionfor the trusted path that served the affected artifact, androle: mirrorfor archived copies, sample pages, VirusTotal entries, or other places a copy can be found later. Do not store reachability or freshness status in canonical datahashes:records hashes of the artifact named by that artifact record. If a source reports a hash for an embedded file, payload, patch, or component rather than the whole artifact, store it underindicators:with a clear kind such asfile_sha256and include the file name in the valueevidence:records local files checked into this repository that support an artifact, such as clean and compromised extracts, diffs, patches, decoded payloads, or historical advisory text. Use{kind, path, role}with a relative path from the attack directory. Do not use URLs here; uselocations:orreferences:for URLsreferences:records source pages as{url, title}. Include page titles when practical so generated pages have useful link text and old sources remain findableversionsmust contain only affected version identifiers, such as1.2.3,1.2.3-alpha, orv1.2.3, or explicit spaced ranges such as1.2.0 - 1.2.4. Usefixed_versionsfor known clean or remediated releases. Do not put package names, labels likebad:orsafe:, constraints, or narrative context in either field- Data is compiled into
oss_summary.csvandproprietary_summary.csvas one row per attack.oss_artifacts.csvandproprietary_artifacts.csvare one row per affected artifact - CSV and site artifacts can be refreshed using
make - OSS data is also periodically published into a Google Sheet for easy access: https://docs.google.com/spreadsheets/d/1C3SipbHjaOKVjxjKb85ICq68mgttI_un7p6XZ3xYNUc/edit?gid=1052022989#gid=1052022989
Example story format:
story: |
First paragraph: state how the attacker reached the trusted distribution path and what users received.
Second paragraph: state how the malicious artifact was delivered and what code, build logic, package metadata, installer, update, or release asset changed.
Third paragraph: state what the payload did, what systems or people were exposed, and why the impact mattered.
Fourth paragraph, when useful: state discovery, remediation, attribution limits, or how this record relates to a broader campaign.Example text field split:
id: transmission-2016-03
target:
name: transmission
title: Transmission macOS installer distributed KeRanger ransomware
synopsis: >-
Attackers replaced the official Transmission 2.90 macOS disk image with a signed
malicious build. Users following the trusted download path received KeRanger ransomware.Example distribution modeling:
method:
phase: distribution
target:
name: npm
kind: package_registry
artifacts:
- package: event-stream
ecosystem: npm
kind: source_archive
locations:
- uri: https://registry.npmjs.org/event-stream/-/event-stream-3.3.6.tgz
role: distributionFor graphs and an easy-to-read view of the data, see the compendium: https://isotope13.ai/compendium/
To the best of my knowledge, the OSS data is complete. If you know of any cases where an open-source project distributed malware, please open an issue. Proprietary data is limited as many commercial attacks go unreported.
This project is a work in progress. PR's welcome!