MALFEX npm Supply-Chain Campaign: Overlord RAT, movinlike Stealer and function-flag Downloader
Executive Summary
Checkmarx documented MALFEX, a single-operator npm supply-chain campaign active since August 2023. Twelve packages were published and eight carry malware, delivering three payload paths to Windows hosts. As of 2026-10-01, function-flag, function-color and cdn-img-fetch were still installable, and function-flag and function-color carried no advisory. Lifetime downloads total 40,767, of which 37,419 are function-flag.
Path 1 (Overlord RAT): tlxbnhd, tldriver and mxdriver run npm preinstall and postinstall scripts that fetch a file served as a PNG from api.imghippo.com. It is really an IExpress self-extracting archive holding a signed AutoIt3 interpreter and an encrypted script, which decrypts to the Overlord RAT and hollows TapiUnattend.exe. Persistence is the scheduled task \Maiden running AutoIt3.exe h.a3x every five minutes from %LOCALAPPDATA%\ScopeSmart Technologies Inc\.
Path 2 (movinlike): native-runner to img-to-native to cdn-img-fetch runs on require() with no install hook, so --ignore-scripts does not stop it. A banner image from the cavecrew/proj GitHub repository hides an AES-encrypted Go downloader that fetches the Node.js stealer from 104.234.65.75. Path 3 (function-flag): a postinstall runs node example.js, which calls an ASCII-art function with the font Bloody and triggers a hidden download to %APPDATA%\node.exe.
This pack hunts behavior and operator infrastructure: AutoIt running .a3x scripts, the \Maiden task, TapiUnattend.exe execution, node_runtime_helper, executables running from the root of %APPDATA%, and the named hosts and IPs. Stock tools (AutoIt3.exe, node.exe, TapiUnattend.exe, explorer.exe) are detect-only throughout.
Defender priority: search every lockfile, registry proxy log and developer endpoint for the eight package names now (Section 7 and Playbook A), run Q1 to Q8 across Windows hosts, and null-route 104.234.65.75. If any of the packages ran on a Windows host, treat that host as compromised and rotate Discord, browser-saved and wallet credentials from a clean system.
Source Review & Web Hunter Notes
| Tier | Source | Key finding | Carry forward |
|---|---|---|---|
| T1 | Checkmarx Zero research, MALFEX three-payload report | Full package/version table, three attack paths, persistence details, per-version payload hosts, hash list, host artifacts, remediation | Yes (primary for every IOC) |
| T1 | CloudSEK, MALFEX postinstall campaign blog | Page returned only a partial summary (full report is a PDF that was not fetched). Corroborates package names, malfexteam2027, cavecrew, 104.234.65.75:700, imghippo payload URL, \Maiden task and ScopeSmart path | Partial (second source for those items only) |
| T2 | SecurityWeek (Ionut Arghire, 2026-10-06) | Corroborates 12 packages, 8 malicious, three still installable, function-flag over 37,000 downloads with no advisory, limited exposure | Yes (context, no IOCs) |
| T1 | Checkmarx Zero, targeted re-fetch of the same article | Snapshots three technique details the first rendering condensed out: the SmartScope.vbs "Wscript."+"Shell" concatenation, process hollowing with the parent spoofed as explorer.exe, and the 120-second img-to-native wait | Yes (behavioral claims only, no new indicator) |
| blocked | Hackread article on the Windows RAT | HTTP 403 to automated fetch. Nothing taken from it and it is not cited | No |
Decisions. Only indicators present in a saved snapshot ship as atomic IOCs. The full Discord webhook token and the Solana-resolved Overlord C2 addresses are not published in any fetched source and ship as labelled placeholders. The two-source rule for prevent actions is met only for 104.234.65.75 (Checkmarx and CloudSEK); every other row ships detect or hunt.
Hunt Brief & Attack Chain
Hypotheses
| ID | Hypothesis | Telemetry | Conf |
|---|---|---|---|
| H1 | A host that ran an Overlord loader shows AutoIt3.exe executing an .a3x script, usually from the ScopeSmart folder (Q1) | ProcessRollup2 | High |
| H2 | Persistence appears as a scheduled task named Maiden created through schtasks (Q2) | ProcessRollup2 | High |
| H3 | Overlord hollowing shows TapiUnattend.exe running, which is rare on endpoints (Q3) | ProcessRollup2 | Medium |
| H4 | The npm install stage runs the dropped installer gldriver_pre_core.exe or gldriver_pre_asset.exe (Q4) | ProcessRollup2 | High |
| H5 | The movinlike chain leaves node_runtime_helper.exe running and then contacts 104.234.65.75 (Q5, Q6) | ProcessRollup2, NetworkConnectIP4 | High |
| H6 | function-flag payloads run as executables directly under %APPDATA% (Q7) and contact the rotating payload hosts (Q6, Q8) | ProcessRollup2, DnsRequest, NetworkConnectIP4 | High |
| H7 | Known payload hashes execute on an endpoint (Q9) | ProcessRollup2 | High |
| H8 | node.exe is launched with example.js by a package postinstall (Q10) | ProcessRollup2 | Medium |
Attack chain
| Step | Behavior | Telemetry | Hunt angle |
|---|---|---|---|
| 1 | Developer or CI installs or requires a malicious package | Lockfiles, registry proxy | Section 7 package search |
| 2a | Path 1: pre/postinstall downloads the PNG from api.imghippo.com, saves gldriver_pre_core.exe or gldriver_pre_asset.exe, runs it | ProcessRollup2, DnsRequest | Q4, Q8 |
| 2b | Path 1: IExpress extracts signed AutoIt3.exe plus h.a3x to %LOCALAPPDATA%\ScopeSmart Technologies Inc\; AutoIt decrypts Overlord and hollows TapiUnattend.exe with a spoofed explorer.exe parent | ProcessRollup2 | Q1, Q3 |
| 2c | Path 1: task \Maiden every 5 minutes; SmartScope.vbs; C2 read from Solana transactions | ProcessRollup2 | Q1, Q2 |
| 3a | Path 2: require() loads cdn-img-fetch, which downloads banner.png or banner.jpg from raw.githubusercontent.com/cavecrew/proj; img-to-native AES-decrypts the appended payload | Network (legitimate host) | Section 7 proxy search |
| 3b | Path 2: node_runtime_helper.exe fetches setup.exe (movinlike) from 104.234.65.75:700; movinlike steals data and posts 25MB chunks to a Discord webhook | ProcessRollup2, NetworkConnectIP4 | Q5, Q6, Q9 |
| 4 | Path 3: node example.js, "Bloody" font call, hidden download to %APPDATA%\node.exe, hidden window | ProcessRollup2, DnsRequest, NetworkConnectIP4 | Q6, Q7, Q8, Q10 |
Consolidated IOC Table
Malicious packages (block at registry proxy)
| Package | Malicious versions | Status 2026-10-01 | Path |
|---|---|---|---|
| function-flag | 1.7.3, 4.0.0, 3.0.0, 2.3.5 to 2.3.9 | Live, no advisory | 3 |
| function-color | 1.7.3, 1.0.0 | Live, no advisory | 3 |
| cdn-img-fetch | 1.0.0 to 1.0.3 | Live, partial advisory | 2 |
| img-to-native | 1.0.0 to 1.0.3 | Seized by npm | 2 |
| native-runner | 1.0.0 to 1.0.3 | Seized by npm | 2 |
| tlxbnhd | 0.0.1 | Unpublished | 1 |
| tldriver | 0.0.1 | Unpublished | 1 |
| mxdriver | 0.0.1, 0.0.2 | Unpublished | 1 |
Network and host indicators
| Type | Value | Confidence | Action | Context |
|---|---|---|---|---|
| IPv4 | 104.234.65.75 | High (2 sources) | prevent | movinlike setup.exe host, port 700 and 80 path |
| IPv4 | 45.89.30.194 | High (1 source) | detect | function-flag 2.3.8, 2.3.9 payloads |
| IPv4 | 191.96.81.101 | High (1 source) | detect | function-flag 2.3.7 payload |
| IPv4 | 51.137.158.178 | High (1 source) | detect | function-flag 2.3.5 /download |
| Domain | cdnzona.discloud.app | High (1 source) | detect | function-flag 1.7.3 node.exe |
| Domain | apicdn.squareweb.app | High (1 source) | detect | function-flag 4.0.0 svchost.exe |
| Domain | apizona.onrender.com | High (1 source) | detect | function-flag 2.3.6 |
| Domain | bypasscdn.onrender.com | Medium (1 source) | detect | function-flag 3.0.0 Discord proxy |
| Domain | api.imghippo.com | Medium | hunt | Legitimate image host abused for the Overlord loader; hunt on npm/node context, never block outright |
| URL | raw.githubusercontent.com/cavecrew/proj/main/banner.png and banner.jpg | High (2 sources for account) | detect | Legitimate host; match the cavecrew path only |
| Task | \Maiden | High (2 sources) | detect | Overlord persistence; Author Welcome, Comment Wichita |
| Path | %LOCALAPPDATA%\ScopeSmart Technologies Inc\ | High (2 sources) | detect | AutoIt3.exe, h.a3x, SmartScope.vbs |
| File | %APPDATA%\Microsoft\Windows\node_runtime_helper.exe, %APPDATA%\node.exe, %TEMP%\._cif_data, gldriver_pre_core.exe, gldriver_pre_asset.exe | High (1 source) | detect | Host artifacts |
| Key | malfexteam2027 (AES key), operator email corpmalfex@gmail.com, GitHub cavecrew | High | enrich | Attribution context, not a block rule |
AutoIt3.exe (signed, legitimate), node.exe, TapiUnattend.exe and explorer.exe are stock tools or Windows binaries. They are detect-only everywhere in this pack. Payload hashes are listed in Section 10 and ship detect, because each has a single source.
Affected Surface & Telemetry Matrix
| Surface | Telemetry | Priority | Gap risk |
|---|---|---|---|
| Windows developer workstations | ProcessRollup2, NetworkConnectIP4, DnsRequest | High | Low |
| Windows CI/build agents | Same, often a different Falcon host group | High | Medium: ephemeral runners may be short-lived |
| Registry proxy / artifact manager | Package request logs | High | Medium: not Falcon telemetry |
| Lockfiles in source control | Repository search | Medium | Low |
| macOS and Linux | n/a | Low | Payloads fail silently off Windows (APPDATA guard); Path 1 scripts run but the payload only works on Windows |
ATT&CK Mapping
| Tactic | Technique | Observed behavior | Query / control |
|---|---|---|---|
| Initial Access | T1195.002 Compromise Software Supply Chain | Malicious npm packages | Section 7, Playbook A, M1051 |
| Execution | T1059.007 JavaScript, T1059.005 Visual Basic | postinstall scripts, example.js, SmartScope.vbs | Q10 |
| Execution | T1204.005 Malicious Library | Install or require() of operator packages | Q4, Q10 |
| Persistence | T1053.005 Scheduled Task | \Maiden every 5 minutes | Q2 |
| Defense Evasion | T1055.012 Process Hollowing, T1134.004 Parent PID Spoofing | Overlord into TapiUnattend.exe, parent explorer.exe | Q3 |
| Defense Evasion | T1027 Obfuscated Files, T1027.003 Steganography, T1140 Deobfuscate/Decode | Space-padded code, payload after PNG end marker, XOR/RC4/LZNT1, AES | Section 15 gap |
| Defense Evasion | T1218 / T1036 Masquerading | PNG that is an IExpress archive; svchost.exe and node.exe names in %APPDATA% | Q4, Q7 |
| Credential Access | T1555.003 Credentials from Web Browsers, T1528 Steal Application Access Token | Browser credentials, Discord tokens | Q5, Q6 |
| Collection | T1056.001 Keylogging, T1113 Screen Capture, T1115 Clipboard Data | Overlord capabilities | Q1, Q3 |
| Command and Control | T1105 Ingress Tool Transfer, T1102 Web Service | Payloads from Discord proxies, GitHub raw, imghippo; Solana-hosted C2 addresses | Q6, Q8 |
| Exfiltration | T1567 Exfiltration Over Web Service | 25MB chunks to a Discord webhook | Q6 (partial) |
Native Audit-Log Hunts
Run these outside Falcon. They come from the Checkmarx detection guidance.
Dependency and lockfile search
npm ls function-flag function-color cdn-img-fetch img-to-native native-runner tlxbnhd tldriver mxdriver --all rg -n 'function-flag|function-color|cdn-img-fetch|img-to-native|native-runner|tlxbnhd|tldriver|mxdriver' package-lock.json npm-shrinkwrap.json pnpm-lock.yaml yarn.lock
Windows host indicators (PowerShell)
Test-Path "$env:LOCALAPPDATA\ScopeSmart Technologies Inc" Test-Path "$env:APPDATA\Microsoft\Windows\node_runtime_helper.exe" Test-Path "$env:APPDATA\node.exe" Test-Path "$env:TEMP\._cif_data" schtasks /query /tn "\Maiden" /fo LIST /v
Registry proxy and web gateway
- Search proxy and artifact-manager logs for requests to the eight package names, including transitive pulls.
- Search web gateway logs for
raw.githubusercontent.com/cavecrew/and forapi.imghippo.comrequests that come from node or npm user agents. - Check for any user agent or process that downloaded a "PNG" and then ran an executable of the same download.
CrowdStrike LogScale CQL Hunt Queries
Looks for: AutoIt3.exe started with an .a3x argument, the exact form of the Overlord persistence command (AutoIt3.exe h.a3x) and the loader run. FP: admins who legitimately run compiled AutoIt scripts. AutoIt3.exe is a signed legitimate tool, so this is detect-only.
// HUNT: AutoIt3.exe running an .a3x script (MALFEX Overlord loader) // MITRE: T1059, T1053.005, T1055.012 // CONF: high // FP: medium // COST: low // REQUIRES: ProcessRollup2 on Windows // FALSE POSITIVES: IT automation that runs .a3x scripts // TUNING: scope to unmanaged paths by keeping ImageFileName matching ScopeSmart, or allowlist your own AutoIt deployment folder; any AutoIt3.exe under a user profile on a developer host deserves review #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | event_platform=Win | FileName=/^AutoIt3(_x64)?\.exe$/i | CommandLine=/\.a3x/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData])
Looks for: schtasks.exe creating or changing a task whose name contains Maiden, or whose action references an .a3x script or the ScopeSmart folder.
// HUNT: schtasks creating the Maiden persistence task (MALFEX Overlord) // MITRE: T1053.005 // CONF: high // FP: low // COST: low // REQUIRES: ProcessRollup2 on Windows // FALSE POSITIVES: an unrelated internal task that is also named Maiden (verify the action) #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | event_platform=Win | FileName=/^schtasks\.exe$/i | CommandLine=/Maiden|\.a3x|ScopeSmart/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine])
Looks for: TapiUnattend.exe, a stock Windows binary that is rarely run on endpoints. Overlord is injected into it by process hollowing with a spoofed explorer.exe parent. Detect-only: the binary is legitimate, so the signal is its unusual execution, not its name or hash.
// HUNT: TapiUnattend.exe execution (possible Overlord hollowing target) // MITRE: T1055.012, T1134.004 // CONF: medium // FP: low // COST: low // REQUIRES: ProcessRollup2 on Windows // FALSE POSITIVES: Windows telephony unattended setup; rare outside OS setup and repair #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | event_platform=Win | FileName=/^TapiUnattend\.exe$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData])
Looks for: Execution of gldriver_pre_core.exe or gldriver_pre_asset.exe, the names the Overlord loader PNG is saved as before launch.
// HUNT: gldriver_pre_core / gldriver_pre_asset executed (MALFEX Overlord loader) // MITRE: T1204.005, T1036 // CONF: high // FP: low // COST: low // REQUIRES: ProcessRollup2 on Windows // FALSE POSITIVES: none expected #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | event_platform=Win | FileName=/^gldriver_pre_(core|asset)(\.exe)?$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData])
Looks for: A process named node_runtime_helper, the Go downloader that img-to-native writes under %APPDATA%\Microsoft\Windows\ and that fetches setup.exe (movinlike).
// HUNT: node_runtime_helper.exe running (MALFEX movinlike chain) // MITRE: T1105, T1204.005 // CONF: high // FP: low // COST: low // REQUIRES: ProcessRollup2 on Windows // FALSE POSITIVES: none known; the name is specific to this chain in the source report #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | event_platform=Win | FileName=/^node_runtime_helper(\.exe)?$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData])
Looks for: Outbound IPv4 connections to the four operator-controlled addresses named in the Checkmarx report (movinlike host and three function-flag payload hosts).
// HUNT: connections to MALFEX operator IPs // MITRE: T1105, T1071.001 // CONF: high // FP: low // COST: low // REQUIRES: NetworkConnectIP4 on Windows // FALSE POSITIVES: IP reassignment over time; check the first-seen date against the 2026-09 reporting window #event_simpleName=NetworkConnectIP4 | in(field=RemoteAddressIP4, values=["104.234.65.75", "45.89.30.194", "191.96.81.101", "51.137.158.178"]) | table([@timestamp, aid, ComputerName, UserName, ContextBaseFileName, RemoteAddressIP4, RemotePort, LocalAddressIP4])
Looks for: node.exe, svchost.exe, nocry.exe or malfex.exe running directly from AppData\Roaming with no subfolder, the location function-flag writes its payload. node.exe and svchost.exe are legitimate names; the abnormal path is the signal. FP: portable Node.js installs unpacked into Roaming.
// HUNT: payload executables at the root of AppData Roaming (MALFEX function-flag) // MITRE: T1105, T1036.005 // CONF: medium // FP: medium // COST: low // REQUIRES: ProcessRollup2 on Windows // FALSE POSITIVES: portable Node.js copy placed in Roaming by a developer // TUNING: svchost.exe, nocry.exe and malfex.exe in this location are near-certain malicious; for node.exe exclude hosts where your standard dev image places Node there, and review the parent process #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | event_platform=Win | FileName=/^(node|svchost|nocry|malfex)\.exe$/i | ImageFileName=/\\AppData\\Roaming\\(node|svchost|nocry|malfex)\.exe$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData])
Looks for: DNS requests for the function-flag payload hosts, plus api.imghippo.com when the requesting process is node or npm. api.imghippo.com is a legitimate image host, so it is only matched in a node context.
// HUNT: DNS lookups for MALFEX payload hosts, imghippo from node only // MITRE: T1105, T1102 // CONF: high // FP: low // COST: low // REQUIRES: DnsRequest on Windows // FALSE POSITIVES: developers who legitimately use imghippo through a node tool #event_simpleName=DnsRequest | DomainName=/^(cdnzona\.discloud\.app|apicdn\.squareweb\.app|apizona\.onrender\.com|bypasscdn\.onrender\.com|api\.imghippo\.com)$/i | case { DomainName=/imghippo/i ContextBaseFileName=/^(node|npm|npx)(\.exe)?$/i | hit := "imghippo-from-node"; DomainName!=/imghippo/i | hit := "payload-host"; * | hit := "ignore" } | hit!="ignore" | table([@timestamp, aid, ComputerName, UserName, ContextBaseFileName, DomainName, hit])
Looks for: Process executions whose SHA-256 matches the loader, the decoded Overlord and all five published movinlike builds from Checkmarx. movinlike was rebuilt repeatedly in late September 2026, so all four dated samples are included alongside the main Node.js build. The signed AutoIt3.exe hash is deliberately left out of this query, because that binary is the legitimate interpreter; it is hunted by behavior in Q1.
// HUNT: MALFEX payload hashes executing // MITRE: T1204.005 // CONF: high // FP: low // COST: low // REQUIRES: ProcessRollup2 SHA256HashData on Windows // FALSE POSITIVES: none expected #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | in(field=SHA256HashData, values=["9aba4685af072231aee049e1a5e294965580001b364d7d00152d84fcec1ce793", "2989244eac2a4bc7a13a09dec003e5c05ef7c80b2afe0958ce25042d5b804210", "c9c374afba4658dff15f71801e88c4d199c91dd2622d72c7b0c55577c8f73437", "889e13e227bc2b762178b88c35c691db3256e72be64d92ff1f381d29a2789849", "e7f86f6cc4380db66d333eaf6f7dfc2c12d232c2bcd526434681245dea25efa4", "ff826d2778ea1d40ce8ebfd9d66ecc86d4c811f5654b8a466a7e220ebbbc6807", "2f268ca76ab27971d8b16bd4ded26e1f9cd3d4460b894af2d4bdf89f0ab7ec4b"]) | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, SHA256HashData])
Looks for: node.exe started with example.js by a package manager shell, the function-flag postinstall that triggers the Bloody ASCII-art call. FP: any package that ships a harmless example.js.
// HUNT: node running example.js from a package postinstall (MALFEX function-flag) // MITRE: T1059.007, T1204.005 // CONF: medium // FP: medium // COST: low // REQUIRES: ProcessRollup2 on Windows // FALSE POSITIVES: legitimate packages that run their own example.js // TUNING: require the CommandLine to include node_modules and function-flag or function-color, or join Q7 on the same aid within 10 minutes; exclude known internal package names #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | event_platform=Win | FileName=/^node(\.exe)?$/i | CommandLine=/example\.js/i | ParentBaseFileName=/^(cmd|powershell|pwsh|npm|node)(\.exe)?$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine])
CrowdStrike Custom IOA Recommendations
Q1 to Q5 are behavior-pinned and survive infrastructure rotation, so they are IOA candidates. Q7 and Q10 stay Investigate-only until baselined. No IOA blocks a stock tool by name or hash.
IOA-1 · AutoIt3 runs an .a3x script HIGH PRIORITY
Pattern: Process Creation, image name AutoIt3.exe, command line contains .a3x. Deployment: detect mode first. Exclusions: your sanctioned AutoIt automation folder. Never set to prevent, since AutoIt3.exe is a signed legitimate tool.
IOA-2 · Maiden scheduled task creation
Pattern: Process Creation, image schtasks.exe, command line contains Maiden. Deployment: detect mode. Exclusions: none identified.
IOA-3 · gldriver_pre or node_runtime_helper execution
Pattern: Process Creation, image name matches gldriver_pre_core, gldriver_pre_asset or node_runtime_helper. Deployment: detect, then promote to prevent after one clean week since the names are specific to this chain. Exclusions: none identified.
IOC Management
Import the Section 10 CSV. Only 104.234.65.75 is set to prevent (two independent sources, actor infrastructure). Hashes and the other infrastructure import as detect. Do not import AutoIt3.exe, node.exe, TapiUnattend.exe or explorer.exe as IOCs.
Machine-Readable IOC Appendix
type,value,action,severity,expiration,description,tags ipv4,104.234.65.75,prevent,critical,2027-04-06,movinlike setup.exe host (Checkmarx and CloudSEK),campaign:MALFEX ipv4,45.89.30.194,detect,high,2027-04-06,function-flag 2.3.8 and 2.3.9 payload host,campaign:MALFEX ipv4,191.96.81.101,detect,high,2027-04-06,function-flag 2.3.7 payload host,campaign:MALFEX ipv4,51.137.158.178,detect,high,2027-04-06,function-flag 2.3.5 payload host,campaign:MALFEX domain,cdnzona.discloud.app,detect,high,2027-04-06,function-flag 1.7.3 payload host,campaign:MALFEX domain,apicdn.squareweb.app,detect,high,2027-04-06,function-flag 4.0.0 payload host,campaign:MALFEX domain,apizona.onrender.com,detect,high,2027-04-06,function-flag 2.3.6 payload host,campaign:MALFEX domain,bypasscdn.onrender.com,detect,medium,2027-04-06,function-flag 3.0.0 Discord proxy host,campaign:MALFEX sha256,9aba4685af072231aee049e1a5e294965580001b364d7d00152d84fcec1ce793,detect,high,2027-04-06,Overlord loader (PNG-named IExpress archive),campaign:MALFEX sha256,2989244eac2a4bc7a13a09dec003e5c05ef7c80b2afe0958ce25042d5b804210,detect,high,2027-04-06,Overlord RAT decoded,campaign:MALFEX sha256,c9c374afba4658dff15f71801e88c4d199c91dd2622d72c7b0c55577c8f73437,detect,high,2027-04-06,movinlike Node.js stealer,campaign:MALFEX sha256,889e13e227bc2b762178b88c35c691db3256e72be64d92ff1f381d29a2789849,detect,high,2027-04-06,movinlike build 2026-09-25,campaign:MALFEX sha256,e7f86f6cc4380db66d333eaf6f7dfc2c12d232c2bcd526434681245dea25efa4,detect,high,2027-04-06,movinlike build 2026-09-25 alt,campaign:MALFEX sha256,ff826d2778ea1d40ce8ebfd9d66ecc86d4c811f5654b8a466a7e220ebbbc6807,detect,high,2027-04-06,movinlike build 2026-09-25 alt2,campaign:MALFEX sha256,2f268ca76ab27971d8b16bd4ded26e1f9cd3d4460b894af2d4bdf89f0ab7ec4b,detect,high,2027-04-06,movinlike build 2026-09-26,campaign:MALFEX sha256,fd199d3977e1a2945b6031fc8696660a980e4f4617899baa045efe7ccbc8de67,hunt,medium,2027-01-06,Oxygen.a3x / h.a3x encrypted AutoIt script (not a PE),campaign:MALFEX sha256,5d69a932a077fee044b193c28e84564143f5c7e51079ab48e88fef74ab0b77b7,hunt,low,2027-01-06,Signed legitimate AutoIt3.exe bundled by loader (hunt only; do not block),campaign:MALFEX sha256,4f4f7d64139bde6d458a061c7fb7dd247f70f60a1ab47d87fd3634656586c106,hunt,medium,2027-01-06,banner.png carrying encrypted payload (image file),campaign:MALFEX sha256,8f7ed69fb5505b57f06e673826779d459f7735739756de73a6d3347a9c8ea0cc,hunt,medium,2027-01-06,cdn-img-fetch 1.0.3 banner.jpg,campaign:MALFEX sha256,7acf331117900179b483142f216fdcb22c671eb0b1971abd57f01bc036248a6e,hunt,medium,2027-01-06,tlxbnhd postinstall.js,campaign:MALFEX sha256,c7cf2323e4923428984297db7715d75fec5b964fe65c325b53e3fa360f3b8d86,hunt,medium,2027-01-06,cdn-img-fetch 1.0.0 and 1.0.1 index.js,campaign:MALFEX sha256,430300450f5acbd69c29f02d8c2e243f7d1d6202d1826f6e4d7715f95c47299b,hunt,medium,2027-01-06,cdn-img-fetch 1.0.2 index.js,campaign:MALFEX sha256,4cba0c785e66d517eabd0164f34a9c2d04549da93b5ee3eebdce5558daa2f47c,hunt,medium,2027-01-06,cdn-img-fetch 1.0.3 index.js,campaign:MALFEX sha256,d54853d6be467567d9f22d7f22ac48214df52c1f9c7a503930e901286423044a,hunt,medium,2027-01-06,function-flag 1.7.3 example.js,campaign:MALFEX sha256,886b84f83a0f760e664046ba40d8c800b7d0cf72190e13ca031ee5cf50f45bee,hunt,medium,2027-01-06,function-flag 1.7.3 index.js,campaign:MALFEX domain,REPLACE_WITH_SOLANA_RESOLVED_OVERLORD_C2,detect,high,2027-04-06,UNDISCLOSED Overlord C2 read from Solana transactions,campaign:MALFEX url,REPLACE_WITH_FULL_DISCORD_WEBHOOK_URL,detect,high,2027-04-06,UNDISCLOSED webhook token (source truncates it),campaign:MALFEX
# Behavioral signatures (not atomic; do not import as IOCs) AutoIt3.exe with an .a3x argument; scheduled task \Maiden every 5 minutes, start 1/1/2020, Author Welcome, Comment Wichita Files under %LOCALAPPDATA%\ScopeSmart Technologies Inc\ : AutoIt3.exe, h.a3x, SmartScope.vbs SmartScope.vbs builds "Wscript." + "Shell" by concatenation to dodge string detection TapiUnattend.exe started with a spoofed explorer.exe parent downloaded file served as .png that is an IExpress self-extracting archive, saved as gldriver_pre_core.exe or gldriver_pre_asset.exe PNG with an encrypted executable appended after the end marker; img-to-native waits up to 120 seconds %APPDATA%\Microsoft\Windows\node_runtime_helper.exe; %TEMP%\._cif_data raw.githubusercontent.com/cavecrew/proj/main/banner.png and banner.jpg setup.exe fetched from 104.234.65.75 on port 700 and on the default path node example.js calling the ASCII-art function with the font "Bloody" code padded with spaces to hide in editors, wrapped in an empty catch, guarded on process.env.APPDATA payload names by version: node.exe (1.7.3), svchost.exe (4.0.0, 3.0.0), nocry.exe (2.3.9), malfex.exe (2.3.8, 2.3.7, 2.3.6) movinlike posts 25MB zip chunks to a Discord webhook
Malicious npm packages: function-flag 1.7.3, 4.0.0, 3.0.0, 2.3.5 to 2.3.9 function-color 1.7.3, 1.0.0 cdn-img-fetch 1.0.0 to 1.0.3 img-to-native 1.0.0 to 1.0.3 native-runner 1.0.0 to 1.0.3 tlxbnhd 0.0.1 tldriver 0.0.1 mxdriver 0.0.1, 0.0.2 Benign cover packages (not malicious): function-ascii, malfapi, malfex-webhook-node, centralizemiddle npm publishers: malfexkkj, malfex_user, malfexteste2, malfexteste3, malfexteste4 Team string / AES key: malfexteam2027 GitHub account: cavecrew Operator email: corpmalfex@gmail.com Malware: Overlord RAT, movinlike (Node.js stealer)
# Audit checklist 1. Search every package-lock.json, npm-shrinkwrap.json, pnpm-lock.yaml and yarn.lock for the eight package names. 2. Search registry proxy logs and caches; purge cached tarballs. 3. On Windows hosts: ScopeSmart folder, schtasks \Maiden, node_runtime_helper.exe, %APPDATA%\node.exe, %TEMP%\._cif_data. 4. Do not rely on --ignore-scripts: the movinlike chain has no install hook. 5. When a package is removed, review what it depended on as well. 6. If any item hits: isolate, then follow Section 14.
Detection Validation Gates
| Gate | Requirement |
|---|---|
| Telemetry ready | Confirm ProcessRollup2, NetworkConnectIP4 and DnsRequest flow from developer and CI host groups. Confirm DnsRequest exposes ContextBaseFileName in your tenant before relying on the Q8 imghippo branch. |
| Benign baseline | Run Q1, Q7 and Q10 for 14 days and fill the TUNING exclusions with observed AutoIt automation, portable Node installs and legitimate example.js runs. |
| Positive tests | Safe simulation only: on a lab host, copy a harmless executable to a file named gldriver_pre_core.exe and run it, and run schtasks /create with a task named Maiden that executes a harmless command, then delete both. Do not run any real payload. |
| Promotion path | Investigate-only to Custom IOA after two clean baseline weeks. IOA-3 is the only rule that may move to prevent; IOA-1 stays detect because AutoIt3.exe is legitimate. |
Hardening: Tiered
- Block the eight malicious package names at the registry proxy and purge caches (Playbook A). MITRE M1051 Update Software, M1047 Audit. Best-practice, no formal benchmark.
- Null-route and block outbound to 104.234.65.75 at the firewall and proxy (Playbook C). MITRE M1037 Filter Network Traffic.
- Search lockfiles and developer hosts for the packages and host artifacts (Section 7). MITRE M1047.
- Set
ignore-scripts=truefor CI and build agents and require lockfile installs withnpm ci(Playbook B). It does not stop the require()-time movinlike chain, so treat it as one layer only. MITRE M1038 Execution Prevention. - Restrict executables running from user-writable profile paths with WDAC or AppLocker for managed developer images. MITRE M1038, CIS Controls v8 2.5 and 2.6. Pilot on a ring first.
- Restrict outbound access from CI agents to an allowlist of registries and artifact hosts. MITRE M1037.
- Route all installs through an artifact manager with allowlisted or reviewed packages and a package age or provenance policy. MITRE M1051, M1033.
- Remove long-lived secrets and browser-saved credentials from developer endpoints; move to short-lived tokens. MITRE M1027 Password Policies, M1032 Multi-factor Authentication.
Deployable Playbooks
Playbook A · package and host audit (read-only)
# Playbook A: find the eight MALFEX packages and the Windows host artifacts
# Prerequisites: PowerShell 5.1+, read access to the repo checkout folders under $root
# Reboot required: No
# Rollback: none required, this playbook only reads files
$root = "C:\src" # set to your checkout root
$pk = 'function-flag|function-color|cdn-img-fetch|img-to-native|native-runner|tlxbnhd|tldriver|mxdriver'
Get-ChildItem -Path $root -Recurse -Include package-lock.json,npm-shrinkwrap.json,pnpm-lock.yaml,yarn.lock -ErrorAction SilentlyContinue |
Select-String -Pattern $pk | Select-Object Path, LineNumber, Line
@("$env:LOCALAPPDATA\ScopeSmart Technologies Inc",
"$env:APPDATA\Microsoft\Windows\node_runtime_helper.exe",
"$env:APPDATA\node.exe",
"$env:TEMP\._cif_data") | ForEach-Object { "{0} : {1}" -f $_, (Test-Path $_) }
schtasks /query /tn "\Maiden" /fo LIST /v 2>$null
Playbook B · npm install hygiene for CI
# Playbook B: disable lifecycle scripts and use lockfile-only installs on CI agents
# Prerequisites: npm 7+ on the build agent, repository has a committed lockfile
# Reboot required: No
# Rollback: remove the ignore-scripts line from the .npmrc file (a backup copy is made first)
$rc = Join-Path $env:USERPROFILE ".npmrc"
if (Test-Path $rc) { Copy-Item $rc "$rc.bak" }
Add-Content -Path $rc -Value "ignore-scripts=true"
# Installs in pipelines should then use:
# npm ci
# Note: this does NOT stop the MALFEX movinlike chain, which runs on require() with no install hook.
# Verify:
npm config get ignore-scripts
Playbook C · block the movinlike host at the host firewall
# Playbook C: outbound block for 104.234.65.75 (confirmed operator infrastructure, two sources) # Prerequisites: local administrator, Windows Defender Firewall enabled # Reboot required: No # Rollback: Remove-NetFirewallRule -DisplayName "HuntPack MALFEX block 104.234.65.75" New-NetFirewallRule -DisplayName "HuntPack MALFEX block 104.234.65.75" -Direction Outbound -Action Block -RemoteAddress 104.234.65.75 -Profile Any # Verify: Get-NetFirewallRule -DisplayName "HuntPack MALFEX block 104.234.65.75" | Get-NetFirewallAddressFilter
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-contain the host in Falcon; preserve logs and the package tree before changes. Block 104.234.65.75 (Playbook C). | SOC / IR | Containment timestamp, Falcon host record |
| Scope | Run Q1 to Q10 for 30 days; search lockfiles and registry logs for the eight packages; check CI agents that pulled them. | SOC / AppSec | Query hit list, lockfile matches |
| Eradicate | Remove the scheduled task \Maiden; delete %LOCALAPPDATA%\ScopeSmart Technologies Inc\, %APPDATA%\Microsoft\Windows\node_runtime_helper.exe and %APPDATA%\node.exe if present; purge the packages from internal registries and caches. Prefer a rebuild for any host where Overlord ran. | IR / Endpoint | File and task removal log |
| Credentials | From a clean system, change Discord and browser-saved account passwords, terminate Telegram sessions, move cryptocurrency to new wallets, review Discord accounts for unauthorized payment activity, and rotate any tokens or keys the developer could reach. | IAM / User | Rotation tickets |
| Recover | Reinstall dependencies from a clean lockfile; re-baseline with Q1, Q7 and Q10 for 14 days. | Engineering | Clean query results |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1059 / T1053.005 | AutoIt runs .a3x; Maiden task | Q1, Q2 | IOA-1, IOA-2 | Good |
| T1055.012 | TapiUnattend.exe hollowing | Q3 | No | Partial sees execution, not the injection itself |
| T1204.005 | gldriver_pre and node_runtime_helper | Q4, Q5, Q9 | IOA-3 | Good |
| T1105 | Payload hosts and IPs | Q6, Q8 | No | Good |
| T1036.005 | Payload in %APPDATA% root | Q7, Q10 | No | Partial FP medium |
| T1195.002 | Package install or require() | n/a | No | Partial Section 7 lockfile and proxy search is the control |
| T1027 / T1140 | XOR, RC4, LZNT1, AES, PNG-appended payload | n/a | No | GAP in-process decoding is not visible to the sensor |
| T1102 | Solana-hosted C2 addresses | n/a | No | GAP addresses are not published; placeholder in Section 10 |
| T1567 | Discord webhook exfiltration | n/a | No | GAP discord.com is ubiquitous; full webhook token not published |
| T1555.003 / T1528 | Browser, Discord and wallet data theft | n/a | No | GAP file-read activity is not a documented Falcon event |
Undisclosed indicators, stated plainly. The Solana-resolved Overlord C2 addresses and the full Discord webhook token are not in any fetched source and are not invented. Only 104.234.65.75 reaches prevent; every hash has a single source and ships detect or hunt. Validation gates are in Section 11.
Hunt Summary Ticket
TITLE: MALFEX npm campaign: Overlord RAT, movinlike stealer, function-flag downloader
SEVERITY: HIGH, developer and CI supply chain, Windows credential and wallet theft
SCOPE: Windows developer workstations and CI agents that installed or loaded
function-flag, function-color, cdn-img-fetch, img-to-native,
native-runner, tlxbnhd, tldriver or mxdriver
HYPOTHESIS: A host that ran a MALFEX package shows AutoIt3.exe running an .a3x
script, a Maiden scheduled task, node_runtime_helper.exe, a payload
executable under %APPDATA%, or traffic to the four operator IPs.
QUERIES: Q1-Q10 (Section 8); IOA-1 to IOA-3 (Section 9)
DO FIRST: 1. Search lockfiles and proxy logs for the eight package names.
2. Run Q4, Q5, Q6, Q8 and Q9 fleet-wide for 30 days.
3. Run Q1, Q2, Q3 on Windows developer hosts.
4. Block 104.234.65.75 and purge the packages from registries.
FINDINGS: REPLACE_WITH_FINDINGS_SUMMARY_AFTER_HUNT_EXECUTION
GAPS: In-process decoding, Solana-resolved C2, Discord webhook token,
file-read theft activity (Section 15).
ACTIONS: Deploy IOA-1 to IOA-3 in detect mode; rotate credentials on any
confirmed host; enforce Playbook B on CI agents.
OWNER: REPLACE_WITH_HUNT_OWNER
VERSION: v0.1 (Draft) 2026-10-06
Changelog
References
| Tier | Source | Used for | Access date |
|---|---|---|---|
| T1 | Checkmarx Zero, MALFEX npm malware campaign | All package, host, network and hash indicators; attack paths | 2026-10-06 |
| T1 | CloudSEK, MALFEX postinstall campaign (partial page) | Second source for packages, 104.234.65.75, malfexteam2027, cavecrew, \Maiden | 2026-10-06 |
| T2 | SecurityWeek | Corroboration of scale and exposure | 2026-10-06 |
Three fetched sources were saved to MALFEX-npm-Overlord-Hunt-sources/ for the provenance gate. The Hackread article returned HTTP 403 and is not cited.
Generated 2026-10-06 by HuntPack · defensive content only