OpenSSF/OSV advisory MAL-2026-15904 confirms this npm version as malicious. dist/index.js exports a small tailwind plugin and then runs eval(atob("Z2x...")) on an embedded base64 blob at module load time. The decoded loader queries Ethereum RPC endpoints (1rpc.io/eth, drpc.org, publicnode, blastapi.io) and Blockscout for the most recent transaction sent by hardcoded address 0xa322E5f3D311D3080e6f0121063e9aDC2490Ef1a, decodes four bytes of that transaction's `to` field into an IPv4 address,...
Source
OpenSSF Malicious Packages via OSV
Summary
Malicious code in tailwind-scrollbar-styles (npm)
Details
dist/index.js exports a small tailwind plugin and then runs eval(atob("Z2x...")) on an embedded base64 blob at module load time. The decoded loader queries Ethereum RPC endpoints (1rpc.io/eth, drpc.org, publicnode, blastapi.io) and Blockscout for the most recent transaction sent by hardcoded address 0xa322E5f3D311D3080e6f0121063e9aDC2490Ef1a, decodes four bytes of that transaction's `to` field into an IPv4 address, HTTP-GETs http://<decoded-ip>:443/0x/cls and http://<decoded-ip>:443/0x/ls, XOR-decodes the response with literal keys, and executes it via eval() and via a detached `spawn("node", ["-e",...], {detached:true, stdio:"ignore", windowsHide:true}).unref()`. After first execution the loader reads its own file, locates the `eval(atob("Z2x...` region, and rewrites dist/index.js with the region removed, so the malicious line disappears from disk. The Ethereum-transaction-based resolver lets the operator rotate the C2 IP at any time by publishing a new transaction from the controlling address, and the self-erasing stub defeats post-incident inspection of the installed copy.
Decision reason
OpenSSF Malicious Packages via OSV confirms tailwind-scrollbar-styles@4.0.3 as malicious (MAL-2026-15904): Malicious code in tailwind-scrollbar-styles (npm)