Résumé
On 31 March 2026 the single most widely used HTTP client in the JavaScript world was turned into malware for about three hours. Axios carries well over 100 million weekly downloads and sits as a transitive dependency underneath a huge share of the npm ecosystem, so when a North Korea-nexus actor took over the maintainer's account and published two booby-trapped versions, the blast radius was enormous even though the bad versions were live only for one early-morning window. The poisoned releases pulled in a hidden dependency that ran on install and dropped a cross-platform remote access trojan onto developer machines and CI runners. It is the case study in why a few hours of a popular package being compromised is still a global incident, and in why a maintainer's own laptop is now a nation-state target.
How it happened
The compromised package was the real axios, maintained by Jason Saayman (npm account jasonsaayman), not a typosquat or an axios-* lookalike. The GitHub source was never touched; only the npm publish path was abused. By the maintainer's own post-mortem, the root cause was a targeted social-engineering campaign that planted a remote access trojan on his personal machine, which gave the attacker control of his npm account. The account email was changed to an attacker address (ifstap@proton.me), and a long-lived classic npm token was used to publish directly, sidestepping the project's OIDC trusted-publishing workflow entirely.
Two malicious versions went out: axios@1.14.1 on the current line and axios@0.30.4 on the legacy line, between roughly 00:21 and 03:20 UTC, live for about three hours before npm pulled them. Both added a phantom dependency, plain-crypto-js (versions 4.2.1 and 4.2.0), that axios never imports. A postinstall hook ran an obfuscated dropper nicknamed SILKBELL, which installed a backdoor called WAVESHAPER.V2: a cross-platform remote access trojan with a Windows variant (a staged PowerShell payload with registry run-key persistence), a macOS native binary at com.apple.act.mond, and a Linux Python loader at /tmp/ld.py. It beaconed every 60 seconds to a command-and-control server at sfrclak[.]com (142.11.206.73). Because the malice lived only in the published tarballs, anyone who ran npm install with install scripts enabled during that window, directly or transitively, executed the dropper.
The damage
The exposure was set by axios's reach, not by the short window. The 1.14.x line alone draws around 100 million weekly downloads and the 0.30.x line about 83 million, and axios is overwhelmingly a transitive dependency, present in an estimated 80 percent of cloud and code environments. Organisations were exposed even if no developer ever typed npm install axios. Detection was fast, which is the only reason this was not far worse: Socket flagged the package automatically within minutes, the first infection landed roughly 89 seconds after publish, and runtime monitors observed anomalous command-and-control traffic across thousands of projects before the versions were revoked. Every machine that pulled a poisoned version during the window has to be treated as compromised, with all reachable secrets and CI credentials rotated.
Who was behind it
Google Threat Intelligence attributes the attack to UNC1069, a financially motivated North Korea-nexus actor active since at least 2018, based on the WAVESHAPER malware lineage, shared command-and-control behaviour and an unusual user-agent string, a connection from an AstrillVPN node previously tied to the group, and adjacent infrastructure on the same network. Microsoft tracks the same activity as Sapphire Sleet. These are not competing claims: Microsoft states explicitly that Sapphire Sleet overlaps with UNC1069 and with the cluster also known as BlueNoroff, STARDUST CHOLLIMA, Alluring Pisces, CageyChameleon and CryptoCore. It is one DPRK group under several vendor names. This is the same ecosystem of operators that runs developer-targeted lures like the Contagious Interview npm campaign, now reaching for a top-tier dependency instead of bespoke bait.
Why it still matters
Two lessons set this apart from an ordinary maintainer takeover. First, a nation-state went after a near-universal transitive dependency to deliver an espionage and access trojan, not the usual crypto-stealer. The target tier is the escalation: poison axios for three hours and you reach a meaningful slice of the world's build pipelines. Second, the soft target was the human, not the registry. npm's publishing hardening (two-factor auth, OIDC trusted publishing) did nothing here, because the attacker owned the maintainer's laptop and a legacy long-lived token still worked. The durable defences are mechanical: disable install scripts by default so a postinstall payload cannot fire, kill long-lived classic tokens, and pin dependencies so a freshly poisoned version cannot flow straight into a build. Unlike the self-propagating Shai-Hulud worm, this attack was one-shot, but its blast radius shows that one-shot at the top of the dependency graph is its own category of risk.
Comment le corriger
- If you installed axios 1.14.1 or 0.30.4 (or pulled them transitively) during the 31 March window, treat every affected machine as compromised: rotate all credentials and CI secrets it could reach, and rebuild from a clean, pinned lockfile.
- Audit lockfiles and node_modules for the malicious dependency plain-crypto-js (4.2.0 or 4.2.1); its presence means the install-time payload ran.
- Downgrade or pin to a known-good axios (1.14.0 or 0.30.3 and earlier), and clear npm, yarn, and pnpm caches on workstations and build servers so the poisoned tarball cannot reinstall.
- Block the command-and-control domain sfrclak[.]com and IP 142.11.206.73, and hunt for the dropped artifacts (com.apple.act.mond on macOS, a staged PowerShell payload on Windows, /tmp/ld.py on Linux).
Comment l’éviter
- Run installs with scripts disabled by default (npm ci --ignore-scripts), so a poisoned postinstall hook cannot execute on developer machines or CI runners.
- Pin dependencies to exact versions and gate upgrades through review, so a freshly published malicious version cannot flow straight into a build.
- Treat maintainer and publisher laptops as high-value targets: phishing-resistant 2FA, no long-lived classic publish tokens, and short-lived OIDC trusted publishing so a stolen credential has nothing to reuse.
- Isolate installs and CI in least-privilege sandboxes with no standing cloud credentials, and watch outbound traffic from build environments for anomalous command-and-control beacons.
Références
- https://cloud.google.com/blog/topics/threat-intelligence/north-korea-threat-actor-targets-axios-npm-package
- https://www.microsoft.com/en-us/security/blog/2026/04/01/mitigating-the-axios-npm-supply-chain-compromise/
- https://github.com/axios/axios/issues/10636
- https://www.stepsecurity.io/blog/axios-compromised-on-npm-malicious-versions-drop-remote-access-trojan
- https://socket.dev/blog/axios-npm-package-compromised
- https://www.huntress.com/blog/supply-chain-compromise-axios-npm-package
- https://www.tenable.com/blog/faq-about-the-axios-npm-supply-chain-attack-by-north-korea-nexus-threat-actor-unc1069
Vulnérabilités liées
Tout Supply chain →- CRITICALNPM-REDHAT-MIASMA-2026
In June 2026 the npm supply-chain worm finally produced something genuinely new and frightening: malicious packages that were signed and carried valid build provenance. Attackers used a compromised GitHub account inside Red Hat's own organisation to publish trojanised versions of 31 packages in the @redhat-cloud-services namespace through Red Hat's legitimate CI pipeline, so the poisoned releases arrived with authentic attestations proving they were built by the real build system. The payload, nicknamed Miasma, was a lightly re-skinned copy of Mini Shai-Hulud, a worm that a group called TeamPCP had open-sourced for anyone to reuse weeks earlier. No Red Hat customers were harmed, because Red Hat strips install scripts before deployment, but the permanent lesson is uncomfortable: a signature proves where a package was built, not that the build was clean.
- CRITICALNPM-SHAI-HULUD-2-2025
Shai-Hulud is the nightmare the npm ecosystem had long feared: a self-replicating worm. First seen in September 2025 and back in a more aggressive wave around 21-24 November 2025 ("The Second Coming"), it does not just poison one package and wait. When its malware runs in a developer's environment, it harvests every secret it can find, npm tokens, GitHub tokens, cloud keys, then uses those stolen npm tokens to automatically publish itself into other packages the victim maintains, spreading from maintainer to maintainer on its own. The second wave hit more than 25,000 GitHub repositories across roughly 500 compromised accounts, leaked the stolen secrets into public repos, and, if it failed to steal credentials, tried to wipe the victim's home directory. It is the moment supply-chain malware learned to propagate like a biological infection.
- CRITICALNPM-SHAI-HULUD-2025
Shai-Hulud, in September 2025, was the moment the npm ecosystem's oldest nightmare came true: a worm that spreads by itself. It began with a wave of compromised packages, the most prominent being @ctrl/tinycolor (over two million weekly downloads), and from there it did something no npm attack had done before. When its malware ran on a developer's machine, it hunted for every credential it could find, then used the developer's own npm token to republish itself into all of their other packages automatically, with no attacker involvement, jumping from maintainer to maintainer like an infection. More than 500 packages were compromised, including some from CrowdStrike. It is the first true npm worm (tracked as GHSA-6m4g-vm7c-f8w6 and GHSA-f3v2-259r-f6jc), the template for the more aggressive Second Coming that followed weeks later, and the ancestor of an entire 2026 lineage that ended with the worm's code being open-sourced for anyone to reuse.
- HIGHCVE-2025-30066
tj-actions/changed-files was one of the most widely used GitHub Actions on the planet, wired into the CI pipelines of more than 23,000 repositories just to list which files a pull request touched. On 14 March 2025 it was turned into a weapon. An attacker who had stolen the credentials of the project's bot account rewrote nearly every version tag, from v1 all the way to v45.0.7, so they all pointed at one malicious commit. Any pipeline that pulled the action then ran code that dumped the build runner's memory and printed the secrets it found, AWS keys, GitHub tokens, npm tokens, private keys, straight into the workflow logs. Tracked as CVE-2025-30066, it is the defining modern CI/CD supply chain attack, and a blunt lesson that a version tag is a sticky note, not a lock.
- HIGHCVE-2026-62680
Orval: Generation-time SSRF + remote/local file inclusion via unrestricted $ref
- CRITICALGHSA-93qj-5q5v-3c2h
Trojanized pantheon-agents 0.6.1 and 0.6.2 on PyPI ship a credential stealer (supply-chain account compromise)