Axios npm Supply Chain Compromise by Sapphire Sleet (DPRK) — Cross-Platform RAT via Phantom Dependency

Axios npm Supply Chain Compromise by Sapphire Sleet (DPRK) (TL-2026-0311), also tracked as Axios npm Hijack, is a critical-severity supply-chain compromise, first published 2026-04-01 and last reviewed 2026-08-23. It is attributed to APT38 (North Korea) with high confidence, affects axios axios, maps to 23 MITRE ATT&CK techniques (T1027, T1036, T1041), and is covered by 9 detection rules and 33 indicators of compromise.

Key facts for TL-2026-0311

Threat ID
TL-2026-0311
Also known as
Axios npm Hijack, WAVESHAPER.V2 Campaign
Severity
CRITICAL
Status
MONITORING
Category
SUPPLY_CHAIN
First published
2026-04-01
Last reviewed
2026-08-23
Attribution
APT38
Attribution confidence
HIGH
Nation-state nexus
North Korea
Motivation
FINANCIAL
Target sectors
technology, financial, cryptocurrency, software-development, cloud-infrastructure, devops
Target regions
Global
Detection rules
9
Indicators of compromise
33
Updates
2026-08-23 · revalidated 1× · latest source

Malware and tooling in Axios npm Supply Chain Compromise by Sapphire Sleet (DPRK)

Malware and tooling: WAVESHAPER, macWebT

On March 31, 2026, North Korean state actor Sapphire Sleet (UNC1069/BlueNoroff) compromised the npm account of Axios maintainer jasonsaayman and published backdoored versions 1.14.1 and 0.30.4 of the Axios HTTP client library (~100M weekly downloads). The malicious versions injected a phantom dependency plain-crypto-js@4.2.1 whose postinstall hook contacted C2 infrastructure at sfrclak.com:8000 to deploy platform-specific RATs targeting Windows, macOS, and Linux systems.

How Axios npm Supply Chain Compromise by Sapphire Sleet (DPRK) works

On March 31, 2026, a sophisticated supply chain attack was executed against the Axios npm package, one of the most widely used JavaScript HTTP client libraries with approximately 100 million weekly downloads and presence in roughly 80% of cloud and code environments. The attack was attributed to the North Korean state-sponsored threat actor Sapphire Sleet (also tracked as UNC1069, BlueNoroff, STARDUST CHOLLIMA, Alluring Pisces, CageyChameleon, and CryptoCore) by both Microsoft Threat Intelligence and Google Threat Intelligence Group.

The attack began with the compromise of the npm credentials belonging to jasonsaayman, the lead Axios maintainer. Evidence suggests a long-lived npm access token was stolen rather than credentials being phished, as the maintainer had MFA/2FA enabled. The npm platform prioritized the token over OIDC when both were present, allowing the attacker to bypass multi-factor authentication. The compromised account email was changed to ifstap@proton.me.

Prior to the main attack, the threat actor pre-staged infrastructure by creating the npm account nrwise (nrwise@proton.me) which published plain-crypto-js@4.2.0 as a clean decoy version approximately 18 hours before the attack, followed by the malicious 4.2.1 at 23:59 UTC on March 30. Two trojanized Axios versions were then published: v1.14.1 (tagged latest) at 00:21 UTC and v0.30.4 (tagged legacy) at 01:00 UTC on March 31, 2026.

The malicious Axios versions added plain-crypto-js@^4.2.1 as a dependency — a package never imported anywhere in the Axios source code. Its sole purpose was to execute a postinstall script (setup.js) that acted as a cross-platform RAT dropper. The dropper employed a custom two-layer obfuscation scheme: Layer 1 reversed an encoded string, replaced underscores with base64 padding characters, then decoded the result. Layer 2 applied XOR encryption using the key OrDeR_7077, selecting digits via the formula 7*i*i % 10 and XORing against constant 333. This dual approach obscured 18 critical strings including module names, C2 infrastructure, and shell commands from signature-based detection tools.

Upon execution, setup.js detected the host operating system and delivered platform-specific payloads:

macOS: Downloaded a Mach-O universal binary to /Library/Caches/com.apple.act.mond, masquerading as an Apple system daemon. The binary was launched via nohup osascript and identified itself to C2 with POST body packages.npm.org/product0. The RAT (internally named macWebT, linking to BlueNoroff webT module from RustBucket campaigns) generated a 16-character unique victim ID and fingerprinted the system (hostname, username, macOS version, timezone, CPU type, install date, boot time, running processes, application directories). It supported commands including peinject (binary injection with ad-hoc code signing via codesign --force --deep --sign -), runscript (shell/AppleScript execution), rundir (directory enumeration), and kill (process termination). It beaconed to C2 every 60 seconds using a deceptive User-Agent string mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0).

