PolinRider Linked to 20 Compromised npm and Go Packages

Summary
An analysis links 20 compromised npm and Go packages to PolinRider, detailing how malware used developer access to spread payloads, steal credentials, and backdate commits. Malicious Go module versions remain available from the proxy cache.
Key points
- Shared XOR keys, Tron wallets, and other indicators link all 20 packages to PolinRider; the analysis says the spread resulted from automated propagation after developer machines were infected, not deliberate account takeovers.
- The 16 affected Go modules carried an obfuscated JavaScript loader that retrieved encrypted payloads via blockchain RPC infrastructure and launched credential-stealing malware.
- A local script used developers’ existing Git credentials to add malicious commits and forge their timestamps; 11 of the 16 Go module timestamps were verified as forged.
- Go’s write-once proxy cache still serves the malicious module versions, even after eight associated accounts were removed or deleted.
- Two npm packages used a VS Code folder-open task to run a disguised JavaScript loader; the Joyfill beta packages instead executed appended malicious code when required.
- The reported payloads include InvisibleFerret, DEV#POPPER, and OmniStealer, targeting credentials, browser data, crypto wallets, and developer tools.
- The article recommends scanning repositories, reviewing Git history and VS Code tasks, securing Git access, and rotating npm tokens after suspected compromise.
Article Details
- Attack Vectors
- PolinRider compromises developer machines through fake interview or take-home assignment lures, poisoned repositories and forks, typosquatted packages, and malicious VS Code tasks.
- A .vscode/tasks.json task configured with runOptions.runOn: 'folderOpen' executes a JavaScript loader disguised as public/fonts/fa-solid-400.woff2 when a project folder opens.
- Malicious npm package code executes at require() time; compromised Go repositories receive malicious tagged commits, and compromised npm credentials can be used to publish poisoned package versions.
- The loader resolves encrypted payloads through blockchain RPC infrastructure, decrypts them with an embedded XOR key, and executes JavaScript with eval().
- The malware harvests browser credentials, crypto wallets, password-manager data, developer-tool configurations, OS keystores, SSH keys, and npm tokens; it uses stolen access to alter repositories and distribute malicious packages.
- A detached process retrieves a second-stage payload, while a backdoor provides interactive command execution, file transfer, and clipboard access.
- Defensive Notes
- Inspect developer machines and repositories for the .woff2 loader pattern, temp_auto_push.bat, config.bat, amended commits, and signs that ~/.npmrc was accessed.
- Treat polinrider-scanner.sh as a first-pass check only: the article says it checks the original March signature, not the rotated signature or all blockchain-resolved and npm-token indicators.
- For npm maintainers, rotate registry tokens if compromise is suspected. For Go maintainers, protect Git push access, use hardware-backed MFA on GitHub, and maintain clean SSH key hygiene.
- Disable automatic task execution in VS Code or require a prompt before opening projects that were not created by you.
Indicators of compromise
| Type | Indicator | Context |
|---|---|---|
| IPV4 | 166[.]88[.]134[.]62 | Joyfill incident primary C2 address, reported on ports 443 and 80. |
| IPV4 | 198[.]105[.]127[.]210 | C2 address identified as shared PolinRider infrastructure, reported on ports 443 and 80. |
| IPV4 | 23[.]27[.]13[.]43 | Joyfill stage-two payload delivery address; the article also identifies it as novel to that incident. |
| IPV4 | 23[.]27[.]202[.]27 | C2 address identified as shared PolinRider infrastructure, reported on ports 443 and 27017. |
| SHA256 | 13e9a3c41e038bf9d8fcb0831305819819e4f7f4452bc20a04b9bf2756ee22e8 | SHA-256 hash reported for the malicious fa-solid-400.woff2 JavaScript loader found in Go modules. |
| SHA256 | 53abf37710d6f2e35694fbe7cfaf1108127cbc001ce3e6bf994d0486cae5a0e8 | SHA-256 hash reported for the malicious fa-solid-400.woff2 JavaScript loader found in Go modules. |
| URL | hxxp[:]//23[.]27[.]13[.]43/$/boot | Defanged URL from which a detached process retrieves the Joyfill second-stage payload. |
MITRE ATT&CK
T1027 · Obfuscated Files or InformationThe article describes an obfuscated JavaScript loader and XOR-encrypted payloads.T1041 · Exfiltration Over C2 ChannelStolen data is exfiltrated through HTTP C2 and a Telegram bot.T1059.003 · Windows Command Shelltemp_auto_push.bat is a local batch script used to amend and push commits from compromised developer machines.T1059.006 · PythonThe Python infostealer component harvests credentials and other data after the malware installs a portable Python interpreter.T1059.007 · JavaScriptThe JavaScript loader decrypts and executes payloads with eval(); malicious Joyfill package code also runs at require() time.T1105 · Ingress Tool TransferThe malware retrieves second-stage payloads and downloads a portable Python interpreter and other bootstrap files.T1195.001 · Compromise Software Dependencies and Development ToolsMalicious code was introduced through compromised npm packages and Go modules, including poisoned package releases and tagged repository commits.T1552.001 · Credentials In FilesThe malware harvests the maintainer's ~/.npmrc file to obtain an npm registry token.T1555.003 · Credentials from Web BrowsersThe infostealer harvests browser credentials and browser data.
People
Threat Actors
Malware
DEV#POPPER RATwith a Sec-V: A9-0135-3 marker header. What lands is a 77KB build of InvisibleFerret (also tracked as DEV#POPPER RAT), with a Python infostealer component assessed as OmniStealer. Persistence comes from injecting intoInvisibleFerretprocesses. The follow-on payloads are the familiar Lazarus toolkit: DEV#POPPER, OmniStealer, and InvisibleFerret, covering credential theft, browser-data theft, crypto-wallet exfiltration, and keylogging.OmniStealerdetached background processes. The follow-on payloads are the familiar Lazarus toolkit: DEV#POPPER, OmniStealer, and InvisibleFerret, covering credential theft, browser-data theft, crypto-wallet exfiltration, and
Products
Cursorwith runOptions.runOn: 'folderOpen' executes the moment the project folder opens in VS Code, Cursor, Antigravity, or GitHub Desktop, bypassing npm v12's lifecycle-script protections entirely.GitHubThat PolinRider connection grabbed my attention, because that campaign isn’t really known for compromising legitimate packages. Typosquats? Yes. Poisoned GitHub repos? Absolutely. But not account takeovers.GitHub Desktop'folderOpen' executes the moment the project folder opens in VS Code, Cursor, Antigravity, or GitHub Desktop, bypassing npm v12's lifecycle-script protections entirely.GoPolinRider tactics. JFrog's report was amended on June 26, 2026 to reference Nextron's discovery of 16 Go modules carrying the same fa-solid-400.woff2 file, with matching SHA-256 hashes. JoyfillEarlier this week, I read a Socket blog about two compromised Joyfill beta releases. Joyfill is a legitimate digital form and PDF automation platform, and the poisoned versions contain malware that deploys anpmsame shape. We quickly found 18 packages to include in the data set. On June 24, 2026, JFrog reported two npm packages with a VS Code task that auto ran the payload disguised as a font fileVS Codegetting into thousands of developer machines any way it can: fake interviews, poisoned forks, malicious VS Code tasks, typosquatted packages. DPRK’s goal is to compromise developer machines and accounts to silently
Tools
polinrider-scanner.shPaul McCarty, OpenSourceMalware's head researcher, wrote a scanner for exactly this: polinrider-scanner.sh, in the PolinRider dossier repo. Run it against your own projects with ./polinrider-scanner.shtemp_auto_push.batmachine to poisoned package, is invisible because nothing about it looks like an intrusion. temp_auto_push.bat, the script behind the GitHub and Go compromises, runs locally on the infected machine using the