Vidar Stealer + XMRig Malvertising — Hunt & Hardening Pack
.bin archive → a Factory-v3 (UpdateFactory) Go loader, rogue code-signed and file-inflated to ~491 MB to evade sandboxes → fake MpClient.dll sideloaded by a legitimate Windows Defender binary → AMSI patch → drops Vidar stealer (MicrosoftUpdate.exe) and XMRig (MicrosoftEdgeUpdate.exe --config=mgwthmc2.dat + WinRing0x64.sys) → persistence as SystemAgentService masquerading as NisSrv.exe. Defensive hunt & harden pack — no offensive code.Executive Summary
Palo Alto Networks Unit 42 documented (report published 2026-07-09, campaign observed from April 2026) a financially-motivated, dual-monetization operation tagged "X3D MINER" that delivers the Vidar infostealer alongside the XMRig Monero miner to consumers and SMBs across the US and EU. Victims are lured by malvertising for cracked/pirated software into downloading a password-protected .bin archive whose obfuscated name and password defeat email-gateway and sandbox detonation.
The archive contains a Factory-v3 (a.k.a. "UpdateFactory") Go-compiled loader — a mature MaaS builder that also produces Lumma loaders. Each build is unique, rogue code-signed (early samples abuse a fake CN=justwatch.com cert issued by a self-signed WR3 CA; a later variant clones *.bleacherreport.com), and file-inflated with null bytes to as much as 491 MB to slip past sandbox size limits. On execution it either runs directly (x64 EXE cluster) or is sideloaded via a fake Go-compiled MpClient.dll that a legitimate Microsoft Defender binary loads by search-order hijack (T1574.002), patches AmsiScanBuffer to blind AMSI, then drops two payloads: Vidar as %TEMP%\MicrosoftUpdate.exe (browser creds, cookies, crypto wallets → exfil to C2 over :443) and XMRig under ...\Microsoft\Windows\Temp\ as MicrosoftEdgeUpdate.exe with libuv-1.dll, the abusable WinRing0x64.sys driver and a mgwthmc2.dat config, mining to pool.supportxmr.com.
SystemAgentService persistence triple — scheduled task + Run key + startup .bat, all pointing at a fake NisSrv.exe), Q3 (a Defender binary loading MpClient.dll from a user/temp path), and Q4 (the XMRig component set + --config=mgwthmc2.dat launch). Unit 42 published a large concrete IOC set (99 loader samples, four C2 IPs, rogue cert serial) — seed the atoms in §9, but the masquerade filenames (NisSrv.exe, MicrosoftEdgeUpdate.exe, MicrosoftUpdate.exe) running from user/temp paths are the durable behavioral layer.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry |
|---|---|---|---|
| 1 · Vendor research | Palo Alto Unit 42 — "Vidar Stealer Unmasked: Code Signing Abuse, Go Loaders and File Inflation" (2026-07-09) | Full chain + large atomic IOC set: Factory-v3 Go loader, rogue certs (justwatch.com / WR3, *.bleacherreport.com), 90+ SHA-256 + imphashes, fake MpClient.dll sideload, AMSI patch, drop paths (MicrosoftUpdate.exe, MicrosoftEdgeUpdate.exe, libuv-1.dll, WinRing0x64.sys, mgwthmc2.dat, NisSrv.exe), SystemAgentService persistence, four C2 IPs :443, pool.supportxmr.com, ip-api.com geo-beacon | yes |
| 2 · Vendor press | Dark Reading — "Vidar Infostealer Hammers SMBs via Malvertising Campaign" | Consumer/SMB targeting; dual monetization (log-market sales + mining); password-protected archive lure; scope framing | yes |
| 2 · Vendor press | Infosecurity Magazine · Security Boulevard — campaign summaries | Vidar + Monero miner via fake software downloads; Factory-v3 MaaS builder shared with Lumma; corroboration of chain | yes |
| 3 · Related | MalwareTips / community notes on the Unit 42 report | Go-compiled fake MpClient.dll sideload detail; loader-as-a-service framing | partial |
Decisions: This campaign is unusually IOC-rich — Unit 42 published dozens of loader SHA-256s, imphashes, a rogue cert serial, four Vidar C2 IPs and the full drop-path set — so those are seeded as detect/prevent in §9. Because the loader is polymorphic (unique per build) and abuses rotating code-signing, the durable signal is behavioral: the SystemAgentService/NisSrv.exe persistence triple, the Defender-binary MpClient.dll sideload, and the XMRig drop-set under \Microsoft\Windows\Temp\. The four C2 IPs are seeded but perishable. No victim names are used; detections are TTP-based.
Hunt Brief & Attack Chain
Working hypothesis: A user downloads a cracked-software lure (password-protected .bin), runs a rogue-signed Factory-v3 loader that sideloads a fake MpClient.dll, patches AMSI, then drops Vidar (MicrosoftUpdate.exe) for credential theft and XMRig (MicrosoftEdgeUpdate.exe + WinRing0x64.sys) for mining, and persists as SystemAgentService / NisSrv.exe.
| Step | Behavior | Telemetry | Hunt Angle |
|---|---|---|---|
| 1 · Delivery | Malvertising → cracked-software page → password-protected .bin archive (obfuscated name) | Browser download / DnsRequest | N1 |
| 2 · Execution / evasion | Rogue-signed Factory-v3 Go loader; file-inflated to ~491 MB; sideloads fake MpClient.dll; patches AmsiScanBuffer | ProcessRollup2, PeFileWritten, module load | Q3 / Q5, N2 |
| 3 · Stealer drop | Vidar as %TEMP%\MicrosoftUpdate.exe; harvest browser creds/cookies/wallets | ProcessRollup2, PeFileWritten | Q2 |
| 4 · Miner drop | XMRig set under \Microsoft\Windows\Temp\: MicrosoftEdgeUpdate.exe, libuv-1.dll, WinRing0x64.sys, mgwthmc2.dat; launch --config=mgwthmc2.dat | ProcessRollup2, PeFileWritten | Q4 |
| 5 · Persistence | SystemAgentService: scheduled task (onlogon) + HKCU\...\Run + startup .bat, all → NisSrv.exe -s | ProcessRollup2, reg/asep events | Q1 |
| 6 · C2 / exfil / mining | Vidar → C2 IPs on :443; XMRig → pool.supportxmr.com; geo-beacon ip-api.com | NetworkConnectIP4, DnsRequest | Q6 |
Affected surface & telemetry
| Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
| Windows endpoints (user workstations) | Process lineage + command line (ProcessRollup2) | Critical | Low — standard sensor |
| Module-load surface | DLL/module load events (for MpClient.dll sideload) | High | Medium — confirm module-load telemetry is on |
| File system (temp / AppData / startup) | File create events (TargetFileName) | High | Low — drop paths are fixed and specific |
| Egress / DNS | NetworkConnectIP4, DnsRequest to SIEM | High | Low — mining pool + geo-beacon are strong tells |
Consolidated IOC Table
SystemAgentService/NisSrv.exe persistence triple, the MpClient.dll sideload, and the XMRig drop-set under \Microsoft\Windows\Temp\. Full copy-ready lists in §9.| Type | Value | Conf | Action | Context |
|---|---|---|---|---|
| SHA-256 (loader A) | 097a87cfa4a5186aba3bba096866692951bde59c6f0c2e8c1c4a599246d14da8 | high | prevent | Factory-v3 x64 EXE loader (file-inflated) |
| SHA-256 (loader B) | 0a6a67a2fc4d79ec1cd8afc5b8b7a5e69a406e53d57a7334e097c5d0644de5f6 | high | prevent | x64 DLL loader (fake MpClient.dll sideload) |
| Imphash | d42595b695fc008ef2c56aabd8efd68e | medium | hunt | Cluster A EXE loaders (import-hash pivot) |
| Imphash | d8b31f8c03e0c76ff245ed05a15ffe6c | medium | hunt | Cluster B DLL loaders (MpClient sideload) |
| Code-sign cert | CN=justwatch.com · issuer WR3 · serial 2f:7e:f0:15:7d:17:62:5c:09:86:91:ce:f1:ff:7d:63 | high | detect | Rogue signing cert (Variant A); block by serial |
| Filename / path | %TEMP%\MicrosoftUpdate.exe | high | detect | Vidar stealer drop (masquerade) |
| Filename / path | …\Microsoft\Windows\Temp\MicrosoftEdgeUpdate.exe | high | detect | XMRig launcher (legit EdgeUpdate lives in Program Files) |
| Filename | WinRing0x64.sys · libuv-1.dll · mgwthmc2.dat | high | detect | XMRig driver + dependency + config in Temp |
| Persistence | SystemAgentService → NisSrv.exe -s (task + Run key + StartUp .bat) | high | detect | Masquerades as Defender NIS; runs from AppData |
| Sideload | MpClient.dll (fake, Go-compiled) loaded by Defender binary | high | detect | DLL search-order hijack (T1574.002) |
| IPv4 (C2) | 136.243.203.109 · 136.243.203.111 · 116.203.243.208 · 138.199.246.13 | medium | detect | Vidar C2 over :443 (perishable) |
| Domain | pool.supportxmr.com · ip-api.com | medium | hunt | XMRig mining pool; geo-beacon (ip-api dual-use) |
| Actor / tag | X3D MINER · Factory-v3 (UpdateFactory) · Telegram ci0iiif | medium | enrich | MaaS affiliate; builder shared with Lumma |
ATT&CK Mapping
| Tactic | Technique | Observed Behavior | Query / Control |
|---|---|---|---|
| Resource Development | T1608.001 / T1588.003 — Malvertising / Code-signing Certs | Cracked-software ads; rogue justwatch.com / bleacherreport.com certs | N1 |
| Execution | T1204.002 — User Execution: Malicious File | Password-protected .bin run by the victim | N1, Q5 |
| Defense Evasion | T1574.002 — DLL Search Order Hijacking | Fake MpClient.dll sideloaded by a Defender binary | Q3 |
| Defense Evasion | T1562.001 — Impair Defenses: AMSI patch | AmsiScanBuffer patched to E_INVALIDARG | Q3, Q5 |
| Defense Evasion | T1027.001 / T1036.005 — File Inflation / Masquerading | 491 MB null-padding; NisSrv.exe / MicrosoftEdgeUpdate.exe names | Q2, Q4, Q5 |
| Persistence | T1053.005 / T1547.001 — Scheduled Task / Run Key + Startup | SystemAgentService task + Run value + StartUp .bat | Q1 |
| Credential Access / Collection | T1555 / T1005 — Creds from Stores / Data from Local System | Vidar harvests browser creds, cookies, crypto wallets | Q2, Q6 |
| Impact | T1496 — Resource Hijacking | XMRig mining Monero to pool.supportxmr.com; abuses WinRing0x64.sys | Q4, Q6 |
| Exfiltration / C2 | T1041 / T1071 — Exfil over C2 / Web Protocols | Vidar → C2 IPs on :443; ip-api.com geo-beacon | Q6 |
Native Audit-Log Hunts
| Hunt | Source | Logic | Response |
|---|---|---|---|
| N1 · Cracked-software download | Proxy / DNS / browser-download logs | Downloads of password-protected .bin archives from cracked-software / malvertising domains, then execution on the same host | Quarantine; hunt the host for Q1/Q3/Q4 |
| N2 · Oversized inflated PE | EDR file-write / mail-gateway | Executable files hundreds of MB in size that compress to a few MB (null-byte inflation to evade sandboxes) | Decompress-before-scan; submit compressed sample |
| N3 · Rogue code-signing | Windows 4688 w/ signer / EDR signer field | Executables signed by untrusted CN justwatch.com / issuer WR3, or a cloned *.bleacherreport.com chain not in the MS trust store | Block by cert serial; hunt for the drop-set |
| N4 · Scheduled task / Run-key creation | Windows Security 4698 / 4657 (Run key) | Creation of task or Run value SystemAgentService pointing at NisSrv.exe -s under AppData | Isolate; confirm masquerade; engage IR |
CrowdStrike LogScale CQL Hunt Queries
SyntheticProcessRollup2. Q3 needs module-load telemetry enabled for the MpClient.dll branch; the process-parent branch works without it. Loader hashes are polymorphic — lean on the behavioral queries (Q1/Q3/Q4) and treat Q5 hashes as a fast historical sweep. Run 30–90 days.Looks for: the campaign's persistence value SystemAgentService, the schtasks … onlogon registration, or any NisSrv.exe running outside System32 (the real Defender NIS lives in Program Files). Accomplishes: the single highest-fidelity signal. FP: low — this exact name+path combination is unique to the campaign.
// HUNT: Vidar/XMRig SystemAgentService persistence (T1053.005 / T1547.001 / T1036.005) // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 + Reg events #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2|RegGenericValueUpdate|AsepValueUpdate/ | (CommandLine=/schtasks(\.exe)?\s.{0,120}SystemAgentService|SystemAgentService.{0,80}NisSrv/i or RegValueName=/^SystemAgentService$/i or RegStringValue=/\\Microsoft\\Windows\\Temp\\NisSrv\.exe/i or ImageFileName=/\\Users\\[^\\]+\\.{0,60}\\NisSrv\.exe$/i) | table([@timestamp, aid, ComputerName, UserName, FileName, ImageFileName, RegValueName, RegStringValue, CommandLine], limit=200) | sort(@timestamp, order=desc)
Looks for: a process named MicrosoftUpdate.exe running or written under a user Temp path — Vidar's masquerade drop. Accomplishes: catches the stealer stage. FP: low — legitimate Windows update binaries do not run from \Users\…\Temp\.
// HUNT: Vidar stealer drop MicrosoftUpdate.exe (T1036.005 / T1555) // CONF: high FP: low COST: low #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2|PeFileWritten/ | (ImageFileName=/\\Users\\[^\\]+\\.{0,40}\\Temp\\MicrosoftUpdate\.exe$/i or TargetFileName=/\\Users\\[^\\]+\\.{0,40}\\Temp\\MicrosoftUpdate\.exe$/i) | table([@timestamp, aid, ComputerName, UserName, ImageFileName, TargetFileName, SHA256HashData, CommandLine], limit=200) | sort(@timestamp, order=desc)
Looks for: a fake MpClient.dll written to or loaded from a user/temp path (the real one lives under Program Files\Windows Defender). Accomplishes: catches the search-order-hijack execution stage. FP: medium — scope to non-standard paths; a MpClient.dll outside the Defender directory is the signal.
// HUNT: Vidar loader MpClient.dll sideload (T1574.002 / T1562.001) // CONF: high FP: medium COST: low // TUNING: exclude \Program Files\Windows Defender\ and \Program Files\Microsoft Defender\ paths #event_simpleName=/PeFileWritten|ProcessRollup2|SyntheticProcessRollup2/ | (TargetFileName=/\\Users\\[^\\]+\\.{0,80}\\MpClient\.dll$/i or TargetFileName=/\\Windows\\Temp\\MpClient\.dll$/i or ImageFileName=/\\Users\\[^\\]+\\.{0,80}\\MpClient\.dll$/i) | table([@timestamp, aid, ComputerName, UserName, TargetFileName, ImageFileName, SHA256HashData], limit=200) | sort(@timestamp, order=desc)
Looks for: the XMRig component set under \Microsoft\Windows\Temp\ or the tell-tale --config=mgwthmc2.dat launch, plus the abusable WinRing0x64.sys/libuv-1.dll in a temp path. Accomplishes: catches the miner stage. FP: low for the specific config/path; the fake MicrosoftEdgeUpdate.exe location is the discriminator (legit EdgeUpdate lives in Program Files).
// HUNT: Vidar-campaign XMRig miner drop/launch (T1496 / T1036.005) // CONF: high FP: low COST: low #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2|PeFileWritten/ | (CommandLine=/--config=\s*mgwthmc2\.dat|MicrosoftEdgeUpdate\.exe.{0,40}mgwthmc2/i or TargetFileName=/\\Microsoft\\Windows\\Temp\\(MicrosoftEdgeUpdate\.exe|libuv-1\.dll|WinRing0x64\.sys|mgwthmc2\.dat)$/i or ImageFileName=/\\Microsoft\\Windows\\Temp\\MicrosoftEdgeUpdate\.exe$/i) | table([@timestamp, aid, ComputerName, UserName, FileName, ImageFileName, TargetFileName, CommandLine], limit=200) | sort(@timestamp, order=desc)
Looks for: execution of any of the published Factory-v3 loader SHA-256s. Accomplishes: a fast, decisive historical sweep. FP: none — exact-hash match. Note the loader is polymorphic, so a clean result does not clear the host — pair with Q1/Q3/Q4. Full hash list in §9.
// HUNT: Vidar Factory-v3 loader by known hash (T1204.002 / T1027.001) // CONF: high FP: low COST: low | polymorphic loader — behavioral queries carry coverage #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2|PeFileWritten/ | SHA256HashData=/^(097a87cfa4a5186aba3bba096866692951bde59c6f0c2e8c1c4a599246d14da8|201594c9d173bba6cb509407ecba378c19b93da0a81a2182a913c480e6dbb54e|35dde1b2482b12582820a861e7c46f10721af6b75052fc872c05d2230a4e8ca1|0a6a67a2fc4d79ec1cd8afc5b8b7a5e69a406e53d57a7334e097c5d0644de5f6|488d941b7b4428b0f4a0e5495e3857b9b96215fb3e7f164b06640d59096425e6)$/i | table([@timestamp, aid, ComputerName, UserName, FileName, ImageFileName, SHA256HashData], limit=max) | sort(@timestamp, order=desc)
Looks for: outbound to the four Vidar C2 IPs on :443, DNS for pool.supportxmr.com (XMRig), or the ip-api.com geo-beacon. Accomplishes: network-side confirmation. FP: C2 IPs and mining pool are strong; ip-api.com is dual-use (some legit apps query it) — treat that branch as pivot, alert on the pool + C2 IPs.
// HUNT: Vidar C2 + XMRig pool + geo-beacon (T1041 / T1071 / T1496) // CONF: high FP: medium COST: low // TUNING: alert on the C2 IPs + pool.supportxmr.com; keep the ip-api.com branch pivot-only (dual-use) #event_simpleName=/NetworkConnectIP4|DnsRequest/ | (RemoteAddressIP4=/^(136\.243\.203\.109|136\.243\.203\.111|116\.203\.243\.208|138\.199\.246\.13)$/ or DomainName=/^(pool\.supportxmr\.com|ip-api\.com)$/i) | table([@timestamp, aid, ComputerName, UserName, RemoteAddressIP4, RemotePort, DomainName], limit=200) | sort(@timestamp, order=desc)
CrowdStrike Custom IOA Recommendations
| IOA Name | Field Patterns | Benign Exclusions | Deployment Path |
|---|---|---|---|
| Vidar — SystemAgentService persistence | CmdLine schtasks … SystemAgentService / RegValue SystemAgentService / NisSrv.exe outside System32 | None expected | Custom IOA → Process Creation + Reg, critical, Detect+Block |
| Vidar — XMRig launcher | CmdLine --config=mgwthmc2.dat / image \Microsoft\Windows\Temp\MicrosoftEdgeUpdate.exe | None — real EdgeUpdate runs from Program Files | Custom IOA → Process Creation, high, Detect+Block |
| Vidar — MpClient.dll sideload | Module/file MpClient.dll outside \Program Files\…Defender\ | None expected in user/temp paths | Custom IOA → Process Creation; block by cert serial |
ip-api.com branch pivot-only. Because the loader is polymorphic and rogue-signed, prefer behavioral IOAs + cert-serial blocking over hash-only detection.Machine-Readable IOC Appendix
Grouped IOC Quick-Copy
One-click blocks for Falcon IOC Management, behavioral detection, and audit. Unit 42 published a large atom set — seed the hashes/IPs, but the loader is polymorphic so keep the persistence + sideload + XMRig-drop behaviors as the durable layer.
type,value,action,severity,expiration,description,tags sha256,097a87cfa4a5186aba3bba096866692951bde59c6f0c2e8c1c4a599246d14da8,prevent,high,2026-10-11,Vidar Factory-v3 x64 EXE loader,campaign:VidarX3D sha256,201594c9d173bba6cb509407ecba378c19b93da0a81a2182a913c480e6dbb54e,prevent,high,2026-10-11,Vidar Factory-v3 x64 EXE loader,campaign:VidarX3D sha256,35dde1b2482b12582820a861e7c46f10721af6b75052fc872c05d2230a4e8ca1,prevent,high,2026-10-11,Vidar Factory-v3 x64 EXE loader,campaign:VidarX3D sha256,0a6a67a2fc4d79ec1cd8afc5b8b7a5e69a406e53d57a7334e097c5d0644de5f6,prevent,high,2026-10-11,Vidar loader DLL (MpClient sideload),campaign:VidarX3D sha256,488d941b7b4428b0f4a0e5495e3857b9b96215fb3e7f164b06640d59096425e6,prevent,high,2026-10-11,Vidar loader DLL (MpClient sideload),campaign:VidarX3D ipv4,136.243.203.109,detect,medium,2026-10-11,Vidar C2 :443,campaign:VidarX3D ipv4,136.243.203.111,detect,medium,2026-10-11,Vidar C2 :443,campaign:VidarX3D ipv4,116.203.243.208,detect,medium,2026-10-11,Vidar C2 :443,campaign:VidarX3D ipv4,138.199.246.13,detect,medium,2026-10-11,Vidar C2 :443,campaign:VidarX3D domain,pool.supportxmr.com,detect,medium,2026-10-11,XMRig Monero mining pool,campaign:VidarX3D
Delivery: malvertising -> cracked-software page -> password-protected .bin (obfuscated name)
Loader: Factory-v3 Go loader ; rogue-signed ; null-padded to ~491 MB (sandbox evasion)
Sideload: fake Go MpClient.dll loaded by a Defender binary (search-order hijack)
Evasion: patch AmsiScanBuffer first 6 bytes -> E_INVALIDARG (AMSI blind)
Stealer: %TEMP%\MicrosoftUpdate.exe (Vidar) -> browser creds/cookies/wallets -> C2 :443
Miner: \Microsoft\Windows\Temp\MicrosoftEdgeUpdate.exe --config=mgwthmc2.dat
+ libuv-1.dll + WinRing0x64.sys ; pool.supportxmr.com
Persist: SystemAgentService = task(onlogon) + HKCU\...\Run + StartUp .bat -> NisSrv.exe -s
Recon: ip-api.com/json geo-beacon ; HWID from C: volume serial
%TEMP%\MicrosoftUpdate.exe # Vidar stealer ...\Microsoft\Windows\Temp\MicrosoftEdgeUpdate.exe # XMRig launcher ...\Microsoft\Windows\Temp\libuv-1.dll # XMRig dependency ...\Microsoft\Windows\Temp\WinRing0x64.sys # XMRig kernel driver (abusable) ...\Microsoft\Windows\Temp\mgwthmc2.dat # XMRig Monero config ...\Microsoft\Windows\Temp\NisSrv.exe # persistence copy of loader MpClient.dll # fake Go DLL (sideload) ; real one in Defender dir Task/Run value: SystemAgentService # -> NisSrv.exe -s (onlogon) StartUp\FEbJCNWOCKMJ.bat # startup persistence Cert: CN=justwatch.com / issuer WR3 / serial 2f:7e:f0:15:7d:17:62:5c:09:86:91:ce:f1:ff:7d:63
Operator: X3D MINER (financially motivated MaaS affiliate)
Builder: Factory-v3 / "UpdateFactory" (Go 1.25.9) — also builds Lumma loaders
Imphash: d42595b695fc008ef2c56aabd8efd68e (EXE cluster)
d8b31f8c03e0c76ff245ed05a15ffe6c (DLL / MpClient cluster)
Cert B: CN=*.bleacherreport.com (cloned GlobalSign Atlas issuer) — Variant B
Telegram: ci0iiif ; notification tag "X3D MINER - NEW LOG"
Targets: consumers + SMBs ; US / EU ; dual monetization (log sales + mining)
Hardening — Tiered & Deployable
Entry is user-run cracked software, and the loader leans on rogue code-signing, DLL sideloading and an abusable driver. Cut off untrusted execution, validate signatures, and make the fixed drop-paths unusable.
- Block the published atoms now — M1031. Import the §9 CSV: loader SHA-256s
prevent, C2 IPs +pool.supportxmr.comdetect. Block the rogue cert by serial. - Alert on the
SystemAgentServicepersistence +NisSrv.exe-outside-System32 pattern — M1040 / M1018. Deploy Q1/N4 as detections; the name+path combination is unique to the campaign. - Enable the Microsoft vulnerable-driver blocklist / HVCI — M1050. Blocks the abusable
WinRing0x64.systhe miner loads. - Enable Falcon ransomware/behavioral prevention + Tamper Protection; monitor AMSI-bypass behavior — M1040. The loader patches
AmsiScanBuffer— behavioral prevention doesn't rely on AMSI.
- Block execution from user Temp / AppData / Downloads with WDAC/AppLocker or ASR — M1038. Breaks the Vidar/XMRig/
NisSrv.exedrop-and-run pattern (Q2/Q4/Q1). - Enforce Authenticode chain validation; block untrusted/self-signed publishers — M1045. The loader relies on rogue
WR3/cloned certs that are not in the MS trust store (N3). - Scan files regardless of size (decompress padding before size limits) — M1049. Defeats the 491 MB null-inflation sandbox-evasion trick (N2).
- Block/monitor
MpClient.dllloaded outside the Defender directory — M1038 / M1040. Directly targets the sideload (Q3). - Egress-filter mining pools and known stealer C2; DNS RPZ for
*.supportxmr.com— M1037. Chokes the miner and Vidar exfil (Q6).
- User-application control / software allow-listing; remove local-admin from standard users — M1038 / M1026. Removes the cracked-software execution path at the root.
- Phishing-resistant MFA + rapid session/cookie revocation on stealer hits — M1032 / M1017. Vidar's value is stolen cookies/sessions — invalidate them fast.
- Web filtering / ad-network reputation to blunt malvertising — M1021. Cuts the delivery vector before download.
Deployable Playbook — Detect the drop-set & persistence (PowerShell, report-only)
# 1. Vidar/XMRig drop-set under the AppData Temp path (defensive scan; report only).
$t = Join-Path $env:APPDATA 'Microsoft\Windows\Temp'
'MicrosoftEdgeUpdate.exe','libuv-1.dll','WinRing0x64.sys','mgwthmc2.dat','NisSrv.exe' | ForEach-Object {
$p = Join-Path $t $_
if (Test-Path $p) { [pscustomobject]@{ File=$_; Path=$p; SHA256=(Get-FileHash $p -Algorithm SHA256).Hash } }
}
if (Test-Path (Join-Path $env:TEMP 'MicrosoftUpdate.exe')) { "Vidar drop present: $env:TEMP\MicrosoftUpdate.exe" }
# 2. SystemAgentService persistence (scheduled task + Run key + startup .bat).
Get-ScheduledTask -TaskName 'SystemAgentService' -ErrorAction SilentlyContinue | Select TaskName, State
Get-ItemProperty 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run' -ErrorAction SilentlyContinue |
Select-Object -ExpandProperty SystemAgentService -ErrorAction SilentlyContinue
Get-ChildItem "$env:ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\*.bat" -ErrorAction SilentlyContinue |
Select-String -Pattern 'NisSrv' -List | Select Path
# 3. Fake MpClient.dll outside the Defender directory.
Get-ChildItem "$env:USERPROFILE" -Recurse -Filter 'MpClient.dll' -ErrorAction SilentlyContinue |
Where-Object FullName -notmatch 'Windows Defender|Microsoft Defender' |
Select-Object FullName, @{n='SHA256';e={(Get-FileHash $_.FullName -Algorithm SHA256).Hash}}
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-contain any host with Q1/Q2/Q3/Q4 hits; block the four C2 IPs + pool.supportxmr.com; cut the XMRig process | SOC L2 | Containment timestamps; Q1/Q4 events |
| Triage | Reconstruct download → loader → MpClient.dll sideload → Vidar/XMRig drop → persistence timeline; capture the loader, NisSrv.exe and mgwthmc2.dat; confirm which browsers/wallets Vidar accessed | IR | Process timeline; recovered samples/hashes |
| Eradicate | Remove the SystemAgentService task + Run value + StartUp .bat, the XMRig drop-set, MicrosoftUpdate.exe and the fake MpClient.dll; reset all credentials and revoke browser sessions/cookies Vidar could have stolen; block the rogue cert serial | IR | Cred-reset + session-revoke log; removed artifacts |
| Recover | Rebuild or clean-verify affected endpoints; confirm no residual persistence or driver; restore user access with fresh credentials/MFA | IR + IT | Clean-scan evidence |
| Harden | Block §9 atoms; deploy Q1/Q3/Q4 IOAs Detect+Block; enable vuln-driver blocklist; block user-path execution; enforce Authenticode validation; scan-regardless-of-size | Detection Eng | IOC + IOA status |
Detection Coverage Map & Validation
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1608 / T1204.002 | Malvertising → cracked-software execution | — | — | GAP native proxy/download review (N1) |
| T1574.002 / T1562.001 | MpClient.dll sideload + AMSI patch | Q3 | IOA-3 | Partial needs module-load telemetry for full coverage |
| T1555 / T1005 | Vidar stealer drop & harvest | Q2 | — | Good masquerade path decisive |
| T1496 | XMRig miner drop & launch | Q4 | IOA-2 | Good config + path + driver |
| T1053.005 / T1547.001 | SystemAgentService persistence | Q1 | IOA-1 | Good task + Run + StartUp |
| T1027.001 | Polymorphic rogue-signed loader | Q5 | — | Partial hash sweep only — behaviorals carry it |
| T1041 / T1071 / T1496 | C2 / mining-pool / geo-beacon | Q6 | — | Good C2 + pool; ip-api pivot-only |
Validation gates: (1) confirm ProcessRollup2 with command line and that file events carry TargetFileName; verify module-load telemetry is enabled for Q3's MpClient.dll branch; (2) exclude the real Defender directories in Q3 and legitimate ip-api.com callers in Q6 before alerting; (3) because the loader is polymorphic, treat Q5 as a sweep and rely on Q1/Q3/Q4 for durable coverage; (4) lab-test a benign scheduled-task create and a benign ip-api.com lookup to confirm Q1/Q6 don't over-fire; (5) promote Q1/Q3/Q4 to Custom IOA Detect+Block; import the §9 hash list as Custom IOCs; block the rogue cert serial. The drop-path names, SystemAgentService value and --config=mgwthmc2.dat launch are tenant-agnostic and safe to deploy as-is.
Hunt Summary Ticket
TITLE: Hunt — Vidar Stealer + XMRig Malvertising (Factory-v3, operator X3D MINER)
SEVERITY: High (active ITW; credential theft + resource hijacking; SMB/consumer targeting)
SCOPE: Windows user workstations; anywhere cracked-software may be run
HYPOTHESIS: Malvertising -> password-protected .bin -> rogue-signed Factory-v3 Go loader
(inflated ~491 MB) -> fake MpClient.dll sideload + AMSI patch -> Vidar
(%TEMP%\MicrosoftUpdate.exe) + XMRig (\Windows\Temp\MicrosoftEdgeUpdate.exe
--config=mgwthmc2.dat, WinRing0x64.sys) -> persist as SystemAgentService / NisSrv.exe.
DISCLOSED: Unit 42 2026-07-09 (campaign from Apr 2026)
QUERIES RUN: Q1 SystemAgentService persistence (IOA) | Q2 Vidar drop | Q3 MpClient.dll sideload* (IOA) |
Q4 XMRig drop/launch (IOA) | Q5 known-hash sweep | Q6 C2/pool/geo-beacon
(* = needs module-load telemetry for full coverage)
DO FIRST: Q1, Q4, Q3 -- escalate any hit; Q2 confirms stealer; Q6 confirms exfil/mining
FINDINGS: <pending analyst execution>
GAPS: Delivery (malvertising/download) is native-log only; loader is polymorphic (Q5 sweep only)
ACTIONS: Block §9 atoms + rogue cert serial; enable vuln-driver blocklist; block user-path exec;
enforce Authenticode validation; scan-regardless-of-size; deploy Q1/Q3/Q4 IOAs;
reset creds + revoke sessions on any Vidar hit
OWNER: HuntPack
VERSION: v0.2 - 2026-07-13
Changelog
table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.References
| Tier | Source | Used For |
|---|---|---|
| 1 | Palo Alto Unit 42 — Vidar Stealer Unmasked: Code Signing Abuse, Go Loaders and File Inflation | Full chain + atomic IOCs (loader SHA-256s + imphashes, rogue cert serial, drop paths, SystemAgentService persistence, MpClient.dll sideload, AMSI patch, C2 IPs, mining pool, geo-beacon), MITRE mapping, X3D MINER / Factory-v3 attribution |
| 2 | Dark Reading — Vidar Infostealer Hammers SMBs via Malvertising Campaign | Consumer/SMB targeting; dual monetization; password-protected archive lure; scope |
| 2 | Infosecurity Magazine — New Campaign Delivers Vidar Stealer and Monero Crypto Miner · Security Boulevard — Vidar Uses Fake Software Downloads | Chain corroboration; Factory-v3 MaaS builder shared with Lumma; fake-download delivery |
HuntPack v0.1 · Vidar Stealer + XMRig Malvertising (Factory-v3 · operator X3D MINER) · Generated 2026-07-13 · Defensive use only — no offensive code. The Factory-v3 loader is polymorphic and rotates rogue code-signing, so the published hashes/certs and the four C2 IPs are perishable — the durable signal is the behavioral kill-chain (SystemAgentService/NisSrv.exe persistence, MpClient.dll sideload, XMRig drop-set under \Microsoft\Windows\Temp\, --config=mgwthmc2.dat launch). Validate field names, confirm module-load telemetry, and tune the Defender-path / ip-api.com exclusions in your tenant before promoting any query to alerting.