On March 31, 2026, two malicious versions of axios were published to npm. The attack compromised the account of jasonsaayman — the primary axios maintainer — changed the account email to an attacker-controlled ProtonMail address, and used stolen credentials to publish axios@1.14.1 and axios@0.30.4 directly via the npm CLI, bypassing the project’s GitHub Actions OIDC-signed CI/CD pipeline entirely.
Neither version contains a single malicious line inside axios itself. Instead, both inject a phantom dependency — plain-crypto-js@4.2.1 — a package that is never imported anywhere in the axios source code. Its only purpose is to execute a postinstall hook that deploys a fully featured, cross-platform remote access trojan within 15 seconds of npm install running. The RAT targets Windows, Linux, and macOS with platform-specific second-stage payloads, encrypts harvested credentials with AES-256-CBC and RSA-4096, and exfiltrates to a live C2 server at sfrclak.com:8000.
With over 300 million weekly npm downloads, axios is present in virtually every JavaScript codebase that makes HTTP requests — from React frontends to CI/CD tooling to production server APIs. The campaign’s blast radius extends far beyond development machines: any CI/CD pipeline that ran npm install during the 3-hour 19-minute exposure window should treat all injected secrets as compromised. No CVE has been assigned. Traditional CVE-based scanners will not flag it.
Malware has been taken down.
TL;DR for Engineering Teams
Field
Detail
What it is
Supply chain compromise of axios v1.14.1 and v0.30.4 on npm, injecting a cross-platform RAT via a malicious dependency (plain-crypto-js@4.2.1). No CVE assigned.
Where it bites
Any project that ran npm install or npm update between 00:21 UTC and 03:40 UTC on March 31, 2026 and resolved to either compromised version. Affects Node.js backends, CI/CD pipelines, developer machines, and container builds.
Why it matters
RAT executes in 15 seconds with no user action. Stealer sweeps SSH keys, AWS/GCP/Azure credentials, Kubernetes tokens, .env files, shell history, and crypto wallets.
Patch status
Both malicious versions removed from npm. Entire plain-crypto-js package removed. Safe versions: axios@1.14.0 (1.x) and axios@0.30.3 (0.x).
Immediate action
Pin to axios@1.14.0 or axios@0.30.3. Check for node_modules/plain-crypto-js/ directory (presence = dropper ran). Rotate all secrets on affected machines. Block sfrclak.com and 142.11.206.73:8000.
CWE-829: Inclusion of Functionality from Untrusted Control Sphere
CVE
Not assigned
Attack Vector
Network (npm package installation)
Active Exploitation
Confirmed — live C2 server, platform-specific payloads served
Attribution
Unknown; assessed espionage or APT motive based on RAT capabilities and lack of ransomware/mining payload
Exposure Window
~3 hours 19 minutes (March 31, 00:21 UTC to 03:40 UTC)
C2 Infrastructure
sfrclak.com | 142.11.206.73:8000
Technical Anatomy
Phase 1: Maintainer Account Hijack and Pre-Staging
The attack was staged across roughly 24 hours before the poisoned axios releases appeared. On March 30 at 05:57 UTC, an attacker-controlled account (nrwise, registered nrwise@proton.me) published plain-crypto-js@4.2.0 — a clean decoy containing a full copy of the legitimate crypto-js source with no postinstall hook. This established npm publishing history so the package would not trigger zero-history alerts from automated scanners.
This from the original discussion perfectly sums how we all feel.
Seventeen hours later at 23:59 UTC, plain-crypto-js@4.2.1 was published from the same account — this time with the malicious postinstall hook and obfuscated dropper (setup.js) added. The attacker then used compromised credentials for jasonsaayman to publish the backdoored axios releases. The account email had been changed to ifstap@proton.me. Both attacker accounts used ProtonMail: a consistent operational pattern.
Critical forensic signal: Every legitimate axios 1.x release since adopting Trusted Publishers carries an OIDC token binding it cryptographically to a specific GitHub Actions workflow. axios@1.14.1 carries no such binding, no gitHead, and no corresponding commit or tag in the GitHub repository. The release exists only on npm. This is the single most reliable detection indicator for the compromise.
Phase 2: The Phantom Dependency Injection
The surgical diff between clean and compromised versions is one line in package.json — the addition of plain-crypto-js: "^4.2.1" as a runtime dependency. This package is never imported, required, or referenced anywhere in the axios source code across all 86 files. Its presence in package.json exists solely to trigger npm’s dependency resolution and execute the postinstall hook.
When a developer runs npm install axios@1.14.1, npm automatically resolves the dependency tree, installs plain-crypto-js@4.2.1, and executes its postinstall script: node setup.js. The hook fires before npm returns control to the terminal. From the developer’s perspective, npm install completed successfully. The backdoor has already run.
The Obfuscated Dropper: setup.js
setup.js is a single minified file using a two-layer obfuscation scheme. All sensitive strings are stored as encoded values in an array (stq[]) and decoded at runtime:
Layer 1 — XOR cipher: The key "OrDeR_7077" is parsed through Number(), which coerces alphabetic characters to NaN. In bitwise operations NaN becomes 0, leaving only the digits [7,0,7,7] effective at positions 6–9. Each character at position r is decoded as: charCode XOR key[(7 × r × r) % 10] XOR 333
Layer 2 — Outer wrapper: Reverses the encoded string, substitutes underscores for equals signs (base64 padding), base64-decodes, then passes through the XOR cipher
Once decoded, the full C2 URL is: http://sfrclak.com:8000/6202033. The path segment 6202033 is the campaign identifier. After launching the platform-specific payload, setup.js performs three evidence-destruction steps: deletes itself (fs.unlink(__filename)), deletes the real package.json, and renames a pre-staged clean stub (package.md) to package.json. Any post-infection inspection of node_modules/plain-crypto-js/ shows a clean manifest with no postinstall hook.
The directory node_modules/plain-crypto-js/ remaining on disk — even with a clean-looking package.json — is sufficient evidence the dropper executed. axios has no legitimate dependency with this name.
Stage 1: Platform Detection and Payload Delivery
The dropper detects os.platform() and branches into three attack paths. Each sends a distinct POST body to the same C2 URL, allowing the server to return the appropriate second-stage payload. The packages.npm.org/ prefix in the POST body is deliberate — it makes C2 traffic look like routine npm registry communication in network logs.
curl → python3 via nohup, detached from parent PID (orphaned to PID 1)
/tmp/ld.py
Stage 2: Credential Harvesting
The RAT performs a systematic, exhaustive sweep of the compromised host. On Windows, the PowerShell payload establishes persistence via a HKCU Run registry key named MicrosoftUpdate pointing to %PROGRAMDATA%\system.bat, then uses reflective .NET assembly injection to load the stage-2 binary directly into memory without touching disk. On macOS, the native Mach-O universal binary (supporting both x86_64 and arm64) is deployed to /Library/Caches/com.apple.act.mond — a path mimicking legitimate Apple system cache naming conventions.
Stage 3: Encrypted Exfiltration and C2 Persistence
Collected data is encrypted with AES-256-CBC (key derived via PBKDF2 from 32 random bytes), with the session key wrapped using a hardcoded RSA-4096 public key (OAEP padding). The bundle is packaged as tpcp.tar.gz and POSTed via HTTPS to sfrclak.com:8000/6202033 with header X-Filename: tpcp.tar.gz. Only the holder of the RSA private key can decrypt the bundle.
After the initial exfiltration, the RAT beacons back to C2 every 60 seconds with BaseInfo payloads containing hostname, username, OS version, timezone, hardware fingerprint, and a full process list. The process list reveals running security tools (EDR, AV, monitoring), active development environments, other potential pivot targets on the same host, and which debugging or orchestration tools are active.
Runtime Validation: What Actually Happened
StepSecurity’s Harden-Runner instrumentation confirmed the exact execution chain:
C2 contact occurs 1.1 seconds into npm install — before npm has finished resolving all dependencies
A second C2 connection fires 36 seconds later, in a completely separate workflow step after npm install has exited, confirming the detached background process survived beyond the installing step
Both connections show calledBy: "infra" rather than "runner" because the malware used nohup ... & to orphan itself to PID 1
The package.json overwrite is captured as two writes from two separate PIDs, 36 seconds apart — confirming the evidence swap
The process tree: npm install → sh → node setup.js → sh → curl/nohup. Four levels of indirection from installation to C2 callback.
Affected Versions
axios (This Compromise)
Package
Vulnerable Version
Safe Version
Notes
axios (npm)
1.14.1
1.14.0
Payload in plain-crypto-js dependency; postinstall-time execution
axios (npm)
0.30.4
0.30.3
Same payload; targets legacy 0.x user base
plain-crypto-js (npm)
4.2.1
Package removed
Never a legitimate axios dependency; staged from nrwise account
SHA Verification for Safe Versions
Package
Version
SHA (npm tarball)
axios (safe)
1.14.0
7c29f4cf2ea91ef05018d5aa5399bf23ed3120eb
axios (safe)
0.30.3
ab1be887a2d37dd9ebc219657704180faf2c4920
plain-crypto-js (malicious)
4.2.1
07d889e2dadce6f3910dcbc253317d28ca61c766
Discovery and Disclosure Timeline
Timestamp (UTC)
Event
2026-03-27 19:01
axios@1.14.0 published via GitHub Actions OIDC — last legitimate release
2026-03-30 05:57
plain-crypto-js@4.2.0 created by nrwise account — clean decoy to establish npm history
2026-03-30 18:15
jasonsaayman merges PR #10584 — last confirmed legitimate maintainer activity
2026-03-30 23:59
plain-crypto-js@4.2.1 published — malicious postinstall hook added
2026-03-31 00:21
axios@1.14.1 published by compromised jasonsaayman account via npm CLI — ATTACK BEGINS
2026-03-31 01:00
axios@0.30.4 published — legacy 0.x branch also poisoned
Rotate all credentials on affected machines: GitHub tokens, AWS/GCP/Azure credentials, SSH keys, npm tokens, Docker registry credentials, Kubernetes secrets, Vault tokens, .env files, and anything in shell history.
Audit CI/CD pipeline run logs for any npm install that executed during 00:21–03:40 UTC March 31. Any pipeline that installed axios@1.14.1 or axios@0.30.4 must have all injected secrets rotated.
Long-Term Hardening
Use npm ci –ignore-scripts in all CI/CD pipelines as a standing policy. Postinstall hooks are the primary delivery vector for npm supply chain attacks.
Verify OIDC provenance attestation on packages from projects that publish via GitHub Actions. The absence of provenance on a new release from a previously OIDC-enabled project is a high-signal indicator of account compromise.
Enable StepSecurity Harden-Runner or equivalent CI egress filtering. An allowlisted network policy would have blocked the C2 callback before any credentials left the runner.
Add npm Package Cooldown checks to your CI pipeline. Most malicious npm packages are identified within 24 hours of publication; a configurable hold on newly published versions provides a meaningful detection window without blocking critical updates.
Monitor npm registry metadata changes for packages your organisation depends on. A change in the publisher field from “GitHub Actions” to a human account name is immediately suspicious for projects using Trusted Publishers.
Consider using a private npm registry proxy with package mirroring and a quarantine policy for newly published versions of high-impact dependencies.
Real-World Impact
axios is not a niche utility. It is the default HTTP client for JavaScript. React applications, Express APIs, Next.js backends, CLI tools, and CI/CD automation — virtually every Node.js project that communicates over HTTP has axios in its dependency tree. The npm registry records over 300 million weekly downloads. A 3-hour 19-minute exposure window against that install base means the potential exposure count runs into the tens of thousands of environments.
The targeting is deliberately broad but the intelligence value is specific: developer machines carry SSH keys, cloud credentials, and access to production environments that no endpoint on the public internet can directly reach. A compromised developer workstation is a pre-authenticated foothold inside the perimeter. CI/CD runners carry the most valuable credentials in the organisation — deployment tokens, cloud IAM credentials, registry credentials, and API keys for every downstream service the pipeline touches.
The attack generated no CVE, no CVSS score, and no NVD entry. Traditional CVE-based vulnerability management workflows would not have detected it. Organizations running SCA tools that exclusively scan for known CVEs had zero automated visibility into this compromise during the exposure window.
This is a good conclusion of the discussion.
Phoenix Security Recommendations
The axios compromise is proof that the attack surface for software supply chain threats extends far beyond the CVE feed. This campaign had no vulnerability identifier, no patch, and no CVE-based detection signal. The compromised package was one of the most trusted libraries in the JavaScript ecosystem. If your vulnerability management programme only flags known CVEs, this attack was invisible to it from start to finish.
Attack surface management: Phoenix identifies which environments have axios installed and cross-references installed versions against the known-compromised 1.14.1 and 0.30.4 releases.
Contextual deduplication: Organisations running axios across dozens of services get a single prioritised remediation backlog rather than duplicate alerts per repo.
Reachability analysis: Phoenix distinguishes between environments where axios@1.14.1 was installed and where it actually executed during the 3-hour exposure window.
Remediation campaigns: Create a campaign in Phoenix to track completion of version downgrades, lock-file pinning, plain-crypto-js removal, persistent-artifact cleanup, and credential rotation across all affected environments.
Ownership attribution: Map each affected service to the owning team. Phoenix automates that mapping, turning a cross-organisation incident into an owned, trackable remediation backlog.
References
6mile — Dissecting a Sophisticated NPM Supply Chain Attack: The axios + plain-crypto-js Malware Campaign (March 31, 2026)
StepSecurity — axios Compromised on npm: Malicious Versions Drop Remote Access Trojan (ashishkurmi, March 31, 2026)
axios GitHub Issue #10604 — Community tracking of compromise
npm Registry — axios version history and publisher metadata
StepSecurity Harden-Runner — Runtime validation run
Wiz Research — Trivy Compromised by TeamPCP — upstream campaign context
Your team doesn’t have a finding problem. They have a fixing problem.
Most platforms hand you a list. Phoenix hands you a plan — ranked by real risk, mapped to the team that owns it, with a clear path to close it.
What remediation looks like with Phoenix:
One backlog, not five. Findings from SAST, SCA, containers, and cloud — deduplicated, correlated, and surfaced in a single prioritized queue. No more reconciling lists across tools.
Ownership that sticks. Team attribution and inheritance mean the right ticket goes to the right engineer, first time. No routing, no guessing, no back-and-forth.
Campaigns that move the needle. Group related findings into targeted remediation campaigns. Track progress, measure closure rates, and report real reduction — not raw counts.
AI that does the legwork, not the deciding. Phoenix’s Remediator agent drafts fixes, creates tickets, and opens PRs. Your team reviews, approves, and merges. Every fix is traceable.
Phoenix Security changes the game.
The results are clear:
Bazaarvoice saved $6.3M in developer time and for teams removed critical in the first weeks of adoption
ClearBank cut critical container vulnerabilities by 96–99% and reclaimed 4 hours per engineer per week.
IAS saved an equivalent of 1.5M in development hours and reduced SCA-to-container noise by 82.4%
Optimizely has been able to act on vulnerabilities sitting on the backlog.
The pattern is the same every time: teams that move from find and report to analyze and fix close more risk with less effort.
The results are clear:
Bazaarvoice saved $6.3M in developer time and for teams removed critical in the first weeks of adoption
ClearBank cut critical container vulnerabilities by 96–99% and reclaimed 4 hours per engineer per week.
IAS saved an equivalent of 1.5M in development hours and reduced SCA-to-container noise by 82.4%
Optimizely has been able to act on vulnerabilities sitting on the backlog.
Francesco is an internationally renowned public speaker, with multiple interviews in high-profile publications (eg. Forbes), and an author of numerous books and articles, who utilises his platform to evangelize the importance of Cloud security and cutting-edge technologies on a global scale.
Francesco is an internationally renowned public speaker, with multiple interviews in high-profile publications (eg. Forbes), and an author of numerous books and articles, who utilises his platform to evangelize the importance of Cloud security and cutting-edge technologies on a global scale.
TeamPCP hid a credential stealer inside a WAV audio file — invisible to static analysis — and used tokens stolen from litellm three days earlier to publish it directly to PyPI, bypassing GitHub entirely.
Day 6 of TeamPCP Attack. TeamPCP has crossed the Rubicon from CI/CD tooling into production AI infrastructure. LiteLLM versions 1.82.7 and 1.82.8 on PyPI contain a three-stage credential stealer that harvests SSH keys, cloud secrets, and Kubernetes tokens, deploys privileged pods across every node in your cluster, and installs a persistent backdoor polling for additional payloads. If you run LiteLLM in any environment, check your installed version right now.
In five days, a single stolen GitHub token became a cascading supply chain compromise spanning Trivy, Checkmarx, OpenVSX, and npm. TeamPCP force-pushed 110+ malicious tags, backdoored container images, weaponised VS Code extensions against local coding agents, and launched a self-propagating npm worm using blockchain C2. If your CI/CD pipelines reference any of these tools by version tag, assume compromise.
TeamPCP turned Aqua Security’s own scanner into a credential stealer, force-pushed 76 version tags, and is still inside the organisation — three compromises in under a month, and counting
TeamPCP turned Trivy into a credential stealer by force-pushing 75 version tags to malicious commits — causing thousands of CI/CD pipelines to silently execute attacker code.
Phoenix Security announced the general availability of its AI-powered Remediation Engine, enabling agentless container vulnerability remediation aligned with CTEM principles. By correlating container lineage to build files, the platform reduces SCA noise by up to 91% and generates precise remediation actions engineers and AI agents can execute instantly.
Derek Fisher – Head of product security at a global fintech. Speaker, instructor, and author in application security.
Derek is an award winning author of a children’s book series in cybersecurity as well as the author of “The Application Security Handbook.” He is a university instructor at Temple University where he teaches software development security to undergraduate and graduate students. He is a speaker on topics in the cybersecurity space and has led teams, large and small, at organizations in the healthcare and financial industries. He has built and matured information security teams as well as implemented organizational information security strategies to reduce the organizations risk.
Derek got his start in the hardware engineering space where he learned about designing circuits and building assemblies for commercial and military applications. He later pursued a computer science degree in order to advance a career in software development. This is where Derek was introduced to cybersecurity and soon caught the bug. He found a mentor to help him grow in cybersecurity and then pursued a graduate degree in the subject.
Since then Derek has worked in the product security space as an architect and leader. He has led teams to deliver more secure software in organizations from multiple industries. His focus has been to raise the security awareness of the engineering organization while maintaining a practice of secure code development, delivery, and operations.
In his role, Jeevan handles a range of tasks, from architecting security solutions to collaborating with Engineering Leadership to address security vulnerabilities at scale and embed security into the fabric of the organization.
Jeevan Singh is the Director of Security Engineering at Rippling, with a background spanning various Engineering and Security leadership roles over the course of his career. He’s dedicated to the integration of security practices into software development, working to create a security-aware culture within organizations and imparting security best practices to the team. In his role, Jeevan handles a range of tasks, from architecting security solutions to collaborating with Engineering Leadership to address security vulnerabilities at scale and embed security into the fabric of the organization.
James Berthoty has over ten years of experience across product and security domains. He founded Latio Tech to help companies find the right security tools for their needs without vendor bias.
Chris Romeo is a leading voice and thinker in application security, threat modeling, and security champions and the CEO of Devici and General Partner at Kerr Ventures. Chris hosts the award-winning “Application Security Podcast,” “The Security Table,” and “The Threat Modeling Podcast” and is a highly rated industry speaker and trainer, featured at the RSA Conference, the AppSec Village @ DefCon, OWASP Global AppSec, ISC2 Security Congress, InfoSec World and All Day DevOps. Chris founded Security Journey, a security education company, leading to an exit in 2022. Chris was the Chief Security Advocate at Cisco, spreading security knowledge through education and champion programs. Chris has twenty-six years of security experience, holding positions across the gamut, including application security, security engineering, incident response, and various Executive roles. Chris holds the CISSP and CSSLP certifications.
Jim Manico is the founder of Manicode Security, where he trains software developers on secure coding and security engineering. Jim is also the founder of Brakeman Security, Inc. and an investor/advisor for Signal Sciences. He is the author of Iron-Clad Java: Building Secure Web Applications (McGraw-Hill), a frequent speaker on secure software practices, and a member of the JavaOne Rockstar speaker community. Jim is also a volunteer for and former board member of the OWASP foundation.
Join our Mailing list!
Get all the latest news, exclusive deals, and feature updates.