npm install resolves ^1.14.0 to axios@1.14.1, which adds one new dependency: plain-crypto-js@4.2.1.npm runs the
postinstall hook: node setup.js. This 4,209-byte stager is the only malicious file in the package.sfrclak[.]com:8000setup.js decodes 18 hidden strings, checks os.platform(), and sends a POST body of packages.npm[.]org/product0, 1, or 2 to pick a platform.The server returns the second stage for that platform:
/Library/Caches/com.apple.act.mond
Windows.ps1 run by a copy of PowerShell renamed wt.exe
LinuxPython script at /tmp/ld.py
The macOS RAT fingerprints the host and beacons every 60 seconds, waiting for commands.
setup.js deletes itself and package.json, then renames package.md to package.json. The installed directory now looks like a clean copy of crypto-js.Figure 1. The axios compromise, March 30 to 31, 2026. npm stored the code that ran in steps 1, 2, and 6. It never stored the payload from steps 4 and 5.
