Poisoned Pipeline / Incidents / AS45
PolinRider (DPRK) Git-to-registry jump
Git / GitHubGo modulesPackagist / ComposernpmVS Code / IDE
OpenSourceMalware named PolinRider: unlike Contagious Interview’s fake
interviews, this cluster takes over legitimate GitHub accounts and
injects obfuscated JS into repos the maintainer already owns (config
files, fake .woff2 fonts, .vscode/tasks.json), then uses blockchain
dead-drops for the Lazarus stealer. First report 675 repos; later 1,951
across 1,047 owners, then 4,367. Because Go modules and Packagist
resolve from git tags — no separate publish token — poisoning GitHub
was enough to land artifacts on proxy.golang.org and Packagist. Socket
observed ~200 malicious release artifacts / 111 packages (80+ Go, 10
Packagist, npm, Chrome extensions). AS35 is one Packagist instance.
On 16 October OpenSourceMalware found one repository in a
GhostAction cluster that also carries this loader.
daxitzadafiya/bagisto-dhs has poisoned Tailwind configs, including
tailwind.config.js. A force-push on 25 June 2026 rewrote a commit
whose history date still says 16 April 2025, and added
temp_auto_push.bat. The block reads a pointer from TRON or Aptos
and fetches encrypted code from BNB Smart Chain. Addresses match
indicators already tracked for this campaign. The 15 October
tasks.json and fake font on that same repo report to GhostAction's
server and share no indicator with this loader. That stage is
AS304.
Mapped techniques
- T0113 Compromised user account
- T0111 Malicious code contribution to an open-source repository
- T0154 Malicious IDE extension
- T0195 Spoofed Commits
- T0197 Use code from untrusted source
- T0159 Malicious artifact execution
supply-chain Maintainer GitHub accounts
Legitimate GitHub maintainer accounts taken over.
Obfuscated loader appended to config / fake fonts / VS Code tasks.
.vscode/tasks.json used as the silent trigger.
Windows script rewrote git history to hide the implant.
post-supply-chain Go / Packagist / npm consumers
go get and Packagist fetched the poisoned git tag with no extra publish step.
Installing the Go module, Packagist package, or npm library ran the loader.
Sources
- https://opensourcemalware.com/blog/polinrider-jumps-the-fence
- https://opensourcemalware.com/blog/polinrider-caused-dozens-of-npm-and-go-compromises
- https://opensourcemalware.com/blog/polinrider-npm-case-study-dprk-attack
- https://opensourcemalware.com/blog/chainveil-and-vitevenom-dprk-polinrider-campaign
- https://opensourcemalware.com/blog/polinrider-blast-radius-grows
- https://opensourcemalware.com/blog/polinrider-dprk-compromised-hundreds-of-github-repos
- https://opensourcemalware.com/blog/polinrider-rides-again-north-korean-attack-expands-across-github
- https://safedep.io/astro-config-blockchain-c2-supply-chain
- https://safedep.io/polinrider-ethereum-c2-github-repositories
- https://socket.dev/blog/polinrider-github-packagist
- https://checkmarx.com/zero-post/chainveil-a-malicious-npm-supply-chain-attack-by-successkey/
- https://checkmarx.com/zero-post/sequel-to-chainveil-npm-malware-targets-vite-ecosystem/
- https://opensourcemalware.com/blog/ghostaction-copycats-polinrider-by-hiding-a-stealer-in-a-fake-font-file