Windows: Copied PowerShell to %PROGRAMDATA%\wt.exe to impersonate Windows Terminal, then deployed a VBScript launcher (%TEMP%\6202033.vbs) with hidden window style (window style 0) that executed the PowerShell RAT (%TEMP%\6202033.ps1). Persistence was established via the registry key HKCU\Software\Microsoft\Windows\CurrentVersion\Run\MicrosoftUpdate. A resilience mechanism via system.bat at %PROGRAMDATA%\system.bat enabled re-download capability. The Windows RAT provided remote shell execution, binary injection, directory browsing, process listing, and system reconnaissance, beaconing C2 every 60 seconds. POST body identifier: packages.npm.org/product1.

Linux: Deployed a Python script to /tmp/ld.py, launched detached via nohup python3. The RAT provided remote shell execution, process management, directory traversal, and system reconnaissance. It also attempted shell profile injection (.bashrc, .zshrc) for persistence. POST body identifier: packages.npm.org/product2.

Post-execution, the dropper performed anti-forensics by deleting setup.js, removing the malicious package.json containing the postinstall hook, and restoring a clean package.json from a package.md backup, making the infected node_modules directory appear benign to inspection.

The malicious versions were live for approximately 2-3 hours (00:21 to ~03:15 UTC on March 31) before detection and removal. Despite this brief window, the first infection was observed just 89 seconds after publication (00:23:27 UTC), and Huntress observed 135+ endpoints contacting C2 across their partner base. Wiz reported a 3% execution rate across affected environments — a significant footprint given the package massive download volume.

Related malicious packages published by the same infrastructure include @shadanai/openclaw (versions 2026.3.28-2, 2026.3.28-3, 2026.3.31-1, 2026.3.31-2) and @qqbrowser/openclaw-qbot (version 0.0.130). Google Threat Intelligence Group identified the second-stage malware as WAVESHAPER.V2, an updated backdoor linked to UNC1069 earlier activity. The C2 domain calltan.com was also linked to prior DPRK binary usage per Volexity researchers.

MITRE ATT&CK techniques used in TL-2026-0311

defense-evasion

T1027 Obfuscated Files or Information; T1036 Masquerading; T1070 Indicator Removal

exfiltration

T1041 Exfiltration Over C2 Channel

Privilege Escalation

T1055 Process Injection

discovery

T1057 Process Discovery; T1082 System Information Discovery; T1083 File and Directory Discovery

execution

T1059 Command and Scripting Interpreter

command-and-control

T1071 Application Layer Protocol; T1105 Ingress Tool Transfer; T1571 Non-Standard Port

Command and Control

T1132.001 Data Encoding

initial-access

T1195 Supply Chain Compromise

credential-access

T1528 Steal Application Access Token; T1555 Credentials from Password Stores

privilege-escalation

T1546 Event Triggered Execution

persistence

T1547 Boot or Logon Autostart Execution

defense-impairment

T1553 Subvert Trust Controls

Defense Evasion

T1564.001 Hide Artifacts

Initial Access

T1566.002 Phishing

resource-development

T1585 Establish Accounts; T1588 Obtain Capabilities

Affected products and versions in Axios npm Supply Chain Compromise by Sapphire Sleet (DPRK)

  • axios — axios
    Vulnerable versions: 1.14.1; 0.30.4
    Fixed in: 1.14.2; 0.30.3
  • npm — plain-crypto-js
    Vulnerable versions: 4.2.1
  • npm — @shadanai/openclaw
    Vulnerable versions: 2026.3.28-2; 2026.3.28-3; 2026.3.31-1; 2026.3.31-2
  • npm — @qqbrowser/openclaw-qbot
    Vulnerable versions: 0.0.130

Remediation for Axios npm Supply Chain Compromise by Sapphire Sleet (DPRK)

Patches

  • Upgrade to axios@1.14.2 or later (clean release)
  • Pin axios version in package.json with exact version (no ^ or ~ prefix)
  • Add overrides in package.json to prevent transitive resolution of plain-crypto-js

Immediate actions

  • Audit all lockfiles for axios versions 1.14.1 or 0.30.4 and plain-crypto-js references
  • Downgrade to safe versions: axios@1.14.0 (latest) or axios@0.30.3 (legacy)
  • Delete node_modules/plain-crypto-js from all environments
  • Block C2 domain sfrclak.com, callnrwise.com, calltan.com and IP 142.11.206.73 at network perimeter
  • Hunt for RAT artifacts: /Library/Caches/com.apple.act.mond (macOS), %PROGRAMDATA%\wt.exe (Windows), /tmp/ld.py (Linux)
  • Monitor outbound connections to port 8000 and callback URLs
  • Assume credential compromise if malicious versions executed — rotate ALL secrets, API keys, npm tokens, SSH keys, cloud credentials immediately

