PolinRider loader uses Ethereum transactions as C2 resolver in 35 GitHub repositories, including a pull request to oxc
SafeDep reports that the PolinRider loader family now resolves its C2 servers from Ethereum mainnet. The loader reads small transactions from operator wallets and decodes the recipient address as an IP:port. SafeDep confirmed 35 GitHub repositories carrying the loader at HEAD on 2026-09-30 (7,578 stars and 2,884 forks combined). The investigation began with a malicious pull request to oxc-project/oxc that injected the loader into 20 build and test scripts. The maintainers did not merge it, and the payload became visible only because an autofix bot reformatted it. The loader runs on build or start and installs a Node.js and Python infostealer targeting environment secrets, browser passwords, cookies and crypto wallet data.
Technical Details
- Delivery: the oxc PR commit
41ab07a8used a spoofed maintainer author name and a back-dated author date. The payload sat after 2,000 spaces on the last line of each file. TypeScript files carry it as Base64 insideeval(atob(...)). The same technique appears in infected templates and starter kits, including four Creative Tim dashboards (1,773 forks). - C2 resolution: the loader queries public RPC endpoints (
eth.drpc.org,eth-mainnet.public.blastapi.io,ethereum-rpc.publicnode.com) for a transaction from wallet0x33ff3eda…9891, searching back through 256-block windows. Thetoaddress encodes two IP:port pairs (e.g.198.105.127[.]210:443and45.137.198[.]133:80). That wallet sent 2,895 transactions from 2026-06-23, roughly one every 51 minutes. - Second wallet:
0xa322E5f3…Ef1ahas sent 491 transactions since 2026-07-25 and uses six C2 servers on AS149440 Evoxt. It has a different loader, using the Blockscout API and ahelloipbot!!suffix. It appears in 70 OpenSSF malicious-packages records (68 npm, 2 PyPI), mostly look-alike Tailwind CSS and PostCSS plugins. One infection also writes a Tron-based loader (TCqf6ZkaQD84vYsC2cuu1jRwB6JveTaRrF) alongside the Ethereum one. - Execution: the loader silences console output and fetches
/bootwith anX: <32-hex>:<marker>header. It runs the response throughevaland a detachednode -eprocess, and on WSL2 also startsnode.exeon the Windows host. - Stealer: the stage installs
axiosandsocket.io-clientinto~/.node_modulesand postsprocess.envto/snv. It skips CI and sandbox hostnames and installs Python with a pip bootstrap. It then runs an 83 KB Python stealer that collects Chromium and Firefox passwords and cookies,~/.git-credentialsand data from 153 wallet and password-manager extensions. Data is uploaded as a ZIP to/u/f, with the Telegram Bot API as fallback. - Overlap: C2 servers
198.105.127[.]210and166.88.134[.]62also appear in earlier SafeDep investigations (astro.config.mjs and @joyfill).
Remediation
- Treat any machine that built, ran or tested a cloned or forked affected project as compromised. Rotate all shell-environment secrets, browser-saved passwords and session cookies, and move funds out of wallet extensions.
- Hunt for
~/.node_modules,~/.local/bin/py,/tmp/.pip,tmp7A863DD1.tmp, and detachednode -eorpython -cprocesses. - Repository owners should remove the payload from all JS/TS files and clean the developer machines that pushed to the repository, otherwise reinfection follows.
- Detect Node processes that query public Ethereum RPC or Blockscout endpoints and then connect to a raw IP on port 80 or 443, and grep for lines over 1,000 characters,
global.o=',global.i="AandcreateRequire(import.meta.url). Also review commits where author and committer differ, and font files that are actually JavaScript.
Linha do tempo
-
PolinRider loader uses Ethereum transactions as C2 resolver in 35 GitHub repositories, including a pull request to oxc
ler a análise desta fonte ocultar
SafeDep reports that the PolinRider loader family now resolves its C2 servers from Ethereum mainnet. The loader reads small transactions from operator wallets and decodes the recipient address as an IP:port. SafeDep confirmed 35 GitHub repositories carrying the loader at HEAD on 2026-09-30 (7,578 stars and 2,884 forks combined). The investigation began with a malicious pull request to oxc-project/oxc that injected the loader into 20 build and test scripts. The maintainers did not merge it, and the payload became visible only because an autofix bot reformatted it. The loader runs on build or start and installs a Node.js and Python infostealer targeting environment secrets, browser passwords, cookies and crypto wallet data.
Technical Details
- Delivery: the oxc PR commit
41ab07a8used a spoofed maintainer author name and a back-dated author date. The payload sat after 2,000 spaces on the last line of each file. TypeScript files carry it as Base64 insideeval(atob(...)). The same technique appears in infected templates and starter kits, including four Creative Tim dashboards (1,773 forks). - C2 resolution: the loader queries public RPC endpoints (
eth.drpc.org,eth-mainnet.public.blastapi.io,ethereum-rpc.publicnode.com) for a transaction from wallet0x33ff3eda…9891, searching back through 256-block windows. Thetoaddress encodes two IP:port pairs (e.g.198.105.127[.]210:443and45.137.198[.]133:80). That wallet sent 2,895 transactions from 2026-06-23, roughly one every 51 minutes. - Second wallet:
0xa322E5f3…Ef1ahas sent 491 transactions since 2026-07-25 and uses six C2 servers on AS149440 Evoxt. It has a different loader, using the Blockscout API and ahelloipbot!!suffix. It appears in 70 OpenSSF malicious-packages records (68 npm, 2 PyPI), mostly look-alike Tailwind CSS and PostCSS plugins. One infection also writes a Tron-based loader (TCqf6ZkaQD84vYsC2cuu1jRwB6JveTaRrF) alongside the Ethereum one. - Execution: the loader silences console output and fetches
/bootwith anX: <32-hex>:<marker>header. It runs the response throughevaland a detachednode -eprocess, and on WSL2 also startsnode.exeon the Windows host. - Stealer: the stage installs
axiosandsocket.io-clientinto~/.node_modulesand postsprocess.envto/snv. It skips CI and sandbox hostnames and installs Python with a pip bootstrap. It then runs an 83 KB Python stealer that collects Chromium and Firefox passwords and cookies,~/.git-credentialsand data from 153 wallet and password-manager extensions. Data is uploaded as a ZIP to/u/f, with the Telegram Bot API as fallback. - Overlap: C2 servers
198.105.127[.]210and166.88.134[.]62also appear in earlier SafeDep investigations (astro.config.mjs and @joyfill).
Remediation
- Treat any machine that built, ran or tested a cloned or forked affected project as compromised. Rotate all shell-environment secrets, browser-saved passwords and session cookies, and move funds out of wallet extensions.
- Hunt for
~/.node_modules,~/.local/bin/py,/tmp/.pip,tmp7A863DD1.tmp, and detachednode -eorpython -cprocesses. - Repository owners should remove the payload from all JS/TS files and clean the developer machines that pushed to the repository, otherwise reinfection follows.
- Detect Node processes that query public Ethereum RPC or Blockscout endpoints and then connect to a raw IP on port 80 or 443, and grep for lines over 1,000 characters,
global.o=',global.i="AandcreateRequire(import.meta.url). Also review commits where author and committer differ, and font files that are actually JavaScript.
- Delivery: the oxc PR commit