In late March 2026, attackers briefly hijacked the npm maintainer account of the widely used Axios library and published malicious versions 1.14.1 and 0.30.4 that deployed a cross-platform remote access trojan. Although the compromised packages were available for only a few hours, the incident exposed how quickly a single dependency can become a high-impact supply-chain threat.

If you maintain or build any JavaScript project that uses Axios, this section is for you. The malicious versions were only live on npm for approximately three hours, but the nature of the attack – a self-deleting payload that replaces its own evidence with clean files – means you cannot rely on a simple inspection of your node_modules directory.
Search your installed packages and lock file for the two compromised version numbers: axios@1.14.1 and axios@0.30.4.
The malicious versions added plain-crypto-js as a runtime dependency – a package that has never appeared in any legitimate Axios release and is only used to trigger a post-install script. If the plain-crypto-js directory exists in your node_modules, it means the dropper has likely executed in your system and you should assume compromise, even if the contents now look clean.
The dropper installs platform-specific malware. Check for the presence of the following files:
/Library/Caches/com.apple.act.mond/tmp/ld.py%PROGRAMDATA%\wt.exeReview build logs for any npm install runs in the early hours of March 31, 2026. Any pipeline that pulled either malicious version during this window should be treated as compromised, and all secrets available to that environment should be rotated immediately.
If any of the above checks returns positive results, you should assume compromise. The recommended course of action is as follows:
axios@1.14.0 or axios@0.30.3 (as applicable). Add overrides and resolutions entries to your package.json to prevent transitive resolution pulling in the malicious versions.node_modules/plain-crypto-js and reinstall with npm install --ignore-scripts..env files.sfrclak.com and 142.11.206.73 to your network deny lists as a precaution.In the early hours of March 31, 2026, an attacker compromised and hijacked the npm account of jasonsaayman, the primary maintainer of the Axios project. It’s not clear how exactly this was achieved. The attacker then used the hijacked credentials to publish two malicious versions of the library directly to the npm registry to cover the main and legacy branches: axios@1.14.1 around 00:21 UTC and axios@0.30.4 around 01:00 UTC.
While legitimate Axios releases were always published via GitHub Actions using npm’s OIDC Trusted Publisher mechanism, the malicious versions were published manually with a stolen npm access token. This provided a critical forensic signal and one of the clearest indicators that these were not legitimate releases.
The rapid response that followed deserves credit. Community member Ashish Kurmi filed GitHub issue #10604 to alert the ecosystem, and the coordinated effort between Axios contributors, GitHub, and npm support kept the window of exposure as short as possible.
By 03:15 UTC, npm had unpublished both malicious versions and reverted the latest dist-tag to the safe 1.14.0. A security hold was placed on plain-crypto-js shortly after, and by 04:26 UTC npm had replaced it with a security-holder stub. The total exposure window was approximately 2 hours and 53 minutes for axios@1.14.1 and 2 hours and 15 minutes for axios@0.30.4.
The attack was methodically prepared ahead of time. Approximately 18 hours before the tampered Axios versions were published, the attacker (operating under the npm account nrwise, registered to nrwise@proton.me) published plain-crypto-js@4.2.0 – a clean, non-malicious package that was essentially a verbatim copy of the legitimate crypto-js library. This was a decoy with the sole purpose of establishing publishing history to avoid triggering security scanner alarms about a brand-new package.
Just before midnight UTC on March 30, the malicious plain-crypto-js@4.2.1 was published. This version was almost identical to 4.2.0, with just three differences: a postinstall hook added to package.json, a new script called setup.js, and a file named package.md containing a clean JSON stub for post-install cleanup.
The only change the attacker made to Axios itself was adding the malicious plain-crypto-js@4.2.1 as a runtime dependency in package.json. Every other file and dependency is otherwise identical to the prior clean Axios version, and there’s no malicious code anywhere in the Axios source. Crucially, the plain-crypto-js package is never imported or required anywhere in the codebase but exists solely to trigger the postinstall hook during installation.
This phantom dependency pattern, where a package listed in the manifest but never referenced in the code, is a hallmark of modern supply-chain attacks and a high-confidence indicator of tampering.
Malware installation takes place when a developer runs npm install and npm resolves the dependency tree, installs plain-crypto-js@4.2.1, and automatically executes its postinstall script: node setup.js.
The setup.js script is a single minified file that uses a two-layer obfuscation scheme. All sensitive strings, including the module names, OS identifiers, shell commands, the command and control URL, and file paths, are stored as encoded values in an array and only decoded at runtime through XOR and base64 operations. Security researchers at StepSecurity fully decoded the string table to reveal the complete attack chain.
The dropper detects the host operating system and branches into one of three platform-specific attack paths:
sfrclak.com:8000. Saves the file to the legitimate-looking path /Library/Caches/com.apple.act.mond and launches it in the background.%PROGRAMDATA%\wt.exe to execute it in a hidden window. The VBScript fetches a PowerShell payload from the C2 server, executes it in a hidden window, and self-deletes.curl to download a Python RAT script to /tmp/ld.py and executes it in the background.Each platform sends a distinct POST body to the same C2 endpoint, with values designed to look like legitimate npm registry traffic in network logs (packages.npm.org/product0, product1, product2).
After launching the platform payload, the dropper performs three cleanup operations: it deletes itself (setup.js), deletes the malicious package.json, and renames the pre-staged package.md to package.json. This clean stub reports version 4.2.0 to mislead incident responders who might be scanning for the known-malicious version number.
The entire function is wrapped in a try/catch block that silently swallows all errors. If the C2 is unreachable, if the user lacks permissions, or if anything else fails, npm install still completes successfully with exit code 0. The developer never sees any indication that anything went wrong.
Analysis from Wiz, SafeDep, and OpenSourceMalware suggests that the payloads across all three platforms function as lightweight but capable remote access trojans. They beacon to the C2 server every 60 seconds, transmitting system inventory and awaiting commands. Supported capabilities may include remote shell execution, arbitrary binary injection, directory and file enumeration, process listing, and system reconnaissance.
Notably, researchers have observed no cryptocurrency mining or ransomware components in the payloads. The focus on system reconnaissance, credential harvesting, and capability for lateral movement has led some analysts to characterize this as intelligence-gathering activity rather than financially motivated cybercrime.
The speed with which this attack was detected and contained is commendable, but a sober look at the numbers shows just how thin the margin was.
Axios is, by any measure, one of the most depended-on packages in the entire JavaScript ecosystem. Download counts vary by source – npm shows approximately 83 million weekly downloads at the time of writing, while some sources report figures of 100 or even 300 million – but the precise number matters less than the order of magnitude. Wiz researchers noted that Axios is present in roughly 80% of cloud and code environments they monitor. Even within the narrow three-hour window, Wiz observed malicious execution in 3% of affected environments. At this scale, even single-digit percentages translate to very large numbers of potentially compromised systems.
Had the attacker moved more quietly, the window could have been much wider. The fact that the malicious versions lacked OIDC attestation and had no corresponding GitHub tags is what enabled fast detection. A more careful attacker might have obtained GitHub access as well, or found ways to make the publish metadata look legitimate. The ecosystem was fortunate that the forensic signals were this clear.
The Axios compromise does not exist in isolation but lands in the middle of what has become one of the most active periods for npm supply-chain attacks on record.
In September 2025, the Shai-Hulud worm campaign infected over 500 npm packages through compromised maintainer accounts and phishing attacks, prompting a CISA advisory. A second wave in November 2025, dubbed Shai-Hulud 2.0, expanded the scope to over 600 compromised packages and introduced a destructive “dead man’s switch” mechanism.
Just days before the Axios attack, the TeamPCP group weaponized version tags of Aqua Security’s Trivy scanner in a cascading supply chain attack that also hit Checkmarx’s VS Code extensions, LiteLLM, and Telnyx on PyPI. A further CanisterWorm campaign originating from those TeamPCP compromises spread to over 60 npm packages. The list goes on.
The common thread running through all these incidents is the exploitation of trust: in maintainer accounts, in automated pipelines, or in the dependency resolution process itself. The npm ecosystem’s fundamental operating model that made it so popular, where a single npm install can silently fetch, install, and execute arbitrary code from hundreds of transitive dependencies, is a structural security weakness that attackers have learned to weaponize.
Based on what we know so far, the Axios story seems to be one of “Phew, another close call” – but there is an extra dimension of supply-chain risk that deserves a thought here. With the rise of AI-assisted development and autonomous coding agents, it only takes one successful attack to compromise potentially millions of machines.
Modern software development workflows increasingly involve AI tools that generate, modify, and install dependencies on behalf of human developers. Some of these tools might run in semi-autonomous or fully autonomous modes, adding packages to projects, updating dependencies, and executing build steps without explicit human review of each dependency install.
The dependency-heavy nature of JavaScript development has always meant that any npm install was a leap of faith across dozens or hundreds of packages. Until now, the implicit assumption has been that a human developer is at least nominally aware of what is being pulled in. As that assumption fades and ever more of the install-build-deploy pipeline is handed over to autonomous agents, the attack surface for supply-chain compromises like the Axios incident expands dramatically – as does the potential fallout.
