Axios npm Supply Chain Attack: Summary & Indicators of Compromise
On March 31, 2026, malicious versions of axios were published to npm, deploying a cross-platform Remote Access Trojan. Here is what happened, how to detect it, and what to do about it.
What happened
On March 31, 2026, an attacker compromised the npm account of axios lead maintainer Jason Saayman. The registered email was changed to ifstap@proton.me and a stolen classic npm access token was used to publish two malicious versions: axios@1.14.1 (tagged latest) and axios@0.30.4 (tagged legacy).
Both versions introduced a hidden dependency on plain-crypto-js@4.2.1, a package published from a separate attacker account (nrwise@proton.me). This package contained a postinstall hook that deployed a cross-platform Remote Access Trojan capable of arbitrary command execution on Windows, Linux, and macOS.
The classic npm token bypassed the GitHub Actions OIDC protections that were in place for legitimate publishes. The exposure window lasted approximately three hours (00:21 to 03:15 UTC) before npm intervened and unpublished both versions.
The last legitimate version, axios@1.14.0, was published on March 27 via GitHub Actions OIDC and remains safe.
Need help checking if your infrastructure is affected? Our team can audit your environments, scan for IOCs, and harden your CI/CD pipeline. See our Managed IT Services or IT Outsourcing for ongoing protection.
Timeline
| Time (UTC) | Event |
|---|---|
| Mar 27, 19:01 | axios@1.14.0 published legitimately via GitHub Actions OIDC |
| Mar 30, 05:57 | plain-crypto-js@4.2.0 published (clean decoy) |
| Mar 30, 23:59 | plain-crypto-js@4.2.1 published with malicious postinstall hook |
| Mar 31, 00:21 | axios@1.14.1 published from compromised account |
| Mar 31, 01:00 | axios@0.30.4 published from compromised account |
| Mar 31, 03:15 | npm unpublished both malicious versions |
Indicators of compromise
Malicious packages
| Package | Version | SHA-1 |
|---|---|---|
| axios | 1.14.1 | 2553649f232204966871cea80a5d0d6adc700ca |
| axios | 0.30.4 | d6f3f62fd3b9f5432f5782b62d8cfd5247d5ee71 |
| plain-crypto-js | 4.2.1 | 07d889e2dadce6f3910dcbc253317d28ca61c766 |
C2 infrastructure
| Indicator | Type |
|---|---|
sfrclak.com:8000 | C2 domain |
142.11.206.73 | C2 IP address |
6202033 | Campaign ID |
Attacker email accounts
| Usage | |
|---|---|
ifstap@proton.me | Changed on compromised axios maintainer account |
nrwise@proton.me | plain-crypto-js publisher |
Stage-2 payload artifacts
Windows:
%PROGRAMDATA%\wt.exe(disguised PowerShell copy)%TEMP%\6202033.vbs(VBScript loader)%TEMP%\6202033.ps1(PowerShell payload)
Linux:
/tmp/ld.py(Python RAT script)
macOS:
/Library/Caches/com.apple.act.mond(657 KB Mach-O binary, x86_64)
Detection
1. Check your lockfiles
Linux/macOS (Bash):
bashgrep -E "axios@1\.14\.1|axios@0\.30\.4|plain-crypto-js" package-lock.json yarn.lock pnpm-lock.yaml
Windows (PowerShell):
powershellSelect-String -Pattern "axios@1\.14\.1|axios@0\.30\.4|plain-crypto-js" -Path package-lock.json,yarn.lock,pnpm-lock.yaml
2. Search for the malicious dependency
Linux/macOS (Bash):
bashfind node_modules -type d -name "plain-crypto-js" 2>/dev/null
npm ls axios
Windows (PowerShell):
powershellGet-ChildItem -Path node_modules -Recurse -Directory -Filter "plain-crypto-js" -ErrorAction SilentlyContinue
npm ls axios
3. Scan multiple projects at once
Linux/macOS (Bash):
bashfind /path/to/projects -maxdepth 5 \( -name "package-lock.json" -o -name "yarn.lock" -o -name "pnpm-lock.yaml" \) -exec grep -l "axios.*1\.14\.1\|axios.*0\.30\.4\|plain-crypto-js" {} \;
Windows (PowerShell):
powershellGet-ChildItem -Path C:\path\to\projects -Recurse -Depth 5 -Include package-lock.json,yarn.lock,pnpm-lock.yaml | Select-String -Pattern "axios.*1\.14\.1|axios.*0\.30\.4|plain-crypto-js" -List | Select-Object Path
4. Check for filesystem artifacts
Windows (PowerShell):
powershellTest-Path "$env:ProgramData\wt.exe"
Test-Path "$env:TEMP\6202033.vbs"
Test-Path "$env:TEMP\6202033.ps1"
Linux:
bashls -la /tmp/ld.py 2>/dev/null
macOS:
bashls -la /Library/Caches/com.apple.act.mond 2>/dev/null
5. Check network connections
Windows (PowerShell):
powershellGet-DnsClientCache | Where-Object Entry -match "sfrclak"
Get-NetTCPConnection | Where-Object { (Resolve-DnsName $_.RemoteAddress -ErrorAction SilentlyContinue).NameHost -match "sfrclak" }
Linux:
bashss -tnp | grep -i sfrclak
grep "sfrclak" /var/log/syslog /var/log/dns*
macOS:
bashlsof -i -nP | grep -i sfrclak
log show --predicate 'process == "mDNSResponder"' --last 24h | grep sfrclak
Remediation
Immediate steps
- Verify exposure: check if any system ran
npm installbetween 00:21 and 03:15 UTC on March 31, 2026 - Search for IOCs: check filesystem artifacts and DNS/firewall logs for connections to
sfrclak.comor142.11.206.73 - Check private registries: inspect Verdaccio, Artifactory, or GitHub Packages mirrors for cached malicious versions
If IOCs are found
Treat the affected system as fully compromised:
- Rotate all credentials, API keys, tokens, and SSH keys from affected machines
- Rebuild Docker images and CI/CD environments from scratch
- Review access logs for lateral movement
Cleanup
- Pin axios to v1.14.0 and verify checksums
- Run
npm uninstall plain-crypto-js - Run
npm cache clean --force
Hardening
- Use lockfiles consistently with
npm ciinstead ofnpm install - Set
npm config set min-release-age 3to reject packages published less than 3 days ago - Replace classic npm tokens with granular tokens scoped to specific packages
- Apply IP restrictions to token access
- Enable npm provenance for published packages
- Implement dependency monitoring (Socket, Snyk, or Dependabot)
Full analysis
This page is a summary with actionable IOCs and detection steps. For the complete technical breakdown including payload deobfuscation, C2 protocol analysis, and MITRE ATT&CK mapping, read the full article on our blog:
Axios npm Supply Chain Attack: Full Analysis on the Salt Data Blog
Worried about supply chain attacks in your organization?
We help businesses implement dependency monitoring, lockfile policies, and CI/CD hardening to prevent incidents like this.