Threat Intelligence
Targeted Supply Chain Compromise of Axios NPM Distribution (UNC1069)
While routine CI/CD pipelines ran and developer machines updated their dependencies, a state-sponsored actor had already poisoned one of the most trusted libraries in modern software. The Axios compromise was not a test; it was a pre-positioned strike against the infrastructure of the internet itself.
This report details the technical mechanics, adversary profile, and remediation guidance for the Axios npm supply chain compromise of March 31, 2026. The attack window lasted just under three hours; exposure occurred in an estimated 3% of affected environments. Organizations that run npm install or trigger CI/CD pipelines within that window must assume full environment compromise.
On March 31, 2026, the global software supply chain experienced a high-criticality event involving the compromise of the Axios npm package, a ubiquitous JavaScript HTTP client, with 100 million weekly downloads, present in approximately 80% of cloud environments. The actor published malicious versions 1.14.1 and 0.30.4, embedding the WAVESHAPER.V2 Remote Access Trojan via a multi-stage dropper named SILKBELL. The campaign is attributed with high confidence to UNC1069, a North Korea-nexus actor targeting cloud credentials, SSH keys, and Kubernetes tokens for long-term espionage. The exposure window was 00:21–03:20 UTC. Organizations that installed the affected versions during that period must treat their environment as fully compromised.
The Attack That Moved Faster Than Defenders Could React
Supply chain attacks targeting pervasive libraries are a force multiplier for state-sponsored actors. By poisoning root dependency, adversaries bypass perimeter defenses and land inside developer workstations, CI/CD runners, and production build environments in a single stroke.
Axios is not a niche library. It is foundational JavaScript infrastructure; an HTTP client downloaded over 100 million times per week and present in approximately 80% of cloud environments. Compromising its distribution channel was a calculated choice: maximum blast radius, minimum effort.
The attacker also demonstrated a horizontal spread. Researchers identified secondary poisoned packages, @shadanai/openclaw and @qqbrowser/openclaw-qbot, that bundled the malicious Axios versions, extending the campaign’s reach beyond direct Axios consumers.
Adversary Operations Group Analyst Note: The C2 URL path /6202033 is the attack date (3-30-2026) reversed, a signature Easter egg frequently observed in sophisticated APT campaigns to mark campaign iterations. This level of deliberate craft is consistent with UNC1069’s known tradecraft.
Incident Timeline (UTC), March 30–31, 2026
| TIME (UTC) | EVENT |
| March 30, 05:57 | Actor publishes plain-crypto-js@4.2.0, a clean decoy to build benign registry reputation. |
| March 30, 23:59 | plain-crypto-js updated to 4.2.1, introducing the SILKBELL (setup.js) dropper. |
| March 31, 00:21 | Compromised jasonsaayman account publishes axios@1.14.1. Attack window opens. |
| March 31, 01:00 | Legacy branch targeted: axios@0.30.4 published to catch organisations pinned to older versions. |
| March 31, 01:50 | Initial security advisories filed; coordinated disclosure begins. |
| March 31, 03:20 | Malicious versions removed from registry. Window closes, but execution had already occurred. |
Technical Analysis: The Multi-Stage Infection Chain
The compromise succeeded despite the Axios project’s use of OIDC (OpenID Connect) Trusted Publishing. The attacker exploited a critical fallback vulnerability: while the GitHub Actions workflow was configured for OIDC, it still passed a long-lived NPM_TOKEN environment variable. npm defaults to the token if present, allowing the actor, who had stolen this secret, to bypass OIDC provenance entirely.
The actor also performed a full account takeover (ATO), changing the maintainer’s registered email to ifstap@proton.me to lock out the legitimate developer before publishing.
Stage 1: SILKBELL (setup.js), Dropper Logic
The plain-crypto-js dependency triggered a post-install hook that executed setup.js. SILKBELL employed a two-layer obfuscation scheme: string reversal combined with Base64 encoding, and an XOR cipher using a position-dependent index formula (7 × i² % 10) keyed to OrDeR_7077.
To evade forensic analysis, SILKBELL performed a manifest swap, replacing the malicious package.json with a clean decoy (package.md), then deleted itself via fs.unlink immediately after staging the second-stage payload. From npm install to full system compromise: approximately 15 seconds.
Stage 2: Platform-Specific Delivery
The dropper identified the host OS and pulled the appropriate payload from sfrclak[.]com:8000/6202033. Each delivery path was tailored to exploit native OS trust mechanisms:
- Windows: VBScript downloads the second stage via curl. PowerShell is copied to %PROGRAMDATA%\wt.exe, masquerading as Windows Terminal, to bypass process monitoring. The .ps1 RAT is then executed.
- macOS: A Mach-O Universal Binary is dropped to /Library/Caches/com.apple.act.mond. osascript executes AppleScript for execution and persistence.
- Linux: A Python-based binary is dropped to a hidden file in /tmp/ using a random 6-character string (e.g., /tmp/.XXXXXX).
Malware Deep Dive: WAVESHAPER.V2
WAVESHAPER.V2 is a unified cross-platform implant. While implemented in different languages for per-OS compatibility, the operational logic, beaconing, session management, command set, and C2 transport, is identical across all platforms.
Platform Implementation
| FEATURE | WINDOWS | MACOS | LINUX |
| Language | PowerShell | C++ (Mach-O Universal) | Python |
| Execution | Copied wt.exe | Native Universal Binary | Python Interpreter |
| Persistence | Registry Run Key | osascript Logic | Transient (/tmp/) |
| Evasion | Renamed Interpreter | codesign Self-signing | Hidden Temp Files |
Core RAT capabilities:
- Beaconing: Hardcoded 60-second heartbeat cadence to C2.
- Session Management: Generates a 16-character random alphanumeric session UID per execution.
- C2 Transport: HTTP POST with base64-encoded JSON bodies.
- Command Set: kill (termination), rundir (directory enumeration), runscript (arbitrary script execution), peinject (drop and execute additional binaries).
- High-Fidelity Indicator: All platforms use the anachronistic User-Agent: mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0).
The macOS variant’s ability to self-sign injected payloads via the native codesign utility indicates a sophisticated understanding of OS-level trust controls. This technique is specifically designed to bypass Gatekeeper-style protections, allowing arbitrary code to appear as legitimately signed software. This capability marks a meaningful step forward in WAVESHAPER’s evasion sophistication.
Adversary Profile: UNC1069 (North Korea-Nexus)
Thrive’s Advesary Operations Group (AOG) within the Cybersecurity Incident Response Team (CIRT) attributes this campaign with High Confidence to UNC1069, a North Korea-nexus actor. Attribution rests on two pillars: the evolution of the WAVESHAPER backdoor (originally C++ for macOS/Linux, now expanded to a unified cross-platform JSON protocol) and infrastructure overlaps linking the C2 domain sfrclak[.]com to AstrillVPN nodes and specific IP ranges previously reserved for UNC1069 espionage operations.
UNC1069’s defining operational characteristic is its focus on silent credential harvesting and long-term access over immediate destruction or extortion. The stealthy self-cleanup of the Axios payloads, deleting the dropper and swapping the manifest, is consistent with this doctrine.
AOG Analyst Note, UNC1069 vs UNC6780 (TeamPCP): While this incident occurred near the same timeframe as campaigns by UNC6780 (TeamPCP), Thrive’s AOG distinguishes between the two. TeamPCP focuses on immediate extortion and CanisterWorm deployments. UNC1069 prioritizes silent credential harvesting and long-term access, evidenced here by the stealthy self-cleanup and the absence of ransomware or extortion demands.
Risk Assessment: Impact and Likelihood
The systemic risk of this incident is extreme. The 15-second window between npm install and full system compromise renders manual intervention impossible. If the affected versions were present in your environment during the exposure window, assume total compromise of every secret accessible to those processes.
Primary Impact Vectors
- Developer Workstations: Direct exfiltration of source code, SSH keys, and local secrets from engineer machines.
- CI/CD Pipelines: Compromise of environment variables, build secrets, cloud provider credentials, and signing keys embedded in runners.
- Production Containers: Images built during the 3-hour window using npm install (ignoring lockfiles) may have the RAT baked into actively running production environments.
Secret Harvesting Targets
UNC1069’s primary objective in this campaign was the collection of secret data.
| TARGET SECRET TYPE | RISK |
| SSH Private Keys | Critical, Immediate lateral movement capability |
| .env Files | Critical, Aggregated secrets across services |
| AWS / Azure / GCP Tokens | Critical, Full cloud environment takeover |
| Kubernetes Tokens | Critical, Container orchestration compromise |
| Cryptocurrency Wallets | High, Direct financial theft |
Detection and Mitigation Recommendations
Countering this campaign requires action across two horizons: immediate remediation for environments that may have been exposed and structural hardening to prevent recurrence.
Immediate Remediation
- Lockfile and Image Auditing: Scan all package-lock.json files and running container images for axios@1.14.1 or axios@0.30.4. Use grype or syft for container inspection. Images built during the 3-hour window using npm install (ignoring lockfiles) likely have the RAT baked in.
- Secret Rotation: Assume total compromise of any secret present in any environment where the affected versions are executed. Rotate cloud tokens (AWS, Azure, GCP), SSH keys, database credentials, and API tokens without exception.
- Cache Purge: Clear all local and shared npm, yarn, and pnpm caches to prevent accidental re-infection from cached malicious artifacts.
- Log Auditing: Search network logs for HTTP POST requests to the URI /6202033, bearing the User-Agent string mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0), and JSON body prefixes such as packages.npm.org/product1.
Hardening Measures
- Migrate Secrets: Use aws-vault or equivalent tools to move plaintext secrets from .env files into the OS keychain.
- Enforce OIDC-Only: Revoke all long-lived npm tokens. Mandate OIDC Trusted Publishing without legacy token fallback. The fallback mechanism was the precise vulnerability exploited in this campaign.
- Network Filtering: Implement strict egress monitoring for CI/CD runners, blocking non-standard ports (e.g., 8000) and unknown external IPs.
- Runtime Visibility: Extend EDR monitoring to cover Deno and non-standard JavaScript runtimes, a hardening lesson drawn from parallel Seedworm campaigns now relevant across the threat landscape.
Indicators of Compromise (IOCs)
Immediate Action Required: Ingest all indicators below into your SIEM and Threat Intelligence Platform immediately. Any network traffic to the C2 infrastructure or matching the IE8 User-Agent string must be treated as a critical, high-priority escalation requiring immediate incident response.
File Hashes (SHA-256 / SHA-1)
| ARTIFACT | TYPE | HASH |
| setup.js | SILKBELL Dropper | e10b1fa84f1d6481625f741b69892780140d4e0e7769e7491e5f4d894c2e0e09 |
| com.apple.act.mond | macOS RAT | 92ff08773995ebc8d55ec4b8e1a225d0d1e51efa4ef88b8849d0071230c9645a |
| 6202033.ps1 | Windows RAT | 617b67a8e1210e4fc87c92d1d1da45a2f311c08d26e89b12307cf583c900d101 |
| ld.py | Linux RAT | fcb81618bb15edfdedfb638b4c08a2af9cac9ecfa551af135a8402bf980375cf |
| axios@1.14.1 | Poisoned Package | SHA1: 2553649f232204966871cea80a5d0d6adc700ca |
| axios@0.30.4 | Poisoned Package | SHA1: d6f3f62fd3b9f5432f5782b62d8cfd5247d5ee71 |
Network Indicators
| TYPE | INDICATOR | DETAILS |
| Domain (Defanged) | sfrclak[.]com | Primary C2 |
| IP (Defanged) | 142.11.206[.]73 | Primary C2 |
| Domain (Defanged) | callnrwise[.]com | Actor Infrastructure |
| URL Pattern | http://sfrclak[.]com:8000/6202033 | Payload / C2 Path |
Host-Based Artifacts
| PATH / REGISTRY KEY | OS | DETAILS |
| %PROGRAMDATA%\wt.exe | Windows | Masqueraded PowerShell interpreter |
| %TEMP%\6202033.vbs | Windows | Stage-2 VBScript downloader |
| /tmp/.XXXXXX.scpt | macOS | Temporary AppleScript file |
| /Library/Caches/com.apple.act.mond | macOS | Masqueraded system daemon |
| HKCU\Software\Microsoft\Windows\CurrentVersion\Run\MicrosoftUpdate | Windows | Persistence registry key |
MITRE ATT&CK Mapping
| TACTIC | TECHNIQUE ID | TECHNIQUE NAME | BEHAVIOUR OBSERVED |
| Initial Access | T1195.002 | Supply Chain: Dependencies | Hijacking Axios npm distribution. |
| Execution | T1059.002 | AppleScript | macOS execution via osascript. |
| Persistence | T1547.001 | Registry Run Keys | MicrosoftUpdate run key (Windows). |
| Defense Evasion | T1070.004 | File Deletion | Dropper self-deletion and manifest swap. |
| Defense Evasion | T1553.002 | Code Signing | macOS self-signing of injected payloads. |
| Credential Access | T1552.001 | Unsecured Credentials: Priv Keys | SSH keys and cloud token harvesting. |
| C2 | T1071.001 | Web Protocol | HTTP POST with spoofed IE8 User-Agent. |
Analyst Comment: The Identity-Only Trust Model Is Broken
The Axios compromise is a definitive case study in the failure of the “identity-only” trust model. While the industry has pushed for multi-factor authentication as a panacea, this incident proves that MFA on login is irrelevant if long-lived tokens remain active and unrotated. The adversary bypassed modern OIDC protections precisely because the ecosystem permitted a legacy token fallback. Thrive AOG maintains High Confidence that UNC1069 retains an unknown quantity of exfiltrated secrets from this campaign, which will likely fuel secondary breaches throughout the 2026 fiscal year. We strongly advise clients to move toward a “Zero-Trust Dependency” architecture where third-party packages are treated as untrusted code by default, regardless of the maintainer’s reputation. The next supply chain event is not a matter of if, but when.