Workarounds

  • Run npm ci --ignore-scripts to prevent postinstall hook execution
  • Use npm overrides to force safe axios version across all transitive dependencies
  • Rebuild affected systems from known-good state if RAT artifacts detected

Longer-term hardening

  • Implement npm package pinning and integrity verification in all CI/CD pipelines
  • Deploy EDR with behavioral detection for postinstall hook execution monitoring
  • Enforce npm install --ignore-scripts in CI/CD and review postinstall hooks manually
  • Implement software composition analysis (SCA) tools to detect phantom dependencies
  • Add npm audit and lockfile integrity checks to CI/CD gates
  • Monitor for shell profile modifications (.bashrc, .zshrc) in developer environments
  • Review and rotate all long-lived npm access tokens; prefer short-lived OIDC tokens

Weaknesses (CWE) in Axios npm Supply Chain Compromise by Sapphire Sleet (DPRK)

CWE-506, CWE-829

Timeline of Axios npm Supply Chain Compromise by Sapphire Sleet (DPRK)

  • Per axios's post-mortem, the operation actually began roughly two weeks before the malicious publish with a targeted social-engineering campaign that delivered RAT malware to lead maintainer jasonsaayman's personal computer — the true initial-access vector, later used to hijack npm publishing credentials.
  • TeamPCP (potential initial access broker) begins compromising open-source projects including Trivy, KICS, LiteLLM, and Telnyx over a 9-day window
  • Related malicious packages @shadanai/openclaw versions 2026.3.28-2 and 2026.3.28-3 published to npm, indicating pre-staging of infrastructure
  • Malicious plain-crypto-js@4.2.1 published at 23:59:12 UTC containing postinstall hook dropper (setup.js) with dual-layer XOR obfuscation
  • Clean decoy version plain-crypto-js@4.2.0 published by nrwise@proton.me account approximately 18 hours before the malicious payload, establishing package legitimacy
  • Axios maintainer jasonsaayman npm account compromised via stolen long-lived access token; account email changed to ifstap@proton.me
  • plain-crypto-js was removed from npm at 03:29 UTC, roughly 14 minutes after the backdoored axios versions themselves were pulled.
  • An axios collaborator opened a deprecation PR and contacted npm directly at 01:38 UTC to force removal of the malicious releases, ahead of the eventual takedown.
  • Bitdefender Advanced Threat Control (ATC) recorded its first detection of the backdoored axios@1.14.1 at 00:27 UTC, roughly 6 minutes after publication.
  • Malicious Axios versions removed from npm registry at approximately 03:15 UTC after ~3 hour exposure window; 135+ endpoints observed contacting C2 per Huntress
  • Socket detects trojanized package within 6 minutes of publication; StepSecurity identifies both malicious versions; community disclosure begins
  • Backdoored axios@0.30.4 published at 01:00 UTC tagged as legacy, targeting the older Axios branch to maximize coverage
  • First infection observed at 00:23:27 UTC — just 89 seconds after malicious version publication; first Windows wt.exe execution at 00:58:05 UTC
  • Backdoored axios@1.14.1 published at 00:21:58 UTC tagged as latest, injecting phantom dependency plain-crypto-js@^4.2.1
  • Comprehensive technical analyses published by Wiz, Huntress, SANS, Snyk, Socket, and Aikido; Wiz reports 3% execution rate across affected environments
  • Microsoft Threat Intelligence attributes attack to Sapphire Sleet (DPRK); Google TIG independently attributes to UNC1069 with WAVESHAPER.V2 backdoor identification
  • As of 2026-05-29, the specific incident is contained: malicious axios 1.14.1/0.30.4 and plain-crypto-js@4.2.1 were pulled from npm within ~3 hours on Mar 31 and clean releases shipped. But attributed actor Sapphire Sleet/UNC1069 stays highly active (164 domains blocked Feb-Apr, 1,700+ malicious packages), so the supply-chain threat persists.

Update history for TL-2026-0311

Sources cited for Axios npm Supply Chain Compromise by Sapphire Sleet (DPRK)

Threats related to Axios npm Supply Chain Compromise by Sapphire Sleet (DPRK)

Detection coverage for TL-2026-0311

As of 2026-08-23, Threadlinqs Intelligence publishes 9 detection rule(s) for TL-2026-0311 across Splunk SPL, Microsoft KQL and Sigma, covering 33 indicator(s) of compromise. The whole corpus is readable without an account; a free account unlocks full detection query text in Splunk SPL, Microsoft KQL and Sigma; paid tiers add raw indicator values, correlation and the MCP server. Threadlinqs MCP server · View plans.

Further reading

Threadlinqs Intelligence — Real-Time Threat Detection Platform

[ 0 threats ] [ 0 det ] [ CRIT: 0 ] [ HIGH: 0 ]
// threat_feed
$ sort --newest
Showing all threats

Latest Threats