Poisoned Pipeline / Techniques / T0109
Publish malicious artifact
Public registries are widely used by developers and organizations to download and distribute software packages and container images, making them an attractive target for attackers.
In this type of attack, the attacker creates a package or container image that contains malicious code or files, such as a backdoor or other malware.
The attacker then uploads the package or image to PyPI, DockerHub or other registry, posing as a legitimate user or creating a fake account.
Once the package or image is uploaded, it becomes available for download by other users who may unsuspectingly use it in their projects.
The supply chain attack can have far-reaching consequences as it can affect all systems that rely on the malicious package or image.
For example, a Python package that is downloaded from PyPI may be used by multiple applications and libraries, potentially compromising all systems that use it.
Similarly, a container image with a malicious payload may be used to deploy an application across multiple environments, leading to a widespread compromise.
Where this idea came from
Identified in published CI/CD or supply-chain security research cited below.
- https://sysdig.com/blog/analysis-of-supply-chain-attacks-through-public-docker-images/
- https://blog.sonatype.com/malware-monthly-january-2023
- https://owasp.org/www-project-top-10-ci-cd-security-risks/CICD-SEC-09-Improper-Artifact-Integrity-Validation
Mitigations
- M1090 Implement code and image signing
- M1503 Implement SCA analysis
- M1732 Implement code scanning for security risks
- M1932 Contract a supplier incident-notification clause with a reporting template and SLA
Detections
- D1090 Implement package or image integrity verification
- D1500 Configure monitoring of used artifacts and open-source libraries
- D1510 Implement Intrusion Detection System and anti-malware
Observed in incidents (168)
- common-tg-service 502 versions Telegram hijack
- npm event-stream / flatmap-stream
- GitHub repo jacking (dependency URL takeover)
- TrapDoor crypto stealer across 34 packages
- WEL1DROPPER / NUL1DROPPER npm slopsquatting
- rc npm releases carried malware
- Fake Braintree NuGet card skimmer
- react-native-country-select npm account takeover
- react-native-international-phone-number npm account takeover
- SLF4J Java logger impersonation on npm
- colors.js npm maintainer sabotage broke apps
- Firefox Add-ons crypto-wallet theft
- Packagist CMS themes delivering iOS spyware
- pgserve npm CanisterSprawl credential stealer
- PyPI typosquats targeting Bittensor developers
- WooCommerce carding PyPI package
- DarkGPT / Codo-AI / bitcoin-auto-trading VS Code extensions
- ssh-decorate PyPI releases stole SSH credentials
- tensorlake 0.5.144 steals tokens, then wipes the home directory if they are revoked
- TXTBOOK dependency confusion against Tinkoff / T-Bank
- npm bin-entry harvesting against Google CLIs
- ForceMemo force-pushed Python malware
- Malicious Go modules (obfuscated payloads, SSH lure, proxy cache)
- PolinRider poisons visanduma/nova-two-factor Packagist via Git
- actions-cool GitHub Action tags still serve Mini Shai-Hulud after re-enablement
- When Dungeons Arise shipped Fracturiser malware
- Express cookie-parser impersonation on npm
- Operation SignSight trojanized VGCA installers on a government CA's download site
- AUR acroread PKGBUILD ran remote shell scripts
- 175 npm packages hosting phishing infrastructure
- SleeperGem (git_credential_manager, Dendreo, fastlane plugin)
- GoldenSpy backdoor shipped inside bank-mandated tax software
- @subql/common 5.8.3 published after a CI artifact swap
- Intruder signed tampered OpenSSH RPMs with Red Hat key
- xrpl.js npm package stole wallet seeds
- Malicious Firefox extension hijacks Google accounts
- llm-oracle malicious npm payload
- Non-npm registry one-offs (NuGet, Maven xz, Laravel Packagist, evm-units)
- Orphaned AUR packages adopted and rewritten to steal credentials
- Five Rust crates as time utilities steal .env
- XPACK npm install-time crypto extortion (HTTP 402)
- Moika npm dependency-confusion (Sberbank / EMCD impersonation)
- Twitch browser extension leaks 30k OAuth tokens
- Team PCP CI/CD secrets campaign
- Polymarket fake-bot and wallet-key npm campaign
- sl4x0 dependency confusion (92 packages, Fortune 500)
- gluestack-ui packages shipped malware
- Four NuGet packages JIT-hook ASP.NET credential theft
- OpenGov form builder carried CanisterWorm
- elementary-data PyPI and GHCR releases forged
- tw-pkgprobe-7731 npm campaign targeted Twilio developers
- wshu.net 15-package multi-stage infostealer
- Toptal GitHub org hijack 10 malicious packages
- Hijacked AI coding assistant spreads Shai-Hulud
- 36 malicious Strapi plugin packages (Redis RCE / DB theft)
- guardrails-ai PyPI package carried Shai-Hulud
- 108 Chrome extensions shared-C2 session theft
- TeamPCP DUSTMAKER AI workspace poisoning
- Registry abuse, starjacking, OAST, and LLM-developer targeting
- IronWorm backdoored Arweave ecosystem npm packages
- Intercom Node SDK hit by Mini Shai-Hulud
- GlassWorm across GitHub, npm, Open VSX, VS Code, Python
- Gentoo GitHub hack modified ebuilds
- @copilot-mcp/apex macOS infostealer republish
- JuiceStealer PyPI phishing and typosquats
- StegaBin 26 packages Pastebin steganography stealer
- J7Tracker / VREO / Orbit Tracker steal Axiom and Padre session and wallet data
- 141 npm packages as adware hosting (terminal3airport)
- Malicious Maven package exfiltrates OAuth credentials
- Apex Accelerator published a malicious npm coding agent and a fake audit MCP
- PyTorch-nightly torchtriton dependency confusion
- hermes-px PyPI steals AI conversations
- Schedaero dependency-confusion packages
- indexed-btree runtime npm loader
- ctx PyPI account stole environment variables
- MYRA Linux RAT via apintergrationpost
- SANDWORM_MODE (yarsg / format-defaults)
- electron-native-notify planted in Agama / Komodo wallet
- DPRK Contagious Interview (BeaverTail / npm + git)
- Malicious Go crypto module Rekoobe backdoor
- Keyv / Cacheable ChainDrop worm
- Rspack supply chain attack
- PyPI typosquats (passlib, fabric, cookie lib, AnyDesk, Deezer, Instagram)
- react-refresh-update Meta library impersonation
- mathmain / mathsbase encrypted npm RAT (equation trigger)
- @7nohe/openapi-react-query-codegen poisoned publish workflow
- Operation StealthyTrident compromised Able Desktop's update server
- faker.js npm maintainer sabotage broke apps
- Xinference PyPI release stole credentials
- rest-client gem backdoor stole credentials
- Baileys npm forks farming WhatsApp Channel follows
- Hades .pth and AI-assistant config persistence
- Malicious Go module plus 222 GitHub lure repos
- GemStuffer RubyGems campaign abused RubyDoc.info builders
- marchos1as typosquatted yay on the AUR and ran a root install scriptlet
- 60 malicious RubyGems targeted credential theft
- Telegram, Discord, and WhatsApp-developer malware packages
- Seven fake NebulaAI npm packages drop a Windows KNTRAT at install
- StubMaker RubyGems (and npm) Windows infostealer
- Eleven NuGet packages posing as game cheats
- Deep-Live-Cam malicious git dependency
- eslint-scope and eslint-config-eslint malicious publishes
- testmetest npm names ship a Miasma-family worm that wipes the home directory if a stolen GitHub token is revoked
- ulid-xyz RAT via ioredis-xyz transitive chain
- turbo-axios / faster-axios Epsilon Stealer typosquats
- loltestpad campaign (ixpresso-core / exiouss)
- forge-jsx / forge-jsxy Autodesk-themed npm RAT
- npm/PyPI typosquats of secure payment apps
- WeaselBiscuit npm import-time stealer
- axios npm remote-access trojan
- Elf-Stats Christmas npm spam worm
- Shai-Hulud first wave (@ctrl/tinycolor)
- vant npm packages shipped XMRig
- Forty-two RubyGems from reqthrottle_3474 run a reverse shell or a crypto stealer at install
- IndonesianFoods npm worm (86k+ packages)
- Dependency confusion (Alex Birsan)
- Octopus Scanner infected NetBeans builds
- MALFEX npm campaign, including a native imgdecode loader with no install script
- Operation Navy Ghost fake pyrogram packages on PyPI
- Typosquatted AI-tool npm packages under a real-identity publisher
- npm is 3.3.1 / 5.0.0 via phished old maintainer
- num2words maintainer phishing shipped malware
- crates.io arrayref / proc-macro1 build-time dropper
- Ultralytics PyPI compromise
- Miasma botnet loader in @asyncapi npm packages
- Dependency confusion using Burp Collaborator callbacks
- Chrome and Edge crypto-wallet drainer extensions
- npm RAT cluster targeting Alibaba developers
- node-env-resolve full RAT
- hautelook/phpass hijacked through GitHub organization
- GHAPPIER loader via @dforge-core/dforge-mcp trusted publishing
- nodemon-sudo backdoor via tslint-conf (no install script)
- bootstrap-sass gem enabled remote execution
- js-logger-pack probe to infostealer to dropper
- durabletask PyPI multi-cloud credential stealer
- Named npm malware families (Skeleton Squad, Skuld, Quasar, FezBox, Koishi)
- Graphalgo spreads to Terraform providers and Go modules
- Graphalgo spreads to Terraform providers and Go modules
- strong_password Ruby gem backdoor stole secrets
- LiteLLM 1.107.0 built from a lookalike repository shipped a startup-hook stealer and hourly loader
- npm-global-util preinstall credential theft
- sckit worm in MemTensor npm plugin and PyPI MemoryOS
- sckit worm in MemTensor npm plugin and PyPI MemoryOS
- TanStack Mini Shai-Hulud (CVE-2026-45321)
- Black Basta dependency-confusion ambitions in OSS
- npm chalk / debug maintainer phishing (Qix)
- nyc-config typosquat of @istanbuljs/load-nyc-config
- ua-parser-js npm account takeover
- dom-utils-lite / centralogger SSH backdoor via Supabase
- @withgoogle/stitch-sdk scope squat
- Spearphishing campaign abuses npm registry
- npm packages hijack Cursor on macOS
- DirtyBlanket fake Express/React packages spread a self-propagating Linux worm
- AUR adoption disabled after a second malicious commit wave
- Malicious ClawHub / OpenClaw skills
- 131 WhatsApp spamware Chrome extensions
- Claude eval agent published a malicious package to live PyPI
- 737 Chrome VPN extensions brand impersonation
- coa npm hijack shipped malware
- Destructive npm packages with remote wipe
- Unclaimed packages in official llms.txt files
- victim59 dependency confusion (Genoma UI / Needl)
- eslint-config-prettier phishing (npnjs.com) and node-gyp.dll
- TensorFlow.js typosquat targeting ML developers
- ProcWire Windows binary split across five npm packages
- Stardrop npm campaign (VC, luxury, AI brands)
- Socket Chrome-extension theft cluster
- Sha1-Hulud: The Second Coming