Node Malware / EvilAI
Node Malware
Node.js is commonly used to deploy stealers on devices. Often, these incidents include WebView2 applications bundled into InnoSetup installers. These installers use custom scheduled task XML configurations to deploy tasks that run malcious Node.js scripts on the host device. Also referred to as EvilAI - TrendMicro
The linked article does a great job of breaking these down. They’re essentially .net assemblies that use WebView2 and AI-generated “web applications” (read vibe-coded html pages). These applications are bundled into an InnoSetup installer with node and a malicious script. When the installer runs, it sets up a scheduled task to execute the node script. The user only sees the intended “legitimate” AI web app get installed.
I did some analysis on a couple of these, but honestly, they aren’t worth posting about. If you want to see analysis, check out Luke Acha’s posts about it. All the EvilAI samples are essentially the same, with different vibe-coded apps.
Hunting Query
This was adapted to be more language agnostic. Basically, all observed node exeutions followed the pattern on C:\Users<users>\AppData\Local\Programs<sample>\node.exe -> C:\Users<users>\AppData\Local\Programs<sample><script>.js.
Command Line="*AppData\Local\Programs*node.exe*AppData\Local\Programs*.js*" | table([time, Computer, Event, User, File Path, File Name, Command Line, SHA256], limit=20000)
This query finds all command line fields that match node.exe executions targeting scripts in AppData\Local\Programs.
Removal Script
$ErrorActionPreference = "SilentlyContinue"
$files = @("AllManualsReader","ManualReaderPro","ClassicSudoku","OpenMyManual","TotalUserManuals","JustAskJacky","ManualsHQ")
$users = (Get-item C:\Users\*).Name
foreach($user in $users){
$path = "C:\Users\$user\Downloads"
$apppath = "C:\Users\$user\AppData\Local\Programs"
if((Test-Path $path) -And (Test-Path $apppath)){
foreach($file in $files){
Write-Host "Removing $path\$file matches"
Get-ChildItem $path | ? Name -match $file | Remove-Item # remove from downloads
Write-Host "Removing $apppath\$file matches"
Get-ChildItem $apppath | ? Name -match $file | Remove-Item -force -recurse # should delete appdata folders probably
}
}
}
$tasks = Get-CimInstance -Namespace Root/Microsoft/Windows/TaskScheduler -ClassName MSFT_ScheduledTask
foreach($task in $tasks){
if($task.Actions.Arguments -match "node.exe"){
Write-Host "Unregistering task: $($task.TaskName)"
Unregister-ScheduledTask -TaskName $task.TaskName -Confirm:$false
}
}
This is a simple script that finds all the related file names from the given file array. It then attempts to delete them out of the Downloads and AppData\Local\Programs directories. It will also try and find the scheduled task that gets created. Keep in mind, this will delete all scheduled tasks that launch node. For my use, this worked fine for most infections.
Known IOCs
These are known samples that have been identified in the environment.
ManualReaderPro
IOC | Type | Description |
---|---|---|
0ABD1E39E17FA99366C8F1CC9171730867B6E86F6362B0492A090170F0305E55 | SHA256 | manualreaderpro.exe - InnoSetup installer |
167359B715610003752CBC89B122A6DF97E501304CB4A1EE94A6E75EBF51D6D6 | SHA256 | 24c92c24-5c4e-451a-8885-9509dc69ab38.js - Node Malware |
EC3487B0C87A072D9A730CB7AD6671FC1C9B983F26EF1F9CE66B9BD718FE92E9 | SHA256 | ManualReaderPro.exe - Unpacked Application |
api.cjby76nlcynrc4jvrb.com | Domain | API endpoint called by Node malware |
OpenMyManual
IOC | Type | Description |
---|---|---|
A0DAE9B551026295575DCF4B1F668069B8FE8119458E792E8293299A74E79436 | SHA256 | OpenMyManual.exe - InnoSetup installer |
822F5DCFE7350D259594D92128BA9FC2B7620AA33B571D8AF8A87945D8909026 | SHA256 | licensekey.js - Node Malware |
33A9D45E2D549B81718593134E3EE3CB1CFD3A38A8BBDE3C62A7062D2015D6BD | SHA256 | OpenMyManual.exe - Unpacked Application |
api.pyej17uw09d1bqlndg.com | Domain | API endpoint called by Node malware |
TotalUserManuals
IOC | Type | Description |
---|---|---|
94DC4138BFABF6A3E7CEFFFC5F5062FE0AC31384BAE4AD78F27557DDB29F6EAE | SHA256 | TotalUserManuals.exe -InnoSetup installer |
BCC9EBCE78FDBB1271FF1A2E0DEF82EC87D6E964A18293E82EC0CDD12856E66B | SHA256 | script.js - Node Malware |
B34643B3CA2636195B650E47BFE117FB53FFECF66CD4EA8EB428797D531AECBE | SHA256 | TotalUserManuals.exe - Unpacked Application |
get.latest-manuals.com | Domain | API endpoint called by Node malware |
AllManualsReader
IOC | Type | Description |
---|---|---|
B09FD02E58AFD99F7EE8B00C604319D5E83CFA63819B6DD56568FBF4DBCE528A | SHA256 | AllManualsReader_oc.exe - InnoSetup installer |
25BCCBE33F9EB7769061033D8C630E325ACD5FE3EB2ABCB40EADDB56AB9F242D | SHA256 | 2d4d7602-8032-4207-a03f-be08e68d1094.js - Node Malware |
44AD5554FE91BAE93CD6242E75D2AD73BC7F52A2547B1601AD0A77E4B803D433 | SHA256 | AllManualsReader.exe - Unpacked Application |
api.k2ioeasm874fnacr9x.com | Domain | API endpoint called by Node malware |
ClassicSudoku
IOC | Type | Description |
---|---|---|
A7FBBB0393E36BC70B6EAFB967A3B11A65C442090DA1840364886B984784135C | SHA256 | ClassicSudoku_oc.exe - InnoSetup installer |
DB08B3742A8FB499D8F18F1C03D88CD6E9AE92A70E5B1441935A1891A48B5E0F | SHA256 | 2edd5db0-15e8-4e96-b8a5-ba0e0562023e.js - Node Malware |
B9C9898BE3A04BDE91863137C784F0C76ED031EE6DB1501C17D2128681B4412F | SHA256 | ClassicSudoku.exe - Unpacked Application |
api.rmr6qd1zy9hyafyzk2.com | Domain | API endpoint called by Node malware |
JustAskJacky
IOC | Type | Description |
---|---|---|
8ECD3C8C126BE7128BF654456D171284F03E4F212C27E1B33F875B8907A7BC65 | SHA256 | justaskjacky.exe - InnoSetup installer |
DD8502622EAA4E3798F4848CFE81C06ED0DFFD7CB0A62C7AB6C7124D5B07BB04 | SHA256 | c99f5c91-8d40-4172-887d-fa0f2519a694.js - Node Malware |
532F78CEB001D9F081607F2CF6740635BB6BA2E87ECACA89A149E82C26F28034 | SHA256 | JustAskJacky.exe - Unpacked Application |
api.vtqgo0729ilnmyxs9q.com | Domain | API endpoint called by Node malware |