Yoba: Fake ChatGPT and Claude Desktop Apps, Signed-Binary DLL Sideload
Executive Summary
Attacker objective. Yoba is a Windows malware chain that Check Point Research tracked for about two months and published on 2026-10-27. The operator creates GitHub repositories and GitHub Pages sites that advertise desktop apps for new AI products (lure names GPT-5.6 Sol, GPT-6 Astra and Claude Opus), ranks them in Google by what Check Point assesses as SEO poisoning, and hosts the malware as an unprotected ZIP release. Each ZIP pairs a legitimate, signed OpenAI or Anthropic Setup.exe with a malicious winmm.dll that the signed program loads (DLL sideloading). [#1] [#2]
The chain. The DLL (YobaDropper) checks that its host is named Setup.exe, skips CIS keyboard layouts (Ukrainian is not excluded), and needs administrator rights. It then writes a copy of the Windows file WMPDMC.exe and the loader (YobaLoader, saved as wmpdui.dll) into ProgramData\WMProcess and registers a SYSTEM scheduled task that starts the copy 3 minutes after boot. The loader reads the profile picture of a Telegram channel, derives a domain from the image, asks Google DNS-over-HTTPS for a signed and encrypted TXT record, and downloads the payload from Catbox. The payload observed was XMRig 6.26.0 injected into svchost.exe, mining through Tor and pausing while the user is active. [#1] [#2]
Why it matters. The loader is generic: it can run any Windows executable or PowerShell script the operator signs and sends, so the miner is only the first payload seen. Check Point advises treating a Yoba infection as a broader compromise, not a cryptominer cleanup. The signed OpenAI and Anthropic files are real vendor binaries; Check Point found no sign that OpenAI, Anthropic, ChatGPT or Claude were compromised. A valid signature vouches for one file, not for the DLL sitting next to it. [#1] [#2] [#3]
What is different from the common summary. The roughly 12.73 day delay (200,000 iterations of Sleep(5500)) runs when the host process is not named Setup.exe, which is the sandbox and standalone-run branch, not the normal path. In a real infection the dropper and the loader's first callback are separated by the time to the next reboot, because the task fires 3 minutes after boot. The pack therefore hunts the stage pairing (Q11), not a fixed 12 day gap. [#1] [#2]
Defender priority. (1) Alert on any winmm.dll outside the Windows system folders next to a Setup.exe, and on any WMPDMC.exe or wmpdui.dll outside the Windows and Media Player folders (Q2, Q3, Q5, Q6, Q12). (2) Never block on the signed OpenAI or Anthropic executables, on winmm.dll or WMPDMC.exe by name, on svchost.exe, on Telegram, Google DoH or Catbox, or on stock XMRig: all are legitimate software or services that Yoba abuses. (3) Every indicator comes from one vendor report, so everything ships as detect.
Source Review & Web Hunter Notes
Five sources were fetched and saved verbatim as text snapshots for the provenance gate, in Yoba-FakeAIApps-Sideload-Hunt-sources/. Every atomic indicator in this pack was parsed by script from snapshot 01 and then checked against the snapshot text; none was typed from memory or from a search summary.
| # | Tier | Source | Key finding | Carry forward |
|---|---|---|---|---|
| 1 | T1 | Check Point Research: Tricks from the Past deployed via signed ChatGPT and Claude binaries, 2026-10-27 (snapshot 01) | Primary technical report by Eli Smadja. Full chain, the DJB2 checks and the 200,000 x Sleep(5500) loop, WMProcess and WMPDMC.exe persistence, Telegram + DGA + DoH + Catbox tasking, XMRig 6.26.0 configuration, hashes (SHA-1 only), network indicators, YARA rules. | yes |
| 2 | T1 | Check Point Blog: Yoba Malware Abuses Signed ChatGPT and Claude Binaries to Target AI Users, 2026-10-27 (snapshot 02) | Same vendor, plain-language companion. States the signed binaries are legitimate, that nothing at OpenAI or Anthropic was compromised, and that Yoba should be treated as a broader compromise. Not an independent source: it summarises report 1. | yes (context) |
| 3 | T3 | Help Net Security, 2026-10-29 (snapshot 03) | Press coverage of report 1. Used only to cross-check the scheduled-task description and the Cursor.exe earlier variant. No indicator taken from it. | partial |
| 4 | T3 | Security Affairs, 2026-10-30 (snapshot 04) | Press coverage of report 1. Confirms that the 12.73 day sleep happens on the failed host-name check. No indicator taken from it. | partial |
| 5 | T3 | Infosecurity Magazine, 2026-10-28 (snapshot 05) | Press coverage of report 1. Confirms the signed Setup.exe loads the DLL and the checks run before the second stage. No indicator taken from it. | partial |
Decisions
- No independent second source. Sources 2 to 5 all derive from source 1. A search for a second vendor analysis of Yoba returned only press coverage of the Check Point report. Under the two-independent-sources rule nothing in this pack ships as prevent or critical: every indicator is detect or hunt.
- Legitimate software stays out of the block list. The signed OpenAI and Anthropic executables,
winmm.dll,WMPDMC.exe,svchost.exe, Telegram, Google DNS-over-HTTPS, Catbox, GitHub,dedyn.ioand stock XMRig are real software or services. They appear as hunt context only. - SHA-1 only. Check Point publishes SHA-1 hashes and no SHA-256. Falcon IOC Management does not import SHA-1, so the hashes are in their own copy block (section 10) and in Q1.
- Names. The names Yoba, YobaDropper, YobaLoader and XMRig are Check Point's own and appear in the snapshots. No actor or cluster name is used. Check Point says the actor shows indicators of Russian origin and works mostly in UTC-4; that is its assessment, not an attribution, and the pack does not name a group.
- Fetched content was treated as data. No instruction-like text was found in any cited snapshot.
Hunt Brief & Attack Chain
Eight hypotheses, ordered by fidelity. Telemetry is named in plain terms first, then by platform.
- H1 (high): a published YobaDropper or YobaLoader hash, or the XMRig payload hash, ran or was written (Q1). T1204.002, T1574.002. FP: none expected. Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); Executable or file write (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents); File hash (CrowdStrike: SHA1HashData. SentinelOne: tgt.process.image.sha1. Defender: SHA1, because SHA256 is usually not populated).
- H2 (high): the persistence host exists: WMPDMC.exe or wmpdui.dll outside the Windows and Media Player folders, or a task for it (Q5, Q6, Q12). T1574.002, T1036.005, T1053.005. FP: very few: a portable media kit. Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); Executable or file write (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents); Scheduled task creation (CrowdStrike: ScheduledTaskRegistered. SentinelOne: Task Register, confirm the spelling on a tenant. Defender: DeviceEvents ScheduledTaskCreated).
- H3 (high): the loader runs inside WMPDMC.exe and talks to Telegram, Google DoH, Catbox or a generated domain (Q7, Q8, Q12). T1102.001, T1568.002, T1071.004, T1105. FP: chat clients and developer tools for Q7 only. DNS lookup with the requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents DnsQueryResponse); Outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents).
- H4 (high): a host connects to the two reported Tor bridge addresses, or to the local SOCKS5 port 9550 (Q9, Q10). T1090.003, T1573.002, T1496. FP: none expected. Outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents); Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents).
- H5 (medium): the signed Setup.exe and a user-path winmm.dll are present together, written by an archive or shell process (Q2, Q3, Q4). T1574.002, T1204.002. FP: games and audio tools that bundle winmm.dll; every Setup.exe in Downloads. Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); Executable or file write (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents).
- H6 (medium): a host shows two or more Yoba stages, so the stage pairing ranks above a single event (Q11). T1574.002, T1053.005, T1102.001. FP: low. Executable or file write (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents); Scheduled task creation (CrowdStrike: ScheduledTaskRegistered. SentinelOne: Task Register, confirm the spelling on a tenant. Defender: DeviceEvents ScheduledTaskCreated); DNS lookup with the requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents DnsQueryResponse).
- H7 (medium): the loader delivered a second payload as a random-named TEMP executable or hidden PowerShell script (Q13). T1059.001, T1553.005. FP: installers and management tools. Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents).
- H8 (low): the WinRing0 driver service was registered for MSR mining tuning (Q14). T1543.003, T1496. FP: hardware tools that bundle WinRing0. Service creation (CrowdStrike: CreateService. SentinelOne: no listed event type, use Windows event 7045. Defender: DeviceRegistryEvents on the Services key).
Attack chain
| Step | What happens | Telemetry | Query |
|---|---|---|---|
| 1 Lure | SEO-poisoned GitHub repositories and GitHub.io pages; ZIP downloaded from a GitHub release | Web proxy and DNS logs (outside endpoint telemetry); file write of the ZIP | N1; hardening T1 |
| 2 Execution | User unzips and runs the signed Setup.exe from Downloads or an extraction folder | Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | Q4 |
| 3 Sideload | The signed binary loads winmm.dll from its own folder; DLL has 180 empty exports | Executable or file write (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents). DLL-load events are not queried here. | Q2, Q3 |
| 4 Pre-checks | DJB2 hash of host name must equal Setup.exe or the DLL sleeps 200,000 x 5.5 s (12.73 days); CIS keyboard layouts skipped; admin required (message shown if not) | Little endpoint telemetry. A long-lived Setup.exe on the failure branch is a gap (section 15). | Q11 note; gap |
| 5 Deploy | Creates ProgramData\WMProcess, copies WMPDMC.exe from System32, writes the decrypted loader as wmpdui.dll | Executable or file write (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents); Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | Q5 |
| 6 Persist | Scheduled task, author Microsoft Corporation, description about Windows Media Player metadata, Local System, boot delay PT3M | Scheduled task creation (CrowdStrike: ScheduledTaskRegistered. SentinelOne: Task Register, confirm the spelling on a tenant. Defender: DeviceEvents ScheduledTaskCreated) | Q6 |
| 7 Tasking | Loader runs only in WMPDMC.exe; Telegram channel picture seeds a DGA; Google DoH TXT lookup; Ed25519-checked, AES-decrypted URL to Catbox | DNS lookup with the requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents DnsQueryResponse); Outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents) | Q7, Q8, Q12 |
| 8 Payload | Method 1 inject into svchost.exe; method 2 TEMP random-name exe after removing Zone.Identifier; method 3 hidden PowerShell script | Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | Q13, Q12 |
| 9 Mining | XMRig 6.26.0 in svchost.exe, bundled Tor 0.4.9.12 and lyrebird 0.8.1, SOCKS5 on 127.0.0.1 port 9550, obfs4 bridges, pauses while the user is active, optional WinRing0 driver | Outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents); Service creation (CrowdStrike: CreateService. SentinelOne: no listed event type, use Windows event 7045. Defender: DeviceRegistryEvents on the Services key) | Q9, Q10, Q14 |
[#1] [#2]
Consolidated IOC Table
Nothing here is prevent. Every atomic indicator is single-sourced to one vendor report, and several rows are legitimate software or services abused by the actor (signed OpenAI and Anthropic binaries, winmm.dll, WMPDMC.exe, svchost.exe, Telegram, Google DoH, Catbox, dedyn.io, stock XMRig). Both IP rows were read from the Check Point IOC table and are IPv4 addresses, not version numbers.
| Type | Value | Confidence | Action | Context |
|---|---|---|---|---|
| Domain | calm-piano-floats-313.dedyn[.]io | medium | detect | The one DGA output Check Point lists. The name rotates with the Telegram picture, so treat it as a sample. The apex dedyn.io is a legitimate service and is never blocked. [#1] |
| Domain | gpt-5-6.github[.]io | medium | detect | Operator GitHub Pages host for the ChatGPT lure. Subdomain only; github.io itself is legitimate. [#1] |
| Domain | gpt-6-astra.github[.]io | medium | detect | Operator GitHub Pages host for the GPT-6 Astra lure. [#1] |
| Domain | opus-5-0.github[.]io | medium | detect | Operator GitHub Pages host for the Claude Opus lure. [#1] |
| IPv4 | 51.89.231[.]85 port 24526 | medium | detect | Tor obfs4 bridge in the payload configuration. Bridge addresses rotate. [#1] |
| IPv4 | 51.89.228[.]250 port 21668 | medium | detect | Tor obfs4 bridge in the payload configuration. [#1] |
| Onion | 3zciedc3enu4muwc5adxciyk6u3juhvhvbv6bfrk2arawlvb7k7ovxad[.]onion port 443 | medium | hunt | TLS mining endpoint reached through the local Tor client. Not importable as a domain row; hunt in proxy or firewall logs only. [#1] |
| Repository | github.com/gpt-5-6/sol-free-desktop, github.com/gpt-5-6/gpt-5-6.github.io, github.com/gpt-6-astra/gpt-6-astra.github.io, github.com/opus-5-0/opus-5-0.github.io | medium | hunt | Attacker-created repositories. Search proxy logs for downloads; never block github.com. [#1] |
| Release ZIP | sol-setup.zip, Setup-Claude.zip, GPT-6-Astra-Setup.zip | medium | hunt | Release asset names. [#1] |
| Telegram | t.me/yoba_fanclub | medium | hunt | Channel whose profile picture seeds the DGA. Telegram is legitimate; hunt for non-browser, non-Telegram processes fetching it. [#1] |
| DoH URL | dns.google/resolve?name=<generated name>&type=TXT | medium | hunt | Google DoH query form used by the loader. Google DNS is legitimate. [#1] |
| URL | files.catbox.moe/z5zpy9.dat | medium | hunt | Payload URL seen in the wild. Catbox is a legitimate file host; the URL path is the indicator. [#1] |
| Hash (SHA-1) | 5 YobaDropper, 9 YobaLoader, 1 injected XMRig payload | medium | detect | Malicious DLLs and payload. Full values in the grab-sha1 block (section 10) and Q1. [#1] |
| Hash (SHA-1) | 2 release ZIPs, 1 Telegram image, 1 encrypted payload file | medium | hunt | Container and data files, not executed images. grab-sha1 block. [#1] |
| Hash (SHA-1) | 2 signed OpenAI and Anthropic binaries | legitimate | hunt | Legitimate signed vendor files. Detect or hunt only, never prevent. Use them to recognise the lure, not to alert. [#1] |
| Path | ProgramData\WMProcess\WMPDMC.exe, ProgramData\WMProcess\wmpdui.dll | high | detect | Persistence host and loader. WMPDMC.exe in System32 is legitimate. [#1] [#3] [#4] |
| Version string | XMRig 6.26.0, Tor 0.4.9.12, lyrebird 0.8.1 | context | none | Software version numbers, not addresses. Not in any IP row. [#1] |
Affected Surface & Telemetry Matrix
| Surface | Telemetry | Priority | Gap risk |
|---|---|---|---|
| Windows endpoints where staff download AI desktop apps (developer and power-user workstations first) | Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); Executable or file write (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents); File hash (CrowdStrike: SHA1HashData. SentinelOne: tgt.process.image.sha1. Defender: SHA1, because SHA256 is usually not populated) | Critical | Signed vendor binary plus a DLL beside it looks normal to reputation checks. The 12.73 day sleep branch leaves a long-lived Setup.exe that process telemetry does not show well. |
| Persistence host under ProgramData | Scheduled task creation (CrowdStrike: ScheduledTaskRegistered. SentinelOne: Task Register, confirm the spelling on a tenant. Defender: DeviceEvents ScheduledTaskCreated); Executable or file write (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents) | High | Task fields vary by sensor version. Test that Q6 returns a benign test task (section 11). |
| Loader tasking and payload download | DNS lookup with the requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents DnsQueryResponse); Outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents) | High | The DoH request is HTTPS to Google and is invisible as DNS content. Only the lookup of dns.google, t.me and files.catbox.moe is visible. Telegram page fetches need a proxy or TLS log, outside endpoint telemetry. |
| Miner and Tor egress | Outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents); Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | High | Injected code inside svchost.exe has no process of its own. Loopback connections may not be logged by the sensor. |
| Web proxy, DNS server and firewall logs | Proxy URL and user-agent logs; DNS resolver logs; firewall flows (outside endpoint telemetry) | Medium | Covers unmanaged hosts and the lure stage, which endpoint telemetry cannot see. |
| GitHub release downloads and search referrals | Proxy logs for github.com release downloads and github.io page visits (outside endpoint telemetry) | Medium | Only visible where the proxy sees the download. |
ATT&CK Mapping
| Tactic | Technique | Observed behavior | Query or control |
|---|---|---|---|
| Resource Development | T1608.006 SEO Poisoning | Fake GitHub projects and Pages sites rank in Google results (Check Point assessment) | N1; Hardening T1 |
| Execution | T1204.002 User Execution: Malicious File | User opens the ZIP and runs the signed Setup.exe | Q4; Hardening T1, T3 |
| Defense Evasion | T1574.002 DLL Side-Loading | Signed Setup.exe loads winmm.dll from its own folder; later WMPDMC.exe loads wmpdui.dll | Q2, Q3, Q5, Q12; Hardening T3, T6 |
| Defense Evasion | T1497.003 Time Based Evasion | 200,000 x Sleep(5500) (12.73 days) when the host name check fails | Q11 note; gap |
| Defense Evasion | T1480 Execution Guardrails | DJB2 host-name check, CIS keyboard-layout check, administrator check | gap (no telemetry) |
| Discovery | T1614.001 System Language Discovery | Keyboard-layout bitmask test for CIS-region languages, Ukrainian excepted | gap (no telemetry) |
| Defense Evasion | T1036.005 Match Legitimate Name or Location | Copy of WMPDMC.exe in ProgramData\WMProcess; task author Microsoft Corporation | Q5, Q6 |
| Persistence | T1053.005 Scheduled Task | SYSTEM task, boot trigger delayed PT3M, launches the copied WMPDMC.exe | Q6; Hardening T4 |
| Defense Evasion | T1140 Deobfuscate/Decode Files or Information | XOR-decrypted strings and embedded payload; AES-ECB response | Q1 |
| Command and Control | T1102.001 Dead Drop Resolver | Telegram channel picture read for seed data; Google DoH TXT record read for tasking | Q7, Q12 |
| Command and Control | T1568.002 Domain Generation Algorithms | adjective-noun-verb-number names under dedyn.io from the last 50 bytes of the picture | Q8 |
| Command and Control | T1071.004 Application Layer Protocol: DNS | TXT record fetched through Google DNS-over-HTTPS | Q7; Hardening T7 |
| Command and Control | T1105 Ingress Tool Transfer | Encrypted payload downloaded from Catbox | Q7, Q12 |
| Execution | T1059.001 PowerShell | Method 3 runs a script with -WindowStyle Hidden -ExecutionPolicy Bypass -File | Q13 |
| Defense Evasion | T1553.005 Mark-of-the-Web Bypass | Zone.Identifier stream removed before method 2 runs the payload | Q13 |
| Defense Evasion | T1055 Process Injection | Method 1 writes the payload into svchost.exe (NtWriteVirtualMemory, NtCreateThreadEx) | gap (no injection telemetry); Q9, Q10 indirect |
| Command and Control | T1090.003 Multi-hop Proxy | Bundled Tor client with obfs4 bridges; SOCKS5 on 127.0.0.1 port 9550 | Q9, Q10 |
| Impact | T1496 Resource Hijacking | XMRig 6.26.0 at about 85 percent CPU threads, pauses while the user is active | Q9, Q10, Q14; Hardening T3 |
| Persistence | T1543.003 Windows Service | Optional WinRing0 driver service for MSR tuning | Q14 |
[#1]
Native Audit-Log Hunts
| ID | Source | What to look for | Pass condition |
|---|---|---|---|
| N1 | Web proxy or secure web gateway logs | Downloads from github.com/<user>/<repo>/releases/download/... of sol-setup.zip, Setup-Claude.zip or GPT-6-Astra-Setup.zip; visits to gpt-5-6.github.io, gpt-6-astra.github.io, opus-5-0.github.io; the four repository paths in section 4. Last 90 days. | No match. Any match: identify the user and host and run Q1 to Q6 on it. |
| N2 | Web proxy or TLS inspection logs | User agent Mozilla/5.0 (Windows NT 10.0; Win64;) (as the loader sends it) fetching t.me/yoba_fanclub; requests to dns.google/resolve with type=TXT from a non-browser client; requests to files.catbox.moe ending .dat. | No match. A Telegram, dns.google and Catbox sequence from one client within minutes is the loader. |
| N3 | Windows Security log event 4698 and Task Scheduler Operational event 106 (enable both first, playbook P3) | A task whose action runs an executable under ProgramData\WMProcess; task author Microsoft Corporation with an action outside the Windows folders; description about collecting device metadata for Windows Media Player; boot trigger delay PT3M; principal SYSTEM. | No match. |
| N4 | Sysmon (event 1 process create, 7 image load, 11 file create) | Event 7: winmm.dll loaded from a path outside the Windows system folders by Setup.exe; wmpdui.dll loaded by a WMPDMC.exe outside System32. Event 11: winmm.dll or wmpdui.dll created in a user or ProgramData folder. | No match. Image-load events are the direct view of the sideload that Falcon CQL here does not query. |
| N5 | Sysmon event 8 (CreateRemoteThread) and event 10 (ProcessAccess), or EDR injection alerts | A source image under ProgramData\WMProcess or a WMPDMC.exe writing into svchost.exe (method 1 uses NtWriteVirtualMemory and NtCreateThreadEx). | No match. |
| N6 | Firewall, NGFW application-ID or NetFlow | Outbound to 51.89.231.85 port 24526 or 51.89.228.250 port 21668; obfs4 or Tor application signatures from servers and workstations that have no Tor use; sustained TLS to an unknown endpoint from svchost.exe. | No Tor traffic outside approved research hosts. |
| N7 | Windows System log event 7045 and Sysmon event 6 (driver loaded) | A service or driver with WinRing0 in its name or path (the payload can load it conditionally). | No match, or a reviewed hardware tool. |
[#1]
Hunt Queries: CrowdStrike CQL, SentinelOne PowerQuery and Defender XDR KQL
Use your tenant's own address. SentinelOne does not document a link that pre-fills a query, so each "Copy & open SentinelOne" button copies the query and opens this console: paste it into PowerQuery.
Pick your portal. Microsoft documents a Share link in advanced hunting but not its URL format, so each "Copy & open Defender" button copies the query and opens Advanced hunting: paste it into the editor.
Fourteen queries. Set the time window with the Falcon time picker. Q1 to Q6, Q8, Q9 and Q12 are the high-fidelity set; Q2, Q3, Q4, Q7, Q13 and Q14 are broader and carry tuning lines inside the query.
Looks for: a published YobaDropper or YobaLoader DLL, or the injected XMRig payload, executed or was written to disk, matched on SHA-1 (the only hash type the report publishes).
Known limitations and deployment notes
- PowerQuery: A sample that is neither started nor written during the window, or whose hash the sensor did not record, is not captured.
- PowerQuery assumes: tgt.process.image.sha1 and tgt.file.sha1 are populated on this tenant.
- PowerQuery assumes: File Creation and File Modification cover the executable-write population the CQL reads.
- KQL – Defender XDR: A sample that is started but never written to disk in the window is not captured: the CQL's process-start hash match has no place in a single-table query.
- KQL – Defender XDR: Advanced Hunting keeps 30 days; the CQL tab covers 90 days.
- KQL – Defender XDR assumes: SHA1 is populated for file events on this tenant.
// HUNT: Published Yoba sample hashes (YobaDropper, YobaLoader, injected XMRig payload) executed or written // MITRE: T1204.002, T1574.002, T1496 // CONF: high FP: low COST: low // REQUIRES: process creation with hash (ProcessRollup2, SyntheticProcessRollup2) or executable write with hash (PeFileWritten, NewExecutableWritten) // FALSE POSITIVES: none expected; each value is a Check Point sample hash of a malicious DLL or of the injected payload // SOURCE: SHA-1 values copied by script from snapshot 01 (one vendor only, so this is a detect, never a block) // LOOKBACK: 90d. Set the window with the Falcon time picker. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|PeFileWritten|NewExecutableWritten)$/ | in(SHA1HashData, values=[ "17e8639a00bb32b10cb9cf0d292e9441456ce4bb", "20238b36645fc63139a76b19a480c6a9166472fa", "4ea5b71202b69fc27b06ef9ee3f6f51d6f7b8586", "60aece343959a2e1840f6aaeffa38b73ed21af2c", "8777db31d8df78f36e4544a132d843dfb2a0f026", "22661f4bada8167fa0f410b75e53184998990abb", "2ecb5548e9774a3d05e8669e8414dcc366929b79", "3fef1af3664429e621d3e0f9408cb5102ef02b84", "55043ea6d102670c014e2be5a8197e70b7c201cb", "79e87a6df59d68b2dbd2c43950df5663d671007c", "7dfcee02732ed89f1ddf25d1689863c26de3df15", "bead5748d813a9828ddb7603a32e52aa15349768", "cf90c4599257e76984a199d98b1fd082b820a54d", "eeedc5c9007d7f01808285e0ae0c0b451bdba003", "ea16728f6928dc77deaddee74a6e736dd5f24fc5" ], ignoreCase=true) | table([@timestamp, aid, ComputerName, UserName, #event_simpleName, FileName, ImageFileName, TargetFileName, SHA1HashData, ParentBaseFileName, ContextBaseFileName, CommandLine], limit=500) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- Process Creation
- File Creation
- File Modification
Required fields
event.time: Event timetgt.process.image.sha1: Started process image hashtgt.file.sha1: Written file hash
Recommended fields
endpoint.name: Host
Optional fields
tgt.file.path: File path. Shown for triage only.
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
tgt.process.image.sha1 = * | limit 5 | columns event.time, tgt.process.image.sha1, tgt.file.sha1
// HUNT: Published Yoba sample hashes (YobaDropper, YobaLoader, injected XMRig payload) executed or written
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1204.002, T1574.002, T1496
// CONF: high | FP: low
// FALSE POSITIVES: none expected; each value is a Check Point sample hash of a malicious DLL or of the injected payload
// EQUIVALENCE: equivalent-with-schema-assumptions - Same published SHA-1 set matched case-insensitively against the hash of a started process or of a written file. The CQL's execution events map to Process Creation image hashes and its executable-write events map to File Creation and File Modification hashes.
// REQUIRES: SentinelOne endpoint telemetry with process image SHA-1 and file SHA-1 populated
// TUNING: None expected: every value is a published sample hash. Ship it as a detect; a miss does not clear a host.
// LOOKBACK: 90d; set the console time picker or query window
// CONFIGURATION: No lookup objects or data tables required.
// KNOWN GAPS: A sample that is neither started nor written during the window, or whose hash the sensor did not record, is not captured.
// VALIDATION LEVEL: static-reviewed
tgt.process.image.sha1 in:anycase ('17e8639a00bb32b10cb9cf0d292e9441456ce4bb', '20238b36645fc63139a76b19a480c6a9166472fa', '4ea5b71202b69fc27b06ef9ee3f6f51d6f7b8586', '60aece343959a2e1840f6aaeffa38b73ed21af2c', '8777db31d8df78f36e4544a132d843dfb2a0f026', '22661f4bada8167fa0f410b75e53184998990abb', '2ecb5548e9774a3d05e8669e8414dcc366929b79', '3fef1af3664429e621d3e0f9408cb5102ef02b84', '55043ea6d102670c014e2be5a8197e70b7c201cb', '79e87a6df59d68b2dbd2c43950df5663d671007c', '7dfcee02732ed89f1ddf25d1689863c26de3df15', 'bead5748d813a9828ddb7603a32e52aa15349768', 'cf90c4599257e76984a199d98b1fd082b820a54d', 'eeedc5c9007d7f01808285e0ae0c0b451bdba003', 'ea16728f6928dc77deaddee74a6e736dd5f24fc5') or tgt.file.sha1 in:anycase ('17e8639a00bb32b10cb9cf0d292e9441456ce4bb', '20238b36645fc63139a76b19a480c6a9166472fa', '4ea5b71202b69fc27b06ef9ee3f6f51d6f7b8586', '60aece343959a2e1840f6aaeffa38b73ed21af2c', '8777db31d8df78f36e4544a132d843dfb2a0f026', '22661f4bada8167fa0f410b75e53184998990abb', '2ecb5548e9774a3d05e8669e8414dcc366929b79', '3fef1af3664429e621d3e0f9408cb5102ef02b84', '55043ea6d102670c014e2be5a8197e70b7c201cb', '79e87a6df59d68b2dbd2c43950df5663d671007c', '7dfcee02732ed89f1ddf25d1689863c26de3df15', 'bead5748d813a9828ddb7603a32e52aa15349768', 'cf90c4599257e76984a199d98b1fd082b820a54d', 'eeedc5c9007d7f01808285e0ae0c0b451bdba003', 'ea16728f6928dc77deaddee74a6e736dd5f24fc5')
| sort -event.time
| limit 500
| columns event.time, endpoint.name, event.type, src.process.user, src.process.name, tgt.process.name, tgt.process.image.path, tgt.process.image.sha1, tgt.process.cmdline, tgt.file.path, tgt.file.sha1Automated validation: static-passed
2 required fields · View requirements
Required telemetry
- DeviceFileEvents
Required fields
Timestamp: Event timeSHA1: File hash
Recommended fields
FolderPath: File path
Optional fields
InitiatingProcessFileName: Writer process
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceFileEvents | where Timestamp > ago(1d) | project Timestamp, SHA1, FileName, FolderPath | take 5
// HUNT: Published Yoba sample hashes (YobaDropper, YobaLoader, injected XMRig payload) executed or written
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1204.002, T1574.002, T1496
// CONF: high | FP: low
// FALSE POSITIVES: none expected; each value is a Check Point sample hash of a malicious DLL or of the injected payload
// EQUIVALENCE: approximate-analytic - The same published SHA-1 set is matched against files written or modified on the device. The CQL also matches started processes; one Advanced Hunting query reads one table, so the process-start half is left to the CQL tab.
// REQUIRES: Defender for Endpoint file telemetry (DeviceFileEvents) with SHA1 populated
// TUNING: None expected: every value is a published sample hash. Ship it as a detect; a miss does not clear a host.
// LOOKBACK: 30d (Advanced Hunting retention; the CQL tab covers 90d)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A sample that is started but never written to disk in the window is not captured: the CQL's process-start hash match has no place in a single-table query. Advanced Hunting keeps 30 days; the CQL tab covers 90 days.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceFileEvents
| where Timestamp >= ago(30d)
| where SHA1 in~ ("17e8639a00bb32b10cb9cf0d292e9441456ce4bb", "20238b36645fc63139a76b19a480c6a9166472fa", "4ea5b71202b69fc27b06ef9ee3f6f51d6f7b8586", "60aece343959a2e1840f6aaeffa38b73ed21af2c", "8777db31d8df78f36e4544a132d843dfb2a0f026", "22661f4bada8167fa0f410b75e53184998990abb", "2ecb5548e9774a3d05e8669e8414dcc366929b79", "3fef1af3664429e621d3e0f9408cb5102ef02b84", "55043ea6d102670c014e2be5a8197e70b7c201cb", "79e87a6df59d68b2dbd2c43950df5663d671007c", "7dfcee02732ed89f1ddf25d1689863c26de3df15", "bead5748d813a9828ddb7603a32e52aa15349768", "cf90c4599257e76984a199d98b1fd082b820a54d", "eeedc5c9007d7f01808285e0ae0c0b451bdba003", "ea16728f6928dc77deaddee74a6e736dd5f24fc5")
| project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, ActionType, FileName, FolderPath, SHA1, InitiatingProcessFileName, InitiatingProcessCommandLine
| sort by Timestamp desc
| take 500Looks for: a host where both a user-path Setup.exe and a user-path winmm.dll appear, which is the shape of the ZIP Check Point describes (a signed Setup.exe beside a malicious winmm.dll). The signed binary is a legitimate vendor file, so this query never alerts on the executable alone. FP: a game or audio tool that bundles its own winmm.dll beside a Setup.exe. Exclude the reviewed folder by full path and confirm with Q3 and Q4.
Known limitations and deployment notes
- PowerQuery: The path is a single sample per host (no collect aggregate), so a host with several folders shows only one of them.
- PowerQuery assumes: Process Creation, File Creation and File Modification cover the CQL's process and executable-write events.
- PowerQuery assumes: matches and contains are case-insensitive by default, which reproduces the CQL /i intent.
- KQL – Defender XDR: A Setup.exe that is started but whose file write is outside the window is not counted.
- KQL – Defender XDR assumes: FolderPath holds the folder of the file; contains is case-insensitive, which reproduces the CQL /i intent.
// HUNT: Setup.exe and winmm.dll seen together in a user-writable path on one host (Yoba DLL sideload pairing) // MITRE: T1574.002, T1204.002 // CONF: medium FP: medium COST: medium // REQUIRES: process creation (ProcessRollup2) and executable write (PeFileWritten, NewExecutableWritten) // FALSE POSITIVES: games and audio tools that ship their own winmm.dll next to an installer named Setup.exe; software packagers staging both files // TUNING: exclude a reviewed installer by full path, for example | path_seen!=/\\YourVendorFolder\\/i ; then require a hit from Q3 or Q4 before escalating. Grouping is per host, not per folder, so read the collected paths to confirm the two files share a folder. // LOOKBACK: 30d. Set the window with the Falcon time picker. #event_simpleName=/^(ProcessRollup2|PeFileWritten|NewExecutableWritten)$/ | FileName=/^(winmm\.dll|setup\.exe)$/i | path_seen := coalesce([TargetFileName, ImageFileName]) | path_seen=/\\(Users|ProgramData)\\/i | path_seen!=/\\(Windows|Program Files)\\/i | lower(FileName, as=NameLc) | groupBy([aid, ComputerName], function=[count(NameLc, distinct=true, as=distinct_names), collect([path_seen]), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen)], limit=1000) | distinct_names = 2 | table([ComputerName, aid, distinct_names, path_seen, FirstSeen, LastSeen], limit=200)
6 required fields · View requirements
Required telemetry
- Process Creation
- File Creation
- File Modification
Required fields
event.time: Event timeevent.type: Event typetgt.process.image.path: Started process pathtgt.file.path: Written file pathendpoint.name: Hostagent.uuid: Stable host id
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' tgt.process.image.path = * | limit 5 | columns event.time, event.type, endpoint.name, agent.uuid, tgt.process.image.path, tgt.file.path
// HUNT: Setup.exe and winmm.dll seen together in a user-writable path on one host (Yoba DLL sideload pairing)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1574.002, T1204.002
// CONF: medium | FP: medium
// FALSE POSITIVES: games and audio tools that ship their own winmm.dll next to an installer named Setup.exe; software packagers staging both files
// EQUIVALENCE: approximate-analytic - Same pairing logic: a host that started or wrote setup.exe and wrote winmm.dll in a per-user or ProgramData folder, outside the Windows and Program Files folders. PowerQuery has no collect aggregate, so the paths are one sample each rather than the full set.
// REQUIRES: SentinelOne process creation and file creation telemetry with image and file paths
// TUNING: Exclude a reviewed installer by full path with a further negated matches clause, then require a hit from the next two cards before escalating. Grouping is per host, not per folder, so read the sample paths to confirm the two files share a folder.
// LOOKBACK: 30d; set the console time picker or query window
// CONFIGURATION: No lookup objects or data tables required.
// KNOWN GAPS: The path is a single sample per host (no collect aggregate), so a host with several folders shows only one of them.
// VALIDATION LEVEL: static-reviewed
event.type in ('Process Creation', 'File Creation', 'File Modification')
(tgt.process.image.path matches ('\\\\setup\\.exe$', '\\\\winmm\\.dll$') or tgt.file.path matches ('\\\\setup\\.exe$', '\\\\winmm\\.dll$'))
(tgt.process.image.path contains ('\\Users\\', '\\ProgramData\\') or tgt.file.path contains ('\\Users\\', '\\ProgramData\\'))
!(tgt.process.image.path contains ('\\Windows\\', '\\Program Files\\') or tgt.file.path contains ('\\Windows\\', '\\Program Files\\'))
| group setup_runs=count(tgt.process.image.path matches '\\\\setup\\.exe$'), setup_writes=count(tgt.file.path matches '\\\\setup\\.exe$'), dll_writes=count(tgt.file.path matches '\\\\winmm\\.dll$'), first_seen=min(event.time), last_seen=max(event.time), process_sample=any(tgt.process.image.path), file_sample=any(tgt.file.path) by endpoint.name, agent.uuid
| filter dll_writes > 0 and (setup_runs > 0 or setup_writes > 0)
| sort -last_seen
| limit 200Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceFileEvents
Required fields
Timestamp: Event timeFileName: File nameFolderPath: File folder
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceFileEvents | where Timestamp > ago(1d) | project Timestamp, FileName, FolderPath | take 5
// HUNT: Setup.exe and winmm.dll seen together in a user-writable path on one host (Yoba DLL sideload pairing)
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1574.002, T1204.002
// CONF: medium | FP: medium
// FALSE POSITIVES: games and audio tools that ship their own winmm.dll next to an installer named Setup.exe; software packagers staging both files
// EQUIVALENCE: approximate-analytic - Same pairing logic over file events only: a device that wrote both setup.exe and winmm.dll in a per-user or ProgramData folder, outside Windows and Program Files. The CQL also counts a started Setup.exe; one query reads one table, so the process-start half is left to the CQL tab.
// REQUIRES: Defender for Endpoint file telemetry (DeviceFileEvents)
// TUNING: Exclude a reviewed installer by FolderPath after a baseline review, then require a hit from the next two cards before escalating. Grouping is per device, so read the collected paths to confirm the two files share a folder.
// LOOKBACK: 30d
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A Setup.exe that is started but whose file write is outside the window is not counted.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed-with-warnings; fixtures=0/0
DeviceFileEvents
| where Timestamp >= ago(30d)
| where FileName in~ ("winmm.dll", "setup.exe")
| where FolderPath contains "\\Users\\" or FolderPath contains "\\ProgramData\\"
| where FolderPath !contains "\\Windows\\" and FolderPath !contains "\\Program Files\\"
| extend NameLc = tolower(FileName)
| summarize DistinctNames = dcount(NameLc), Paths = make_set(FolderPath, 20), FirstSeen = min(Timestamp), LastSeen = max(Timestamp) by DeviceId, DeviceName
| where DistinctNames == 2
| project DeviceName, DeviceId, DistinctNames, Paths, FirstSeen, LastSeen
| sort by LastSeen desc
| take 200Looks for: a winmm.dll PE file landing in a profile or ProgramData folder from an archive tool, Explorer or a browser. Check Point reports the malicious DLL ships inside the GitHub release ZIP, so unpacking is how it reaches disk. FP: game mods and audio wrappers unpacked by Explorer. Exclude the reviewed folder by full path (see the TUNING line in the query).
Known limitations and deployment notes
- PowerQuery: A DLL written by a process outside the listed writer names is not captured.
- PowerQuery assumes: File Creation and File Modification cover the CQL's executable-write events.
- PowerQuery assumes: src.process.name is the writer on a file event.
- PowerQuery assumes: in:anycase reproduces the CQL case-insensitive writer-name match.
- KQL – Defender XDR: A DLL written by a process outside the listed writer names is not captured.
- KQL – Defender XDR: SHA256 is often unpopulated in DeviceFileEvents; SHA1 is the safer pivot.
- KQL – Defender XDR assumes: FolderPath holds the folder of the written file.
- KQL – Defender XDR assumes: ActionType FileCreated and FileModified cover the CQL's executable-write events.
// HUNT: winmm.dll written outside the Windows system folders by an archiver, Explorer or a browser (ZIP from a GitHub release unpacked) // MITRE: T1574.002, T1204.002 // CONF: medium FP: medium COST: low // REQUIRES: executable write with writer process (PeFileWritten, NewExecutableWritten) // FALSE POSITIVES: game mods and audio wrappers unpacked by Explorer or an archiver; legitimate winmm.dll is only in the Windows system folders // TUNING: exclude a reviewed game or tool folder by full path, for example | TargetFileName!=/\\YourGameFolder\\/i . The bare file name winmm.dll is a real Windows DLL name, so never alert on the name alone; the user-path and writer-process conditions are what make this useful. // LOOKBACK: 30d. Set the window with the Falcon time picker. #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ | FileName=/^winmm\.dll$/i | TargetFileName=/\\(Users|ProgramData)\\/i | TargetFileName!=/\\Windows\\(System32|SysWOW64|WinSxS)\\/i | ContextBaseFileName=/^(explorer|7zfm|7zg|7z|winrar|winzip32|winzip64|peazip|bandizip|tar|chrome|msedge|firefox|brave)\.exe$/i | table([@timestamp, aid, ComputerName, UserName, ContextBaseFileName, TargetFileName, SHA1HashData, SHA256HashData], limit=500) | sort(@timestamp, order=desc)
4 required fields · View requirements
Required telemetry
- File Creation
- File Modification
Required fields
event.time: Event timeevent.type: Event typesrc.process.name: Writer processtgt.file.path: Written file path
Recommended fields
endpoint.name: Host
Optional fields
tgt.file.sha1: File hash. Shown for triage only.
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'File Creation' tgt.file.path = * | limit 5 | columns event.time, event.type, src.process.name, tgt.file.path
// HUNT: winmm.dll written outside the Windows system folders by an archiver, Explorer or a browser (ZIP from a GitHub release unpacked)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1574.002, T1204.002
// CONF: medium | FP: medium
// FALSE POSITIVES: game mods and audio wrappers unpacked by Explorer or an archiver; legitimate winmm.dll is only in the Windows system folders
// EQUIVALENCE: equivalent-with-schema-assumptions - Same executable-write predicate: winmm.dll written under a per-user or ProgramData folder, outside the Windows system folders, by an archiver, Explorer or a browser. On a file event the writer is src.process.*.
// REQUIRES: SentinelOne file creation telemetry with the writing process name
// TUNING: Exclude a reviewed game or tool folder by full path with a further negated contains clause. The bare file name is a real Windows DLL name, so never alert on the name alone.
// LOOKBACK: 30d; set the console time picker or query window
// CONFIGURATION: No lookup objects or data tables required.
// KNOWN GAPS: A DLL written by a process outside the listed writer names is not captured.
// VALIDATION LEVEL: static-reviewed
event.type in ('File Creation', 'File Modification')
tgt.file.path matches '\\\\winmm\\.dll$'
tgt.file.path contains ('\\Users\\', '\\ProgramData\\')
!(tgt.file.path contains ('\\Windows\\System32\\', '\\Windows\\SysWOW64\\', '\\Windows\\WinSxS\\'))
src.process.name in:anycase ('explorer.exe', '7zfm.exe', '7zg.exe', '7z.exe', 'winrar.exe', 'winzip32.exe', 'winzip64.exe', 'peazip.exe', 'bandizip.exe', 'tar.exe', 'chrome.exe', 'msedge.exe', 'firefox.exe', 'brave.exe')
| sort -event.time
| limit 500
| columns event.time, endpoint.name, src.process.user, src.process.name, tgt.file.path, tgt.file.sha1, tgt.file.sha256Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceFileEvents
Required fields
Timestamp: Event timeFileName: Written file nameFolderPath: Written file folderInitiatingProcessFileName: Writer process
Recommended fields
ActionType: Action
Optional fields
SHA256: Hash. SHA256 is often unpopulated in DeviceFileEvents; SHA1 is the safer pivot.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceFileEvents | where Timestamp > ago(1d) | project Timestamp, FileName, FolderPath, InitiatingProcessFileName | take 5
// HUNT: winmm.dll written outside the Windows system folders by an archiver, Explorer or a browser (ZIP from a GitHub release unpacked)
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1574.002, T1204.002
// CONF: medium | FP: medium
// FALSE POSITIVES: game mods and audio wrappers unpacked by Explorer or an archiver; legitimate winmm.dll is only in the Windows system folders
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate on file events: winmm.dll written or modified under a per-user or ProgramData folder, outside the Windows system folders, by an archiver, Explorer or a browser. The writer is InitiatingProcessFileName.
// REQUIRES: Defender for Endpoint file telemetry (DeviceFileEvents)
// TUNING: Exclude a reviewed game or tool folder by FolderPath after a baseline review. The bare file name is a real Windows DLL name, so never alert on the name alone.
// LOOKBACK: 30d
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A DLL written by a process outside the listed writer names is not captured. SHA256 is often unpopulated in DeviceFileEvents; SHA1 is the safer pivot.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceFileEvents
| where Timestamp >= ago(30d)
| where ActionType in ("FileCreated", "FileModified")
| where FileName =~ "winmm.dll"
| where FolderPath contains "\\Users\\" or FolderPath contains "\\ProgramData\\"
| where FolderPath !contains "\\Windows\\System32\\" and FolderPath !contains "\\Windows\\SysWOW64\\" and FolderPath !contains "\\Windows\\WinSxS\\"
| where InitiatingProcessFileName in~ ("explorer.exe", "7zfm.exe", "7zg.exe", "7z.exe", "winrar.exe", "winzip32.exe", "winzip64.exe", "peazip.exe", "bandizip.exe", "tar.exe", "chrome.exe", "msedge.exe", "firefox.exe", "brave.exe")
| project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, FolderPath, SHA1, SHA256
| sort by Timestamp desc
| take 500Looks for: the execution step of the lure: a signed installer started from the place a downloaded ZIP is opened. Check Point names the ZIPs sol-setup.zip, Setup-Claude.zip and GPT-6-Astra-Setup.zip; a folder with the same stem is a stronger lead. FP: every ordinary installer called Setup.exe that runs from Downloads. Treat a hit as a lead and confirm with Q2 or Q3 on the same host.
Known limitations and deployment notes
- PowerQuery: Low confidence and high false-positive risk, as on the CQL tab: a triage lead, not an alert.
- PowerQuery assumes: tgt.process.name holds the bare file name of the started process.
- PowerQuery assumes: matches is case-insensitive by default, which reproduces the CQL /i intent.
- KQL – Defender XDR: Low confidence and high false-positive risk, as on the CQL tab: a triage lead, not an alert.
- KQL – Defender XDR assumes: FolderPath holds the full image path of the created process.
// HUNT: Setup.exe launched from a ZIP extraction folder, Downloads or Desktop, or from a folder named after a Yoba lure ZIP // MITRE: T1204.002, T1574.002 // CONF: low FP: high COST: low // REQUIRES: process creation with image path, parent and hash (ProcessRollup2, SyntheticProcessRollup2) // FALSE POSITIVES: any legitimate installer named Setup.exe that a user runs from Downloads or an unpacked ZIP; this is a triage lead, not an alert // TUNING: join the hit to Q3 on the same aid and folder before escalating; exclude installers whose SHA1HashData matches an approved package, for example | SHA1HashData!=/^(REPLACE_WITH_APPROVED_SHA1)$/i ; the two signed binaries Check Point lists are legitimate vendor files, so their hashes alone are not a verdict. // LOOKBACK: 30d. Set the window with the Falcon time picker. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^setup\.exe$/i | ImageFileName=/\\(Downloads|Desktop)\\|\\Temp\\Temp[0-9]+_[^\\]+\.zip\\|\\(sol-setup|gpt-6-astra-setup|setup-claude)\\/i | table([@timestamp, aid, ComputerName, UserName, ImageFileName, CommandLine, ParentBaseFileName, SHA1HashData], limit=500) | sort(@timestamp, order=desc)
4 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.time: Event timeevent.type: Event typetgt.process.name: Started process nametgt.process.image.path: Started process path
Recommended fields
src.process.name: Creator process
Optional fields
tgt.process.image.sha1: Hash. Population on a given tenant is worth a readiness test.
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' tgt.process.name = * | limit 5 | columns event.time, event.type, tgt.process.name, tgt.process.image.path
// HUNT: Setup.exe launched from a ZIP extraction folder, Downloads or Desktop, or from a folder named after a Yoba lure ZIP
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1204.002, T1574.002
// CONF: low | FP: high
// FALSE POSITIVES: any legitimate installer named Setup.exe that a user runs from Downloads or an unpacked ZIP; this is a triage lead, not an alert
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: setup.exe started from a Downloads or Desktop folder, a ZIP extraction folder, or a folder named after a lure ZIP. On Process Creation the started process is tgt.process.* and its creator is src.process.*.
// REQUIRES: SentinelOne process creation telemetry with image path and command line
// TUNING: Join the hit to the previous card on the same host and folder before escalating; exclude installers whose tgt.process.image.sha1 matches an approved package. The two signed binaries the report lists are legitimate vendor files, so their hashes alone are not a verdict.
// LOOKBACK: 30d; set the console time picker or query window
// CONFIGURATION: No lookup objects or data tables required.
// KNOWN GAPS: Low confidence and high false-positive risk, as on the CQL tab: a triage lead, not an alert.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation'
tgt.process.name in:anycase ('setup.exe')
tgt.process.image.path matches ('\\\\(Downloads|Desktop)\\\\', '\\\\Temp\\\\Temp[0-9]+_[^\\\\]+\\.zip\\\\', '\\\\(sol-setup|gpt-6-astra-setup|setup-claude)\\\\')
| sort -event.time
| limit 500
| columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.image.path, tgt.process.cmdline, tgt.process.image.sha1Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeFileName: Created process nameFolderPath: Created process path
Recommended fields
InitiatingProcessFileName: Initiating process
Optional fields
SHA1: Hash. SHA1 is the safer hash pivot in this table.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, FileName, FolderPath, ProcessCommandLine | take 5
// HUNT: Setup.exe launched from a ZIP extraction folder, Downloads or Desktop, or from a folder named after a Yoba lure ZIP // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1204.002, T1574.002 // CONF: low | FP: high // FALSE POSITIVES: any legitimate installer named Setup.exe that a user runs from Downloads or an unpacked ZIP; this is a triage lead, not an alert // EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: setup.exe started from a Downloads or Desktop folder, a ZIP extraction folder, or a folder named after a lure ZIP. The created process is FileName and FolderPath; its creator is InitiatingProcessFileName. // REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents) // TUNING: Join the hit to the previous card on the same device and folder before escalating; exclude installers whose SHA1 matches an approved package. // LOOKBACK: 30d // CONFIGURATION: No lookup objects required. // KNOWN GAPS: Low confidence and high false-positive risk, as on the CQL tab: a triage lead, not an alert. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceProcessEvents | where Timestamp >= ago(30d) | where FileName =~ "setup.exe" | where FolderPath matches regex @"(?i)\\(Downloads|Desktop)\\|\\Temp\\Temp[0-9]+_[^\\]+\.zip\\|\\(sol-setup|gpt-6-astra-setup|setup-claude)\\" | project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FolderPath, ProcessCommandLine, SHA1 | sort by Timestamp desc | take 500
Looks for: the persistence host: a copy of the Windows Media Player metadata executable, or a wmpdui.dll, in a folder such as ProgramData\WMProcess. YobaLoader only runs when its host process is WMPDMC.exe.
Known limitations and deployment notes
- PowerQuery: A wmpdui.dll that is loaded but neither written nor started in the window is not captured.
- PowerQuery assumes: The image path of a started process and the path of a written file include the file name.
- PowerQuery assumes: Process Creation, File Creation and File Modification cover the CQL's process and executable-write events.
- KQL – Defender XDR: A copy of wmpdmc.exe that is started but whose write is outside the window is not captured.
- KQL – Defender XDR: Advanced Hunting keeps 30 days; the CQL tab covers 90 days.
- KQL – Defender XDR assumes: FolderPath holds the folder of the file.
// HUNT: WMPDMC.exe copy or wmpdui.dll written or run outside the Windows system and Media Player folders (YobaLoader sideload host) // MITRE: T1574.002, T1036.005, T1053.005 // CONF: high FP: low COST: low // REQUIRES: process creation (ProcessRollup2, SyntheticProcessRollup2) and executable write (PeFileWritten, NewExecutableWritten) // FALSE POSITIVES: very few; a portable media-player kit or a lab copy of the Windows file. Both names are real Windows files, so the folder condition is the signal, never the name. // SOURCE: Check Point (snapshot 01): the dropper copies WMPDMC.exe from System32 into ProgramData\WMProcess and writes the loader there as wmpdui.dll // LOOKBACK: 90d. Set the window with the Falcon time picker. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|PeFileWritten|NewExecutableWritten)$/ | FileName=/^(wmpdmc\.exe|wmpdui\.dll)$/i | path_seen := coalesce([ImageFileName, TargetFileName]) | path_seen!=/\\Windows\\(System32|SysWOW64|WinSxS)\\/i | path_seen!=/\\Program Files( \(x86\))?\\Windows Media Player\\/i | table([@timestamp, aid, ComputerName, UserName, #event_simpleName, FileName, path_seen, ParentBaseFileName, ContextBaseFileName, SHA1HashData], limit=500) | sort(@timestamp, order=desc)
4 required fields · View requirements
Required telemetry
- Process Creation
- File Creation
- File Modification
Required fields
event.time: Event timeevent.type: Event typetgt.process.image.path: Started process pathtgt.file.path: Written file path
Recommended fields
endpoint.name: Host
Optional fields
tgt.file.sha1: Hash. Shown for triage only.
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' tgt.process.image.path = * | limit 5 | columns event.time, event.type, tgt.process.image.path, tgt.file.path
// HUNT: WMPDMC.exe copy or wmpdui.dll written or run outside the Windows system and Media Player folders (YobaLoader sideload host)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1574.002, T1036.005, T1053.005
// CONF: high | FP: low
// FALSE POSITIVES: very few; a portable media-player kit or a lab copy of the Windows file. Both names are real Windows files, so the folder condition is the signal, never the name.
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: wmpdmc.exe or wmpdui.dll started or written outside the Windows system and Media Player folders. A started process is tgt.process.* on Process Creation; a written file is tgt.file.* on File Creation and File Modification.
// REQUIRES: SentinelOne process creation and file creation telemetry with paths
// TUNING: Both names are real Windows files, so the folder condition is the signal, never the name. Exclude a reviewed portable media-player kit by full path.
// LOOKBACK: 90d; set the console time picker or query window
// CONFIGURATION: No lookup objects or data tables required.
// KNOWN GAPS: A wmpdui.dll that is loaded but neither written nor started in the window is not captured.
// VALIDATION LEVEL: static-reviewed
((event.type = 'Process Creation' and tgt.process.image.path matches ('\\\\wmpdmc\\.exe$', '\\\\wmpdui\\.dll$')) or (event.type in ('File Creation', 'File Modification') and tgt.file.path matches ('\\\\wmpdmc\\.exe$', '\\\\wmpdui\\.dll$')))
!(tgt.process.image.path contains ('\\Windows\\System32\\', '\\Windows\\SysWOW64\\', '\\Windows\\WinSxS\\', '\\Program Files\\Windows Media Player\\', '\\Program Files (x86)\\Windows Media Player\\') or tgt.file.path contains ('\\Windows\\System32\\', '\\Windows\\SysWOW64\\', '\\Windows\\WinSxS\\', '\\Program Files\\Windows Media Player\\', '\\Program Files (x86)\\Windows Media Player\\'))
| sort -event.time
| limit 500
| columns event.time, endpoint.name, src.process.user, event.type, tgt.process.image.path, tgt.file.path, src.process.name, tgt.process.image.sha1, tgt.file.sha1Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceFileEvents
Required fields
Timestamp: Event timeFileName: File nameFolderPath: File folder
Recommended fields
InitiatingProcessFileName: Writer process
Optional fields
SHA1: Hash. SHA1 is the safer hash pivot in this table.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceFileEvents | where Timestamp > ago(1d) | project Timestamp, FileName, FolderPath, InitiatingProcessFileName | take 5
// HUNT: WMPDMC.exe copy or wmpdui.dll written or run outside the Windows system and Media Player folders (YobaLoader sideload host)
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1574.002, T1036.005, T1053.005
// CONF: high | FP: low
// FALSE POSITIVES: very few; a portable media-player kit or a lab copy of the Windows file. Both names are real Windows files, so the folder condition is the signal, never the name.
// EQUIVALENCE: approximate-analytic - Same folder-based predicate over file events: wmpdmc.exe or wmpdui.dll written outside the Windows system and Media Player folders. The CQL also matches a started process; one query reads one table, so the process-start half is left to the CQL tab.
// REQUIRES: Defender for Endpoint file telemetry (DeviceFileEvents)
// TUNING: Both names are real Windows files, so the folder condition is the signal, never the name. Exclude a reviewed portable media-player kit by FolderPath.
// LOOKBACK: 30d (Advanced Hunting retention; the CQL tab covers 90d)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A copy of wmpdmc.exe that is started but whose write is outside the window is not captured. Advanced Hunting keeps 30 days; the CQL tab covers 90 days.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceFileEvents
| where Timestamp >= ago(30d)
| where FileName in~ ("wmpdmc.exe", "wmpdui.dll")
| where FolderPath !contains "\\Windows\\System32\\" and FolderPath !contains "\\Windows\\SysWOW64\\" and FolderPath !contains "\\Windows\\WinSxS\\"
| where FolderPath !contains "\\Program Files\\Windows Media Player\\" and FolderPath !contains "\\Program Files (x86)\\Windows Media Player\\"
| project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, ActionType, FileName, FolderPath, InitiatingProcessFileName, SHA1
| sort by Timestamp desc
| take 500Looks for: the scheduled task the dropper creates so the copied WMPDMC.exe starts three minutes after every boot and sideloads the loader. The task is dressed up with Microsoft as author, so match on the executable path, not the author.
Known limitations and deployment notes
- PowerQuery: The task registration, the author field and the delayed boot trigger are not visible; a task that never fires in the window is not captured.
- PowerQuery assumes: The image path of a started process includes the file name.
- KQL – Defender XDR: The task registration, the author field and the delayed boot trigger are not visible.
- KQL – Defender XDR: Advanced Hunting keeps 30 days; the CQL tab covers 90 days.
- KQL – Defender XDR assumes: FolderPath holds the full image path of the created process.
// HUNT: Scheduled task registered to launch WMPDMC.exe from ProgramData\WMProcess (YobaDropper persistence) // MITRE: T1053.005, T1036.005 // CONF: high FP: low COST: low // REQUIRES: scheduled task registration with task executable (ScheduledTaskRegistered) // FALSE POSITIVES: none expected; no Windows component registers a task for a WMPDMC.exe outside System32 // SOURCE: Check Point (snapshot 01): task author set to Microsoft Corporation, runs as Local System, boot trigger delayed 3 minutes (PT3M) // LOOKBACK: 90d. Set the window with the Falcon time picker. #event_simpleName=ScheduledTaskRegistered | TaskExecutable=/\\ProgramData\\WMProcess\\|%ProgramData%\\WMProcess\\|\\wmpdmc\.exe$/i | TaskExecutable!=/^(C:)?\\Windows\\System32\\wmpdmc\.exe$/i | table([@timestamp, aid, ComputerName, UserName, TaskName, TaskExecutable, TaskAuthor], limit=500) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.time: Event timeevent.type: Event typetgt.process.image.path: Started process path
Recommended fields
src.process.name: Creator process
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' tgt.process.image.path = * | limit 5 | columns event.time, event.type, tgt.process.image.path
// HUNT: Scheduled task registered to launch WMPDMC.exe from ProgramData\WMProcess (YobaDropper persistence)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1053.005, T1036.005
// CONF: high | FP: low
// FALSE POSITIVES: none expected; no Windows component registers a task for a WMPDMC.exe outside System32
// EQUIVALENCE: telemetry-gap - No task-registration event is attested for SentinelOne here, so this is a partial pivot: it finds wmpdmc.exe started from the ProgramData WMProcess folder, which is what the registered task eventually runs. The registration itself, its author and its boot trigger are not visible.
// REQUIRES: SentinelOne process creation telemetry with image path
// TUNING: None expected: no Windows component runs wmpdmc.exe from outside System32. Read the creator in src.process.name to see whether the task scheduler started it.
// LOOKBACK: 90d; set the console time picker or query window
// CONFIGURATION: No lookup objects or data tables required.
// KNOWN GAPS: The task registration, the author field and the delayed boot trigger are not visible; a task that never fires in the window is not captured.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation'
tgt.process.image.path matches ('\\\\ProgramData\\\\WMProcess\\\\', '\\\\wmpdmc\\.exe$')
!(tgt.process.image.path matches '^(C:)?\\\\Windows\\\\System32\\\\wmpdmc\\.exe$')
| sort -event.time
| limit 500
| columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.image.path, tgt.process.cmdline, tgt.process.image.sha1Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeFileName: Created process nameFolderPath: Created process path
Recommended fields
InitiatingProcessFileName: Initiating process
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, FileName, FolderPath, ProcessCommandLine | take 5
// HUNT: Scheduled task registered to launch WMPDMC.exe from ProgramData\WMProcess (YobaDropper persistence) // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1053.005, T1036.005 // CONF: high | FP: low // FALSE POSITIVES: none expected; no Windows component registers a task for a WMPDMC.exe outside System32 // EQUIVALENCE: telemetry-gap - Defender Advanced Hunting has no scheduled-task registration table with a task executable, so this is a partial pivot: it finds wmpdmc.exe started from the ProgramData WMProcess folder, which is what the registered task eventually runs. The registration itself is not visible. // REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents) // TUNING: None expected: no Windows component runs wmpdmc.exe from outside System32. Read InitiatingProcessFileName to see whether the task scheduler started it. // LOOKBACK: 30d (Advanced Hunting retention; the CQL tab covers 90d) // CONFIGURATION: No lookup objects required. // KNOWN GAPS: The task registration, the author field and the delayed boot trigger are not visible. Advanced Hunting keeps 30 days; the CQL tab covers 90 days. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceProcessEvents | where Timestamp >= ago(30d) | where FolderPath contains "\\ProgramData\\WMProcess\\" or FileName =~ "wmpdmc.exe" | where FolderPath !~ "C:\\Windows\\System32\\wmpdmc.exe" | project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FolderPath, ProcessCommandLine, SHA1 | sort by Timestamp desc | take 500
Looks for: the loader's three-service chain seen from a single non-browser process: Telegram channel page, Google DNS-over-HTTPS TXT lookup, Catbox payload host. The DoH request itself is HTTPS, so DNS telemetry shows only the lookup of dns.google. FP: chat clients and developer tools that legitimately reach these services. Add the reviewed process to the exclusion list (see TUNING in the query).
Known limitations and deployment notes
- PowerQuery: Only one of the matching names is shown per row; the count of distinct services is exact.
- PowerQuery assumes: event.dns.request is populated on DNS Resolved events (the vendor docs also name dns.request; check which one your tenant fills).
- PowerQuery assumes: estimate_distinct is exact at this cardinality, and the request name arrives in one letter case.
- PowerQuery assumes: domain_sample shows one of the names, not the full set (no collect aggregate).
- KQL – Defender XDR: DnsQueryResponse events are not recorded for every resolver path, so a lookup the sensor did not log is not captured.
- KQL – Defender XDR assumes: DnsQueryResponse events carry the queried name under DnsQueryString or QueryName in AdditionalFields; the readiness test prints both so a reader can see which key the tenant fills.
// HUNT: One non-browser process resolving two or more of t.me, dns.google and files.catbox.moe (YobaLoader Telegram, DoH, Catbox chain) // MITRE: T1102.001, T1071.004, T1105 // CONF: medium FP: medium COST: medium // REQUIRES: DNS lookup with requesting process name (DnsRequest) // FALSE POSITIVES: chat clients, download managers and developer tools that use Telegram, Google DNS-over-HTTPS or Catbox legitimately // TUNING: add the reviewed process to the exclusion list, for example | ContextBaseFileName!=/^(YourChatClient)\.exe$/i ; raise the threshold to three distinct names to cut noise further. Q12 is the higher-fidelity variant for the WMPDMC.exe host. // LOOKBACK: 30d. Set the window with the Falcon time picker. #event_simpleName=DnsRequest | DomainName=/^(t\.me|dns\.google|files\.catbox\.moe)$/i | ContextBaseFileName!=/^(chrome|msedge|msedgewebview2|firefox|brave|opera|vivaldi|iexplore|telegram|teams|slack|discord|code)\.exe$/i | lower(DomainName, as=Svc) | groupBy([aid, ComputerName, ContextBaseFileName], function=[count(Svc, distinct=true, as=ServicesSeen), collect([DomainName]), count(as=Lookups), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen)], limit=1000) | ServicesSeen >= 2 | table([ComputerName, aid, ContextBaseFileName, ServicesSeen, DomainName, Lookups, FirstSeen, LastSeen], limit=200)
6 required fields · View requirements
Required telemetry
- DNS Resolved
Required fields
event.time: Event timeevent.type: Event typeevent.dns.request: Requested namesrc.process.name: Resolving processendpoint.name: Hostagent.uuid: Stable host id
Fallbacks
event.dns.request→dns.request: Some schema versions name the request field differently; check which is populated.
Readiness test
event.type = 'DNS Resolved' event.dns.request = * | limit 5 | columns event.time, event.type, endpoint.name, agent.uuid, src.process.name, event.dns.request
// HUNT: One non-browser process resolving two or more of t.me, dns.google and files.catbox.moe (YobaLoader Telegram, DoH, Catbox chain)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1102.001, T1071.004, T1105
// CONF: medium | FP: medium
// FALSE POSITIVES: chat clients, download managers and developer tools that use Telegram, Google DNS-over-HTTPS or Catbox legitimately
// EQUIVALENCE: equivalent-with-schema-assumptions - Same logic: per host and per resolving process, count the distinct services among t.me, dns.google and files.catbox.moe, excluding the browsers and chat clients, and keep two or more. On a DNS event the resolving process is src.process.*.
// REQUIRES: SentinelOne DNS Resolved telemetry with the resolving process name
// TUNING: Add a reviewed process to the exclusion list with a further name in the in:anycase list; raise the threshold to three distinct names to cut noise. The WMPDMC-specific card is the higher-fidelity variant.
// LOOKBACK: 30d; set the console time picker or query window
// CONFIGURATION: No lookup objects or data tables required.
// KNOWN GAPS: Only one of the matching names is shown per row; the count of distinct services is exact.
// VALIDATION LEVEL: static-reviewed
event.type = 'DNS Resolved'
event.dns.request in:anycase ('t.me', 'dns.google', 'files.catbox.moe')
!(src.process.name in:anycase ('chrome.exe', 'msedge.exe', 'msedgewebview2.exe', 'firefox.exe', 'brave.exe', 'opera.exe', 'vivaldi.exe', 'iexplore.exe', 'telegram.exe', 'teams.exe', 'slack.exe', 'discord.exe', 'code.exe'))
| group services_seen=estimate_distinct(event.dns.request), lookups=count(), domain_sample=any(event.dns.request), first_seen=min(event.time), last_seen=max(event.time) by endpoint.name, agent.uuid, src.process.name
| filter services_seen >= 2
| sort -last_seen
| limit 200Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceEvents
Required fields
Timestamp: Event timeActionType: Action typeAdditionalFields: DNS detailInitiatingProcessFileName: Resolving process
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceEvents | where Timestamp > ago(1d) | where ActionType == "DnsQueryResponse" | project Timestamp, ActionType, AdditionalFields, InitiatingProcessFileName | take 5
// HUNT: One non-browser process resolving two or more of t.me, dns.google and files.catbox.moe (YobaLoader Telegram, DoH, Catbox chain)
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1102.001, T1071.004, T1105
// CONF: medium | FP: medium
// FALSE POSITIVES: chat clients, download managers and developer tools that use Telegram, Google DNS-over-HTTPS or Catbox legitimately
// EQUIVALENCE: equivalent-with-schema-assumptions - Same logic over DnsQueryResponse events in DeviceEvents: per device and process, count the distinct services among t.me, dns.google and files.catbox.moe, excluding the browsers and chat clients, and keep two or more. The name is read from AdditionalFields because Defender has no endpoint DNS table.
// REQUIRES: Defender for Endpoint DNS events (DeviceEvents, ActionType DnsQueryResponse)
// TUNING: Add a reviewed process to the exclusion list; raise the threshold to three distinct names to cut noise.
// LOOKBACK: 30d
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: DnsQueryResponse events are not recorded for every resolver path, so a lookup the sensor did not log is not captured.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed-with-warnings; fixtures=0/0
DeviceEvents
| where Timestamp >= ago(30d)
| where ActionType == "DnsQueryResponse"
| extend DnsName = tolower(tostring(coalesce(parse_json(AdditionalFields)["DnsQueryString"], parse_json(AdditionalFields)["QueryName"])))
| where DnsName in ("t.me", "dns.google", "files.catbox.moe")
| where InitiatingProcessFileName !in~ ("chrome.exe", "msedge.exe", "msedgewebview2.exe", "firefox.exe", "brave.exe", "opera.exe", "vivaldi.exe", "iexplore.exe", "telegram.exe", "teams.exe", "slack.exe", "discord.exe", "code.exe")
| summarize ServicesSeen = dcount(DnsName), Lookups = count(), DomainsSeen = make_set(DnsName), FirstSeen = min(Timestamp), LastSeen = max(Timestamp) by DeviceId, DeviceName, InitiatingProcessFileName
| where ServicesSeen >= 2
| project DeviceName, DeviceId, InitiatingProcessFileName, ServicesSeen, DomainsSeen, Lookups, FirstSeen, LastSeen
| sort by LastSeen desc
| take 200Looks for: the loader's generated domain. The name is adjective-noun-verb-number from three fixed lists, so the pattern is far narrower than a generic dynamic-DNS hunt. The apex dedyn.io is a legitimate free DNS service and is never blocked here.
Known limitations and deployment notes
- PowerQuery: A domain built from word lists outside the reported ones is not captured.
- PowerQuery assumes: event.dns.request is populated on DNS Resolved events (the vendor docs also name dns.request; check which one your tenant fills).
- PowerQuery assumes: matches is case-insensitive by default, which reproduces the CQL /i intent.
- KQL – Defender XDR: Advanced Hunting keeps 30 days; the CQL tab covers 90 days.
- KQL – Defender XDR: A domain built from word lists outside the reported ones is not captured.
- KQL – Defender XDR assumes: DnsQueryResponse events carry the queried name under DnsQueryString or QueryName in AdditionalFields; the readiness test prints both so a reader can see which key the tenant fills.
// HUNT: Lookup of a domain built from the Yoba DGA word lists under dedyn.io, or the early-variant aber.ir suffix, or the one reported sample domain // MITRE: T1568.002, T1102.001 // CONF: medium FP: low COST: low // REQUIRES: DNS lookup with requesting process name (DnsRequest) // FALSE POSITIVES: near none; the pattern needs three specific dictionary words and a number under a dynamic-DNS suffix. The operator can change the word lists, so a miss does not clear a host. // SOURCE: word lists and name format from the DGA snippet in Check Point (snapshot 01); calm-piano-floats-313 is the one sample the report lists // LOOKBACK: 90d. Set the window with the Falcon time picker. #event_simpleName=DnsRequest | DomainName=/^(silver|amber|wild|tiny|brave|lucky|calm|sharp|swift|bright|quiet|bold|gentle|fierce|royal|mystic|username|degenerate|allblack|kizta|graf)-(tiger|river|stone|cloud|wolf|ocean|forest|mountain|eagle|raven|ember|comet|fox|dragon|piano|viper|yoba|yyoba|static|cpp|example)-(runs|jumps|sings|sleeps|flies|hunts|burns|floats|shines|whispers|roars|dreams|strikes|glides|watches|hides|duty|free)-[0-9]{1,3}\.(dedyn\.io|aber\.ir)$/i | table([@timestamp, aid, ComputerName, UserName, DomainName, ContextBaseFileName], limit=500) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- DNS Resolved
Required fields
event.time: Event timeevent.type: Event typeevent.dns.request: Requested name
Recommended fields
src.process.name: Resolving process
Fallbacks
event.dns.request→dns.request: Some schema versions name the request field differently; check which is populated.
Readiness test
event.type = 'DNS Resolved' event.dns.request = * | limit 5 | columns event.time, event.type, src.process.name, event.dns.request
// HUNT: Lookup of a domain built from the Yoba DGA word lists under dedyn.io, or the early-variant aber.ir suffix, or the one reported sample domain
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1568.002, T1102.001
// CONF: medium | FP: low
// FALSE POSITIVES: near none; the pattern needs three specific dictionary words and a number under a dynamic-DNS suffix. The operator can change the word lists, so a miss does not clear a host.
// EQUIVALENCE: equivalent-with-schema-assumptions - Same anchored name pattern: three dictionary words and a one to three digit number under dedyn.io or aber.ir, matched against the DNS request name.
// REQUIRES: SentinelOne DNS Resolved telemetry with the requested name
// TUNING: Near none expected. The operator can change the word lists, so a miss does not clear a host.
// LOOKBACK: 90d; set the console time picker or query window
// CONFIGURATION: No lookup objects or data tables required.
// KNOWN GAPS: A domain built from word lists outside the reported ones is not captured.
// VALIDATION LEVEL: static-reviewed
event.type = 'DNS Resolved'
event.dns.request matches '^(silver|amber|wild|tiny|brave|lucky|calm|sharp|swift|bright|quiet|bold|gentle|fierce|royal|mystic|username|degenerate|allblack|kizta|graf)-(tiger|river|stone|cloud|wolf|ocean|forest|mountain|eagle|raven|ember|comet|fox|dragon|piano|viper|yoba|yyoba|static|cpp|example)-(runs|jumps|sings|sleeps|flies|hunts|burns|floats|shines|whispers|roars|dreams|strikes|glides|watches|hides|duty|free)-[0-9]{1,3}\\.(dedyn\\.io|aber\\.ir)$'
| sort -event.time
| limit 500
| columns event.time, endpoint.name, src.process.user, src.process.name, event.dns.requestAutomated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceEvents
Required fields
Timestamp: Event timeActionType: Action typeAdditionalFields: DNS detail
Recommended fields
InitiatingProcessFileName: Resolving process
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceEvents | where Timestamp > ago(1d) | where ActionType == "DnsQueryResponse" | project Timestamp, ActionType, AdditionalFields | take 5
// HUNT: Lookup of a domain built from the Yoba DGA word lists under dedyn.io, or the early-variant aber.ir suffix, or the one reported sample domain
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1568.002, T1102.001
// CONF: medium | FP: low
// FALSE POSITIVES: near none; the pattern needs three specific dictionary words and a number under a dynamic-DNS suffix. The operator can change the word lists, so a miss does not clear a host.
// EQUIVALENCE: equivalent-with-schema-assumptions - Same anchored name pattern over DnsQueryResponse events in DeviceEvents: three dictionary words and a one to three digit number under dedyn.io or aber.ir. The name is read from AdditionalFields because Defender has no endpoint DNS table.
// REQUIRES: Defender for Endpoint DNS events (DeviceEvents, ActionType DnsQueryResponse)
// TUNING: Near none expected. The operator can change the word lists, so a miss does not clear a host.
// LOOKBACK: 30d (Advanced Hunting retention; the CQL tab covers 90d)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: Advanced Hunting keeps 30 days; the CQL tab covers 90 days. A domain built from word lists outside the reported ones is not captured.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceEvents
| where Timestamp >= ago(30d)
| where ActionType == "DnsQueryResponse"
| extend DnsName = tolower(tostring(coalesce(parse_json(AdditionalFields)["DnsQueryString"], parse_json(AdditionalFields)["QueryName"])))
| where DnsName matches regex @"(?i)^(silver|amber|wild|tiny|brave|lucky|calm|sharp|swift|bright|quiet|bold|gentle|fierce|royal|mystic|username|degenerate|allblack|kizta|graf)-(tiger|river|stone|cloud|wolf|ocean|forest|mountain|eagle|raven|ember|comet|fox|dragon|piano|viper|yoba|yyoba|static|cpp|example)-(runs|jumps|sings|sleeps|flies|hunts|burns|floats|shines|whispers|roars|dreams|strikes|glides|watches|hides|duty|free)-[0-9]{1,3}\.(dedyn\.io|aber\.ir)$"
| project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, DnsName
| sort by Timestamp desc
| take 500Looks for: the miner's Tor egress. The payload starts a bundled Tor client and reaches its onion pool through these two bridges; a hit from svchost.exe fits the injected-payload design.
Known limitations and deployment notes
- PowerQuery: Only the two reported addresses are matched; rotated bridges are not captured.
- PowerQuery assumes: IP Connect events record outbound connections with the destination address in dst.ip.address.
- KQL – Defender XDR: Advanced Hunting keeps 30 days; the CQL tab covers 90 days.
- KQL – Defender XDR: Only the two reported addresses are matched; rotated bridges are not captured.
- KQL – Defender XDR assumes: DeviceNetworkEvents records the outbound connection with the destination in RemoteIP.
// HUNT: Outbound connection to the two obfs4 Tor bridge addresses reported for the Yoba XMRig payload // MITRE: T1090.003, T1573.002, T1496 // CONF: high FP: low COST: low // REQUIRES: outbound connection with process name (NetworkConnectIP4) // FALSE POSITIVES: none expected; both addresses are listed as the payload's bridge configuration in Check Point (snapshot 01). Bridge addresses rotate, so absence of a hit is weak evidence. // LOOKBACK: 90d. Set the window with the Falcon time picker. #event_simpleName=NetworkConnectIP4 | in(RemoteAddressIP4, values=["51.89.231.85", "51.89.228.250"]) | table([@timestamp, aid, ComputerName, UserName, ContextBaseFileName, RemoteAddressIP4, RemotePort, LocalPort], limit=500) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- IP Connect
Required fields
event.time: Event timeevent.type: Event typedst.ip.address: Destination address
Recommended fields
src.process.name: Connecting process
Optional fields
dst.port.number: Destination port
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'IP Connect' dst.ip.address = * | limit 5 | columns event.time, event.type, src.process.name, dst.ip.address
// HUNT: Outbound connection to the two obfs4 Tor bridge addresses reported for the Yoba XMRig payload
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1090.003, T1573.002, T1496
// CONF: high | FP: low
// FALSE POSITIVES: none expected; both addresses are listed as the payload's bridge configuration in Check Point (snapshot 01). Bridge addresses rotate, so absence of a hit is weak evidence.
// EQUIVALENCE: equivalent-with-schema-assumptions - Same indicator match: an outbound connection whose destination is one of the two reported Tor bridge addresses. The connecting process is src.process.* on an IP Connect event.
// REQUIRES: SentinelOne IP Connect telemetry with the connecting process name
// TUNING: None expected. Bridge addresses rotate, so absence of a hit is weak evidence.
// LOOKBACK: 90d; set the console time picker or query window
// CONFIGURATION: No lookup objects or data tables required.
// KNOWN GAPS: Only the two reported addresses are matched; rotated bridges are not captured.
// VALIDATION LEVEL: static-reviewed
event.type = 'IP Connect'
dst.ip.address in ('51.89.231.85', '51.89.228.250')
| sort -event.time
| limit 500
| columns event.time, endpoint.name, src.process.user, src.process.name, dst.ip.address, dst.port.number, src.port.numberAutomated validation: static-passed
2 required fields · View requirements
Required telemetry
- DeviceNetworkEvents
Required fields
Timestamp: Event timeRemoteIP: Remote address
Recommended fields
InitiatingProcessFileName: Connecting process
Optional fields
RemotePort: Remote port
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceNetworkEvents | where Timestamp > ago(1d) | project Timestamp, RemoteIP, RemotePort, InitiatingProcessFileName | take 5
// HUNT: Outbound connection to the two obfs4 Tor bridge addresses reported for the Yoba XMRig payload
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1090.003, T1573.002, T1496
// CONF: high | FP: low
// FALSE POSITIVES: none expected; both addresses are listed as the payload's bridge configuration in Check Point (snapshot 01). Bridge addresses rotate, so absence of a hit is weak evidence.
// EQUIVALENCE: equivalent-with-schema-assumptions - Same indicator match: an outbound connection whose remote address is one of the two reported Tor bridge addresses. The connecting process is InitiatingProcessFileName.
// REQUIRES: Defender for Endpoint network telemetry (DeviceNetworkEvents)
// TUNING: None expected. Bridge addresses rotate, so absence of a hit is weak evidence.
// LOOKBACK: 30d (Advanced Hunting retention; the CQL tab covers 90d)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: Advanced Hunting keeps 30 days; the CQL tab covers 90 days. Only the two reported addresses are matched; rotated bridges are not captured.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceNetworkEvents
| where Timestamp >= ago(30d)
| where RemoteIP in ("51.89.231.85", "51.89.228.250")
| project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, RemoteIP, RemotePort, LocalPort
| sort by Timestamp desc
| take 500Looks for: the miner talking to its own Tor client on the loopback address, or Tor components started from a torbundle folder in the user temp directory. If the sensor does not log loopback connections the second half will be silent; test that first (section 11).
Known limitations and deployment notes
- PowerQuery: If loopback connections are not logged, only the torbundle branch can fire.
- PowerQuery assumes: IP Connect records loopback connections on this tenant's policy.
- PowerQuery assumes: dst.port.number is numeric.
- PowerQuery assumes: contains is case-insensitive by default, which reproduces the CQL /i intent.
- KQL – Defender XDR: A torbundle process that makes no connection in the window is not captured: the CQL's process-start branch has no place in a single-table query.
- KQL – Defender XDR assumes: DeviceNetworkEvents records loopback connections on this tenant.
- KQL – Defender XDR assumes: InitiatingProcessFolderPath holds the full image path of the connecting process.
// HUNT: Process running from a torbundle folder, or any process connecting to the local SOCKS5 port 9550 (Yoba XMRig payload through its bundled Tor) // MITRE: T1090.003, T1496, T1055 // CONF: medium FP: low COST: medium // REQUIRES: process creation (ProcessRollup2, SyntheticProcessRollup2) and outbound connection (NetworkConnectIP4); loopback connections are not logged in every sensor policy // FALSE POSITIVES: a developer running a local Tor client from a folder that happens to be called torbundle; the Tor Browser uses different folders and ports // SOURCE: Check Point (snapshot 01): Tor data directory %TEMP%\torbundle\data, SOCKS5 proxy on 127.0.0.1 port 9550 // LOOKBACK: 30d. Set the window with the Falcon time picker. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|NetworkConnectIP4)$/ | (ImageFileName=/\\torbundle\\/i or CommandLine=/torbundle/i or (RemoteAddressIP4="127.0.0.1" and RemotePort=9550)) | table([@timestamp, aid, ComputerName, UserName, #event_simpleName, FileName, ContextBaseFileName, ImageFileName, CommandLine, RemoteAddressIP4, RemotePort], limit=500) | sort(@timestamp, order=desc)
6 required fields · View requirements
Required telemetry
- Process Creation
- IP Connect
Required fields
event.time: Event timeevent.type: Event typetgt.process.image.path: Started process pathtgt.process.cmdline: Started process command linedst.ip.address: Destination addressdst.port.number: Destination port
Recommended fields
src.process.name: Connecting process
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'IP Connect' dst.ip.address = * | limit 5 | columns event.time, event.type, dst.ip.address, dst.port.number, tgt.process.image.path, tgt.process.cmdline
// HUNT: Process running from a torbundle folder, or any process connecting to the local SOCKS5 port 9550 (Yoba XMRig payload through its bundled Tor) // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1090.003, T1496, T1055 // CONF: medium | FP: low // FALSE POSITIVES: a developer running a local Tor client from a folder that happens to be called torbundle; the Tor Browser uses different folders and ports // EQUIVALENCE: equivalent-with-schema-assumptions - Same two branches: a process started from, or with a command line naming, a torbundle folder; or any connection to the loopback address on port 9550. The process branch reads tgt.process.* on Process Creation and the connection branch reads IP Connect. // REQUIRES: SentinelOne process creation telemetry and IP Connect telemetry; loopback connections are not recorded under every policy // TUNING: Exclude a developer running a local Tor client by full path. The Tor Browser uses different folders and ports. // LOOKBACK: 30d; set the console time picker or query window // CONFIGURATION: No lookup objects or data tables required. // KNOWN GAPS: If loopback connections are not logged, only the torbundle branch can fire. // VALIDATION LEVEL: static-reviewed (event.type = 'Process Creation' and (tgt.process.image.path contains '\\torbundle\\' or tgt.process.cmdline contains 'torbundle')) or (event.type = 'IP Connect' and dst.ip.address = '127.0.0.1' and dst.port.number = 9550) | sort -event.time | limit 500 | columns event.time, endpoint.name, src.process.user, event.type, src.process.name, tgt.process.name, tgt.process.image.path, tgt.process.cmdline, dst.ip.address, dst.port.number
Automated validation: static-passed
5 required fields · View requirements
Required telemetry
- DeviceNetworkEvents
Required fields
Timestamp: Event timeRemoteIP: Remote addressRemotePort: Remote portInitiatingProcessFolderPath: Connecting process pathInitiatingProcessCommandLine: Connecting process command line
Recommended fields
InitiatingProcessFileName: Connecting process
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceNetworkEvents | where Timestamp > ago(1d) | project Timestamp, RemoteIP, RemotePort, InitiatingProcessFolderPath, InitiatingProcessCommandLine | take 5
// HUNT: Process running from a torbundle folder, or any process connecting to the local SOCKS5 port 9550 (Yoba XMRig payload through its bundled Tor) // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1090.003, T1496, T1055 // CONF: medium | FP: low // FALSE POSITIVES: a developer running a local Tor client from a folder that happens to be called torbundle; the Tor Browser uses different folders and ports // EQUIVALENCE: approximate-analytic - Same indicators read from one table: connections to the loopback address on port 9550, or connections made by a process whose image path or command line names a torbundle folder. A torbundle process that never connects is not seen; the CQL tab also matches a process start. // REQUIRES: Defender for Endpoint network telemetry (DeviceNetworkEvents); loopback connections are not recorded under every policy // TUNING: Exclude a developer running a local Tor client by InitiatingProcessFolderPath. The Tor Browser uses different folders and ports. // LOOKBACK: 30d // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A torbundle process that makes no connection in the window is not captured: the CQL's process-start branch has no place in a single-table query. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceNetworkEvents | where Timestamp >= ago(30d) | where (RemoteIP == "127.0.0.1" and RemotePort == 9550) or InitiatingProcessFolderPath contains "\\torbundle\\" or InitiatingProcessCommandLine contains "torbundle" | project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, InitiatingProcessFolderPath, InitiatingProcessCommandLine, RemoteIP, RemotePort, LocalPort | sort by Timestamp desc | take 500
Looks for: the pairing across the chain, so one host with a sideloaded DLL and later loader activity ranks above a single noisy event. It is deliberately not tied to a 12 day gap (see the NOTE in the query).
Known limitations and deployment notes
- PowerQuery: The scheduled-task registration stage is approximated by a process start from the WMProcess folder.
- PowerQuery: The span in hours between the first and last stage is not computed; read first_seen and last_seen.
- PowerQuery assumes: File Creation, File Modification, Process Creation and DNS Resolved cover the CQL's write, task and lookup stages as far as SentinelOne records them.
- PowerQuery assumes: event.dns.request is populated on DNS Resolved events (the vendor docs also name dns.request; check which one your tenant fills).
- KQL – Defender XDR: The scheduled-task stage and the loader lookups of t.me, dns.google, files.catbox.moe and dedyn.io by wmpdmc.exe are not covered; they live in other tables.
- KQL – Defender XDR assumes: FolderPath holds the folder of the written file.
// HUNT: Host showing two or more distinct Yoba stages in the window: winmm.dll in a user path, wmpdui.dll in WMProcess, the WMProcess task, loader lookups // MITRE: T1574.002, T1053.005, T1102.001 // CONF: medium FP: low COST: high // REQUIRES: executable write (PeFileWritten, NewExecutableWritten), scheduled task registration (ScheduledTaskRegistered), DNS lookup with process (DnsRequest) // FALSE POSITIVES: low; two different Yoba-specific stages on one host is rare in clean estates // NOTE: SpanHours shows the gap between the first and last stage. Check Point reports the roughly 12.73 day Sleep loop only on the branch where the host process is NOT named Setup.exe (a sandbox or standalone run). A real infection is therefore expected to span the time to the next reboot (the task fires 3 minutes after boot), not 12 days. Hunt the pairing, not a fixed gap. // LOOKBACK: 30d. Set the window with the Falcon time picker. #event_simpleName=/^(PeFileWritten|NewExecutableWritten|ScheduledTaskRegistered|DnsRequest)$/ | case { #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ and FileName=/^winmm\.dll$/i and TargetFileName=/\\(Users|ProgramData)\\/i | stage := "1-winmm-dll-in-user-path"; #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ and FileName=/^wmpdui\.dll$/i and TargetFileName=/\\ProgramData\\WMProcess\\/i | stage := "2-loader-dll-in-WMProcess"; #event_simpleName=ScheduledTaskRegistered and TaskExecutable=/\\WMProcess\\/i | stage := "3-task-for-WMProcess"; #event_simpleName=DnsRequest and ContextBaseFileName=/^wmpdmc\.exe$/i and DomainName=/^(t\.me|dns\.google|files\.catbox\.moe|.+\.dedyn\.io)$/i | stage := "4-loader-lookups"; * | stage := "none"; } | stage != "none" | groupBy([aid, ComputerName], function=[count(stage, distinct=true, as=StagesSeen), collect([stage]), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen)], limit=1000) | StagesSeen >= 2 | SpanHours := (LastSeen - FirstSeen) / 3600000 | table([ComputerName, aid, StagesSeen, stage, SpanHours, FirstSeen, LastSeen], limit=200)
8 required fields · View requirements
Required telemetry
- File Creation
- File Modification
- Process Creation
- DNS Resolved
Required fields
event.time: Event timeevent.type: Event typetgt.file.path: Written file pathtgt.process.image.path: Started process pathsrc.process.name: Resolving processevent.dns.request: Requested nameendpoint.name: Hostagent.uuid: Stable host id
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'File Creation' tgt.file.path = * | limit 5 | columns event.time, event.type, endpoint.name, agent.uuid, tgt.file.path, tgt.process.image.path, src.process.name, event.dns.request
// HUNT: Host showing two or more distinct Yoba stages in the window: winmm.dll in a user path, wmpdui.dll in WMProcess, the WMProcess task, loader lookups
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1574.002, T1053.005, T1102.001
// CONF: medium | FP: low
// FALSE POSITIVES: low; two different Yoba-specific stages on one host is rare in clean estates
// EQUIVALENCE: telemetry-gap - Partial pivot of the same correlation. Stage three, the scheduled task for WMProcess, is replaced by a process started from the WMProcess folder because no task-registration event is attested. PowerQuery has no case expression or arithmetic, so the stage count is a pairwise test and the span in hours is not computed; first and last seen are shown instead.
// REQUIRES: SentinelOne file creation, process creation and DNS Resolved telemetry
// TUNING: Hunt the pairing, not a fixed gap: a real infection is expected to span the time to the next reboot, not twelve days.
// LOOKBACK: 30d; set the console time picker or query window
// CONFIGURATION: No lookup objects or data tables required.
// KNOWN GAPS: The scheduled-task registration stage is approximated by a process start from the WMProcess folder. The span in hours between the first and last stage is not computed; read first_seen and last_seen.
// VALIDATION LEVEL: static-reviewed
(event.type in ('File Creation', 'File Modification') and ((tgt.file.path matches '\\\\winmm\\.dll$' and tgt.file.path contains ('\\Users\\', '\\ProgramData\\')) or tgt.file.path matches '\\\\ProgramData\\\\WMProcess\\\\wmpdui\\.dll$')) or (event.type = 'Process Creation' and tgt.process.image.path contains '\\ProgramData\\WMProcess\\') or (event.type = 'DNS Resolved' and src.process.name in:anycase ('wmpdmc.exe') and event.dns.request matches '^(t\\.me|dns\\.google|files\\.catbox\\.moe|.+\\.dedyn\\.io)$')
| group winmm_written=count(tgt.file.path matches '\\\\winmm\\.dll$'), loader_written=count(tgt.file.path matches '\\\\wmpdui\\.dll$'), wmprocess_started=count(tgt.process.image.path contains '\\ProgramData\\WMProcess\\'), loader_lookups=count(event.type = 'DNS Resolved'), first_seen=min(event.time), last_seen=max(event.time) by endpoint.name, agent.uuid
| filter (winmm_written > 0 and loader_written > 0) or (winmm_written > 0 and wmprocess_started > 0) or (winmm_written > 0 and loader_lookups > 0) or (loader_written > 0 and wmprocess_started > 0) or (loader_written > 0 and loader_lookups > 0) or (wmprocess_started > 0 and loader_lookups > 0)
| sort -last_seen
| limit 200Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceFileEvents
Required fields
Timestamp: Event timeFileName: File nameFolderPath: File folder
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceFileEvents | where Timestamp > ago(1d) | project Timestamp, FileName, FolderPath | take 5
// HUNT: Host showing two or more distinct Yoba stages in the window: winmm.dll in a user path, wmpdui.dll in WMProcess, the WMProcess task, loader lookups
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1574.002, T1053.005, T1102.001
// CONF: medium | FP: low
// FALSE POSITIVES: low; two different Yoba-specific stages on one host is rare in clean estates
// EQUIVALENCE: telemetry-gap - Partial pivot of the same correlation over file events only: a device that wrote winmm.dll in a per-user or ProgramData folder and wmpdui.dll in the WMProcess folder. The scheduled-task and lookup stages cannot share a table with the file stages.
// REQUIRES: Defender for Endpoint file telemetry (DeviceFileEvents)
// TUNING: Hunt the pairing, not a fixed gap: a real infection is expected to span the time to the next reboot, not twelve days.
// LOOKBACK: 30d
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: The scheduled-task stage and the loader lookups of t.me, dns.google, files.catbox.moe and dedyn.io by wmpdmc.exe are not covered; they live in other tables.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed-with-warnings; fixtures=0/0
DeviceFileEvents
| where Timestamp >= ago(30d)
| where FileName in~ ("winmm.dll", "wmpdui.dll")
| extend Stage = case(FileName =~ "winmm.dll" and (FolderPath contains "\\Users\\" or FolderPath contains "\\ProgramData\\"), "1-winmm-dll-in-user-folder", FileName =~ "wmpdui.dll" and FolderPath contains "\\ProgramData\\WMProcess\\", "2-loader-dll-in-WMProcess", "none")
| where Stage != "none"
| summarize StagesSeen = dcount(Stage), Stages = make_set(Stage), FirstSeen = min(Timestamp), LastSeen = max(Timestamp) by DeviceId, DeviceName
| where StagesSeen >= 2
| extend SpanHours = datetime_diff("hour", LastSeen, FirstSeen)
| project DeviceName, DeviceId, StagesSeen, Stages, SpanHours, FirstSeen, LastSeen
| sort by LastSeen desc
| take 200Looks for: the loader at work. YobaLoader only continues when its host is WMPDMC.exe, so Telegram, DoH and Catbox traffic (and the payload processes it starts) will carry that process name or parent.
Known limitations and deployment notes
- PowerQuery: A lookup or connection made by a process other than wmpdmc.exe itself (for example after injection into another host process) is not captured.
- PowerQuery assumes: event.dns.request is populated on DNS Resolved events (the vendor docs also name dns.request; check which one your tenant fills).
- PowerQuery assumes: in:anycase reproduces the CQL case-insensitive name match.
- KQL – Defender XDR: Network connections made by wmpdmc.exe (DeviceNetworkEvents) and processes it starts (DeviceProcessEvents) are not covered.
- KQL – Defender XDR: Advanced Hunting keeps 30 days; the CQL tab covers 90 days.
- KQL – Defender XDR assumes: DnsQueryResponse events carry the queried name under DnsQueryString or QueryName in AdditionalFields; the readiness test prints both so a reader can see which key the tenant fills.
// HUNT: WMPDMC.exe doing DNS or network connections, or parenting another process (YobaLoader running inside the sideload host) // MITRE: T1574.002, T1102.001, T1105, T1055 // CONF: high FP: low COST: low // REQUIRES: DNS lookup (DnsRequest), outbound connection (NetworkConnectIP4), process creation (ProcessRollup2, SyntheticProcessRollup2) // FALSE POSITIVES: low; the Windows Media Player device-metadata helper does not normally browse, resolve Telegram names or start child processes // LOOKBACK: 90d. Set the window with the Falcon time picker. #event_simpleName=/^(DnsRequest|NetworkConnectIP4|ProcessRollup2|SyntheticProcessRollup2)$/ | ContextBaseFileName=/^wmpdmc\.exe$/i or ParentBaseFileName=/^wmpdmc\.exe$/i | table([@timestamp, aid, ComputerName, UserName, #event_simpleName, ContextBaseFileName, DomainName, RemoteAddressIP4, RemotePort, FileName, ImageFileName, CommandLine, ParentBaseFileName], limit=500) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- DNS Resolved
- IP Connect
- Process Creation
Required fields
event.time: Event timeevent.type: Event typesrc.process.name: Acting process
Recommended fields
event.dns.request: Requested name
Optional fields
dst.ip.address: Destination address
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'DNS Resolved' src.process.name = * | limit 5 | columns event.time, event.type, src.process.name, event.dns.request
// HUNT: WMPDMC.exe doing DNS or network connections, or parenting another process (YobaLoader running inside the sideload host)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1574.002, T1102.001, T1105, T1055
// CONF: high | FP: low
// FALSE POSITIVES: low; the Windows Media Player device-metadata helper does not normally browse, resolve Telegram names or start child processes
// EQUIVALENCE: equivalent-with-schema-assumptions - Same behaviour: wmpdmc.exe as the acting process of a DNS lookup or a network connection, or as the creator of another process. On DNS and connection events the actor is src.process.*; on Process Creation the creator is also src.process.*.
// REQUIRES: SentinelOne DNS Resolved, IP Connect and Process Creation telemetry with the acting process name
// TUNING: Low false positives expected: the Windows Media Player device-metadata helper does not normally browse, resolve Telegram names or start child processes.
// LOOKBACK: 90d; set the console time picker or query window
// CONFIGURATION: No lookup objects or data tables required.
// KNOWN GAPS: A lookup or connection made by a process other than wmpdmc.exe itself (for example after injection into another host process) is not captured.
// VALIDATION LEVEL: static-reviewed
event.type in ('DNS Resolved', 'IP Connect', 'Process Creation')
src.process.name in:anycase ('wmpdmc.exe')
| sort -event.time
| limit 500
| columns event.time, endpoint.name, src.process.user, event.type, src.process.name, event.dns.request, dst.ip.address, dst.port.number, tgt.process.name, tgt.process.image.path, tgt.process.cmdlineAutomated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceEvents
Required fields
Timestamp: Event timeActionType: Action typeInitiatingProcessFileName: Initiating processAdditionalFields: DNS detail
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceEvents | where Timestamp > ago(1d) | where ActionType == "DnsQueryResponse" | project Timestamp, ActionType, AdditionalFields, InitiatingProcessFileName | take 5
// HUNT: WMPDMC.exe doing DNS or network connections, or parenting another process (YobaLoader running inside the sideload host) // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1574.002, T1102.001, T1105, T1055 // CONF: high | FP: low // FALSE POSITIVES: low; the Windows Media Player device-metadata helper does not normally browse, resolve Telegram names or start child processes // EQUIVALENCE: telemetry-gap - Partial pivot: wmpdmc.exe as the initiating process of a DNS lookup, read from DnsQueryResponse events in DeviceEvents. Its network connections and child processes live in other tables and are not covered; the CQL tab covers all three. // REQUIRES: Defender for Endpoint DNS events (DeviceEvents, ActionType DnsQueryResponse) // TUNING: Low false positives expected: the Windows Media Player device-metadata helper does not normally browse or resolve Telegram names. // LOOKBACK: 30d (Advanced Hunting retention; the CQL tab covers 90d) // CONFIGURATION: No lookup objects required. // KNOWN GAPS: Network connections made by wmpdmc.exe (DeviceNetworkEvents) and processes it starts (DeviceProcessEvents) are not covered. Advanced Hunting keeps 30 days; the CQL tab covers 90 days. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceEvents | where Timestamp >= ago(30d) | where ActionType == "DnsQueryResponse" | where InitiatingProcessFileName =~ "wmpdmc.exe" | extend DnsName = tolower(tostring(coalesce(parse_json(AdditionalFields)["DnsQueryString"], parse_json(AdditionalFields)["QueryName"]))) | project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, DnsName | sort by Timestamp desc | take 500
Looks for: what the loader does when the operator tasks something other than the in-memory miner. Check Point states the loader can deliver any Windows executable or PowerShell script, so this is the hunt for the next payload, not just XMRig. FP: installers that unpack to random-named TEMP folders, and management tools that run hidden bypass PowerShell. Exclude by parent or full path (see TUNING in the query).
Known limitations and deployment notes
- PowerQuery: A script run with a different flag order is not captured, as on the CQL tab.
- PowerQuery assumes: matches is case-insensitive by default, which reproduces the CQL /i intent.
- PowerQuery assumes: The command line is recorded in full in tgt.process.cmdline.
- KQL – Defender XDR: A script run with a different flag order is not captured, as on the CQL tab.
- KQL – Defender XDR assumes: FolderPath holds the full image path of the created process.
- KQL – Defender XDR assumes: The command line is recorded in full in ProcessCommandLine.
// HUNT: Executable or hidden PowerShell script run from TEMP\<10 random chars>\<10 random chars> (YobaLoader deployment methods 2 and 3) // MITRE: T1059.001, T1204.002, T1553.005 // CONF: medium FP: medium COST: low // REQUIRES: process creation with command line and image path (ProcessRollup2, SyntheticProcessRollup2) // FALSE POSITIVES: installers and updaters that unpack to a random-named TEMP folder; hidden, execution-policy-bypass PowerShell used by some management tools // TUNING: exclude a reviewed vendor by full path or by parent, for example | ParentBaseFileName!=/^(YourDeploymentTool)\.exe$/i ; the strongest variant also has ParentBaseFileName of wmpdmc.exe (see Q12). // SOURCE: Check Point (snapshot 01): method 2 saves %TEMP%\<10 random chars>\<10 random chars>.exe after removing Zone.Identifier; method 3 saves a .ps1 and runs it with -WindowStyle Hidden -ExecutionPolicy Bypass -File // LOOKBACK: 30d. Set the window with the Falcon time picker. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ImageFileName=/\\Temp\\[A-Za-z0-9]{10}\\[A-Za-z0-9]{10}\.exe$/i or CommandLine=/-WindowStyle Hidden -ExecutionPolicy Bypass -File .*\\Temp\\[A-Za-z0-9]{10}\\[A-Za-z0-9]{10}\.ps1/i | table([@timestamp, aid, ComputerName, UserName, FileName, ImageFileName, CommandLine, ParentBaseFileName, SHA1HashData], limit=500) | sort(@timestamp, order=desc)
4 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.time: Event timeevent.type: Event typetgt.process.image.path: Started process pathtgt.process.cmdline: Started process command line
Recommended fields
src.process.name: Creator process
Optional fields
tgt.process.image.sha1: Hash. Population on a given tenant is worth a readiness test.
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' tgt.process.cmdline = * | limit 5 | columns event.time, event.type, tgt.process.image.path, tgt.process.cmdline
// HUNT: Executable or hidden PowerShell script run from TEMP\<10 random chars>\<10 random chars> (YobaLoader deployment methods 2 and 3)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1059.001, T1204.002, T1553.005
// CONF: medium | FP: medium
// FALSE POSITIVES: installers and updaters that unpack to a random-named TEMP folder; hidden, execution-policy-bypass PowerShell used by some management tools
// EQUIVALENCE: equivalent-with-schema-assumptions - Same two branches on Process Creation: an executable run from TEMP\<10 characters>\<10 characters>.exe, or a PowerShell command line with hidden window and execution-policy bypass running a script from the same kind of folder. The started process is tgt.process.*.
// REQUIRES: SentinelOne process creation telemetry with image path and command line
// TUNING: Exclude a reviewed vendor by full path or by creator process with a further negated clause; the strongest variant also has wmpdmc.exe as the creator (see the WMPDMC card).
// LOOKBACK: 30d; set the console time picker or query window
// CONFIGURATION: No lookup objects or data tables required.
// KNOWN GAPS: A script run with a different flag order is not captured, as on the CQL tab.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation'
(tgt.process.image.path matches '\\\\Temp\\\\[A-Za-z0-9]{10}\\\\[A-Za-z0-9]{10}\\.exe$' or tgt.process.cmdline matches '-WindowStyle Hidden -ExecutionPolicy Bypass -File .*\\\\Temp\\\\[A-Za-z0-9]{10}\\\\[A-Za-z0-9]{10}\\.ps1')
| sort -event.time
| limit 500
| columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.image.path, tgt.process.cmdline, tgt.process.image.sha1Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeFolderPath: Created process pathProcessCommandLine: Created command line
Recommended fields
InitiatingProcessFileName: Initiating process
Optional fields
SHA1: Hash. SHA1 is the safer hash pivot in this table.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, FolderPath, ProcessCommandLine | take 5
// HUNT: Executable or hidden PowerShell script run from TEMP\<10 random chars>\<10 random chars> (YobaLoader deployment methods 2 and 3)
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1059.001, T1204.002, T1553.005
// CONF: medium | FP: medium
// FALSE POSITIVES: installers and updaters that unpack to a random-named TEMP folder; hidden, execution-policy-bypass PowerShell used by some management tools
// EQUIVALENCE: equivalent-with-schema-assumptions - Same two branches on process creation: an executable run from TEMP\<10 characters>\<10 characters>.exe, or a PowerShell command line with hidden window and execution-policy bypass running a script from the same kind of folder. The created process is FileName and FolderPath.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents)
// TUNING: Exclude a reviewed vendor by FolderPath or InitiatingProcessFileName after a baseline review.
// LOOKBACK: 30d
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A script run with a different flag order is not captured, as on the CQL tab.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(30d)
| where FolderPath matches regex @"(?i)\\Temp\\[A-Za-z0-9]{10}\\[A-Za-z0-9]{10}\.exe$" or ProcessCommandLine matches regex @"(?i)-WindowStyle Hidden -ExecutionPolicy Bypass -File .*\\Temp\\[A-Za-z0-9]{10}\\[A-Za-z0-9]{10}\.ps1"
| project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, FolderPath, ProcessCommandLine, SHA1
| sort by Timestamp desc
| take 500Looks for: the optional driver step. WinRing0 is a real, widely bundled hardware-access driver, so on its own this is context, not a verdict; pair it with a Q9, Q10 or Q12 hit. FP: hardware monitoring and RGB tools that ship WinRing0. Exclude by full path (see TUNING in the query).
Known limitations and deployment notes
- PowerQuery: A service whose display name alone says WinRing0, with neither key name nor image path matching, is not captured.
- PowerQuery assumes: The service key name and the ImagePath value are visible in registry.keyPath and registry.value.
- PowerQuery assumes: contains is case-insensitive by default, which reproduces the CQL /i intent.
- KQL – Defender XDR: A service whose display name alone says WinRing0, with neither key name nor image path matching, is not captured.
- KQL – Defender XDR assumes: The service key name and the ImagePath value are visible in RegistryKey and RegistryValueData.
// HUNT: Service registered with WinRing0 in its name or image path (Yoba XMRig payload can load the WinRing0 driver for MSR mining tweaks) // MITRE: T1543.003, T1496 // CONF: low FP: medium COST: low // REQUIRES: service creation (CreateService); on tenants without that event use Windows System event 7045 // FALSE POSITIVES: hardware monitoring and RGB or fan-control tools that bundle a WinRing0 driver legitimately // TUNING: exclude the reviewed tool by full path, for example | ServiceImagePath!=/\\Program Files\\YourHardwareTool\\/i ; a WinRing0 service created from a user-writable path, or on a host with a Q9 or Q10 hit, is the real lead. // SOURCE: Check Point (snapshot 01): the payload can conditionally load the WinRing0 driver service for MSR-based mining optimization // LOOKBACK: 30d. Set the window with the Falcon time picker. #event_simpleName=CreateService | ServiceDisplayName=/winring0/i or ServiceImagePath=/winring0/i | table([@timestamp, aid, ComputerName, UserName, ServiceDisplayName, ServiceImagePath], limit=200) | sort(@timestamp, order=desc)
4 required fields · View requirements
Required telemetry
- Registry Value Modified
Required fields
event.time: Event timeevent.type: Event typeregistry.keyPath: Registry key pathregistry.value: Registry value
Recommended fields
src.process.name: Writer process
Optional fields
registry.valueName: Value name
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Registry Value Modified' registry.keyPath = * | limit 5 | columns event.time, event.type, registry.keyPath, registry.value
// HUNT: Service registered with WinRing0 in its name or image path (Yoba XMRig payload can load the WinRing0 driver for MSR mining tweaks) // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1543.003, T1496 // CONF: low | FP: medium // FALSE POSITIVES: hardware monitoring and RGB or fan-control tools that bundle a WinRing0 driver legitimately // EQUIVALENCE: approximate-analytic - No service-creation event is attested for SentinelOne here, so the hunt reads the registry write that creates a service: a value under a Services key whose key path or value names winring0. The CQL matches the service display name or image path. // REQUIRES: SentinelOne registry value telemetry covering the Services keys // TUNING: Exclude the reviewed hardware tool by its image path with a further negated contains clause on registry.value. A WinRing0 service created from a user-writable folder, or on a host with a hit on the Tor cards, is the real lead. // LOOKBACK: 30d; set the console time picker or query window // CONFIGURATION: No lookup objects or data tables required. // KNOWN GAPS: A service whose display name alone says WinRing0, with neither key name nor image path matching, is not captured. // VALIDATION LEVEL: static-reviewed event.type = 'Registry Value Modified' registry.keyPath contains '\\Services\\' (registry.keyPath contains 'winring0' or registry.value contains 'winring0') | sort -event.time | limit 200 | columns event.time, endpoint.name, src.process.user, src.process.name, registry.keyPath, registry.valueName, registry.value
Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceRegistryEvents
Required fields
Timestamp: Event timeActionType: Action typeRegistryKey: Registry keyRegistryValueData: Registry data
Recommended fields
InitiatingProcessFileName: Writer process
Optional fields
RegistryValueName: Value name
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceRegistryEvents | where Timestamp > ago(1d) | project Timestamp, ActionType, RegistryKey, RegistryValueData | take 5
// HUNT: Service registered with WinRing0 in its name or image path (Yoba XMRig payload can load the WinRing0 driver for MSR mining tweaks) // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1543.003, T1496 // CONF: low | FP: medium // FALSE POSITIVES: hardware monitoring and RGB or fan-control tools that bundle a WinRing0 driver legitimately // EQUIVALENCE: approximate-analytic - Service creation is read from the registry write under a Services key, which needs no extra audit policy: a value whose key or data names winring0. The CQL matches the service display name or image path. // REQUIRES: Defender for Endpoint registry telemetry (DeviceRegistryEvents) // TUNING: Exclude the reviewed hardware tool by its image path in RegistryValueData. A WinRing0 service created from a user-writable folder, or on a device with a hit on the Tor cards, is the real lead. // LOOKBACK: 30d // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A service whose display name alone says WinRing0, with neither key name nor image path matching, is not captured. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceRegistryEvents | where Timestamp >= ago(30d) | where ActionType == "RegistryValueSet" | where RegistryKey contains "\\Services\\" | where RegistryKey contains "winring0" or RegistryValueData contains "winring0" | project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, RegistryKey, RegistryValueName, RegistryValueData | sort by Timestamp desc | take 200
Detection Rules by Platform
No IOA is set to prevent. Every pattern here either rests on one vendor report or sits on a legitimate Windows file name. Move an IOA to prevent only after a clean week in detect and a second independent source for the indicator.
CrowdStrike: Custom IOA
| IOA name | Promotes | Pattern | Exclusions | Action |
|---|---|---|---|---|
| IOA-1: Yoba persistence task | Promote Q6 | Scheduled task registered with an executable path containing \ProgramData\WMProcess\, or wmpdmc.exe outside System32 | None expected | Detect. Review within 1 hour; contain the host on confirmation. |
| IOA-2: Yoba sideload host | Promote Q5, Q12 | WMPDMC.exe running with an image path outside \Windows\System32\, \Windows\SysWOW64\ and the Windows Media Player folders; or any child process / network connection from such a copy | A portable media-player kit, by full path | Detect. Review within 1 hour. |
| IOA-3: winmm.dll created in a user path | Promote Q3 | File creation of winmm.dll under a user profile or ProgramData by an archiver, Explorer or a browser | Reviewed game or audio folders, by full path | Detect only. Never prevent: winmm.dll is a real Windows DLL name and many tools ship their own. |
| IOA-4: Reported Tor bridge addresses | Promote Q9 | Network connection to 51.89.231.85 or 51.89.228.250 | Approved Tor research hosts | Detect. Single-sourced and the addresses rotate, so no prevent. |
SentinelOne: custom detection rules
| Rule | Source query | Run as | Notes |
|---|---|---|---|
| IOA-1: Yoba persistence task | Q6, PowerQuery tab | Hunt only until the gap is closed | Q6 is only an approximation here. No task-registration event is attested for SentinelOne here, so this is a partial pivot: it finds wmpdmc.exe started from the ProgramData WMProcess folder, which is what the registered task eventually runs. The registration itself, its author and its boot trigger are not visible. |
| IOA-2: Yoba sideload host | Q5, Q12, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| IOA-3: winmm.dll created in a user path | Q3, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| IOA-4: Reported Tor bridge addresses | Q9, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
Create the rule with POST /web/api/v2.1/cloud-detection/rules, queryType: "scheduled" and queryLang: "2.0", with the query in data.scheduledParams.query. Use 2.0 operator spellings: a rule written with the 1.0 token ContainsCIS was accepted and never fired on a tenant. The API does not warn, so lint the body before deploying.
Microsoft Defender: custom detection rules
| Rule | Source query | Run as | Notes |
|---|---|---|---|
| IOA-1: Yoba persistence task | Q6, KQL – Defender XDR tab | Hunt only until the gap is closed | Q6 is only an approximation here. Defender Advanced Hunting has no scheduled-task registration table with a task executable, so this is a partial pivot: it finds wmpdmc.exe started from the ProgramData WMProcess folder, which is what the registered task eventually runs. The registration itself is not visible. |
| IOA-2: Yoba sideload host | Q5, Q12, KQL – Defender XDR tab | Hunt only until the gap is closed | Q5, Q12 is only an approximation here. Same folder-based predicate over file events: wmpdmc.exe or wmpdui.dll written outside the Windows system and Media Player folders. The CQL also matches a started process; one query reads one table, so the process-start half is left to the CQL tab. |
| IOA-3: winmm.dll created in a user path | Q3, KQL – Defender XDR tab | Custom detection rule, alert only, every hour | The query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself |
| IOA-4: Reported Tor bridge addresses | Q9, KQL – Defender XDR tab | Custom detection rule, alert only, every hour | The query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself |
Q1, Q2, Q4, Q7, Q8, Q10, Q11, Q13 and Q14 stay a hunt in this pack, not a rule. A rule can generate only 150 alerts per run. Continuous (NRT) frequency needs a single table and no comment lines, so delete the generated comment header from the query first.
Machine-Readable IOC Appendix
6 importable indicators ship, all detect: 2 IPv4 and 4 domains. 22 SHA-1 values are in their own block because Falcon IOC Management does not import SHA-1; they are also in Q1. Every value was copied by script from the saved Check Point snapshot, not typed. No row is prevent because every indicator comes from one vendor report.
type,value,action,severity,expiration,description,tags ipv4,51.89.231.85,detect,medium,2027-02-02,Yoba XMRig payload Tor obfs4 bridge port 24526 (Check Point only),campaign:Yoba ipv4,51.89.228.250,detect,medium,2027-02-02,Yoba XMRig payload Tor obfs4 bridge port 21668 (Check Point only),campaign:Yoba domain,calm-piano-floats-313.dedyn.io,detect,high,2027-02-02,Yoba DGA sample domain; rotates with the Telegram picture (Check Point only),campaign:Yoba domain,gpt-5-6.github.io,detect,high,2027-02-02,Yoba lure GitHub Pages host (Check Point only),campaign:Yoba domain,gpt-6-astra.github.io,detect,high,2027-02-02,Yoba lure GitHub Pages host (Check Point only),campaign:Yoba domain,opus-5-0.github.io,detect,high,2027-02-02,Yoba lure GitHub Pages host (Check Point only),campaign:Yoba # NOT imported: 22 SHA-1 hashes. Falcon IOC Management does not take SHA-1. They are in the grab-sha1 block and Q1. # NOT imported: t.me, dns.google, files.catbox.moe, github.com and the dedyn.io apex are legitimate services. Hunt them with Q7 and Q8; never block. # NOT imported: the onion mining endpoint (egress is inside Tor) and the signed OpenAI and Anthropic binaries (legitimate vendor files). # No row is prevent: every indicator comes from one vendor report (Check Point). Do not raise any to prevent without a second independent source.
indicatorType,indicatorValue,action,title,description,expirationTime,severity,recommendedActions,rbacGroups,category,mitretechniques,GenerateAlert IpAddress,51.89.231.85,Audit,Yoba XMRig payload Tor obfs4 bridge port 24526,Yoba XMRig payload Tor obfs4 bridge port 24526 (Check Point only),2027-02-02T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True IpAddress,51.89.228.250,Audit,Yoba XMRig payload Tor obfs4 bridge port 21668,Yoba XMRig payload Tor obfs4 bridge port 21668 (Check Point only),2027-02-02T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,calm-piano-floats-313.dedyn.io,Audit,Yoba DGA sample domain; rotates with the Telegram picture,Yoba DGA sample domain; rotates with the Telegram picture (Check Point only),2027-02-02T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True DomainName,gpt-5-6.github.io,Audit,Yoba lure GitHub Pages host,Yoba lure GitHub Pages host (Check Point only),2027-02-02T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True DomainName,gpt-6-astra.github.io,Audit,Yoba lure GitHub Pages host,Yoba lure GitHub Pages host (Check Point only),2027-02-02T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True DomainName,opus-5-0.github.io,Audit,Yoba lure GitHub Pages host,Yoba lure GitHub Pages host (Check Point only),2027-02-02T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
Column names and allowed values are from Microsoft's documented parameter table. Check each expirationTime before importing: an indicator whose date has passed is already expired. Download the sample CSV from the Import page to confirm the column order before a bulk import. Each file takes at most 500 indicators. Learn describes the import per entity type, so if a mixed file is rejected, split it by indicatorType. An imported indicator does nothing unless the matching Advanced features are on (for example Custom network indicators and Allow or block file).
This pack does not ship a SentinelOne import block: the import format could not be verified against SentinelOne's own documentation. Export a sample from your console and the block can be added with confidence.
# SHA-1 values copied by script from Check Point snapshot 01. Defender indicators accept SHA-1; Falcon IOC Management does not. # Detect or hunt only. The two signed OpenAI and Anthropic binaries are legitimate vendor files: never block them. # YobaDropper (winmm.dll) (5) 17e8639a00bb32b10cb9cf0d292e9441456ce4bb 20238b36645fc63139a76b19a480c6a9166472fa 4ea5b71202b69fc27b06ef9ee3f6f51d6f7b8586 60aece343959a2e1840f6aaeffa38b73ed21af2c 8777db31d8df78f36e4544a132d843dfb2a0f026 # YobaLoader (wmpdui.dll) (9) 22661f4bada8167fa0f410b75e53184998990abb 2ecb5548e9774a3d05e8669e8414dcc366929b79 3fef1af3664429e621d3e0f9408cb5102ef02b84 55043ea6d102670c014e2be5a8197e70b7c201cb 79e87a6df59d68b2dbd2c43950df5663d671007c 7dfcee02732ed89f1ddf25d1689863c26de3df15 bead5748d813a9828ddb7603a32e52aa15349768 cf90c4599257e76984a199d98b1fd082b820a54d eeedc5c9007d7f01808285e0ae0c0b451bdba003 # Injected XMRig payload (1) ea16728f6928dc77deaddee74a6e736dd5f24fc5 # Encrypted payload file (Catbox .dat) (1) 7467b6980440ec27c4e0a8d940672c9f24e14216 # Telegram channel image (1) e7c0e981f81447892995d01ed986c0b462a6f0c5 # Release ZIPs (2) 332e3b685e375aa44a5ec98511fc53be821df46a c2b986704406d47dd88ee4e2fcffebc854ff2ce4 # Signed OpenAI and Anthropic binaries (LEGITIMATE, hunt only) (2) 163c81187d8024123912c3c12d905fd5210afcb3 65a3ac8f341ae04982005fd2c4e83627a68793a3
# Behavioral signatures (not atomic indicators). Source: Check Point, snapshot 01.
Folder: ProgramData\WMProcess\
Files: WMPDMC.exe (copy of the System32 file), wmpdui.dll (loader), winmm.dll (dropper, beside Setup.exe)
Task: author "Microsoft Corporation"; description "Collects device metadata for Windows Media Player."; boot delay PT3M; principal Local System (S-1-5-18)
Host process: DLL expects the host to be named Setup.exe (DJB2 0xE6C2F326); loader expects WMPDMC.exe (0x552751E3)
Delay branch: 200,000 iterations of Sleep(5500), about 12.73 days, when the host name check fails
Dropper text: message "Please run this program as Administrator." if not elevated
Telegram: channel yoba_fanclub; page fetched with user agent "Mozilla/5.0 (Windows NT 10.0; Win64;)"; element class tgme_page_photo_image
DGA: adjective-noun-verb-number under dedyn.io (early variant: aber.ir); last 50 bytes of the picture are the seed
DoH: dns.google/resolve?name=<generated name>&type=TXT, then Ed25519 check and AES decrypt
Payload: url in the decrypted record; first character 1 = inject into svchost.exe, 2 = TEMP\<10 chars>\<10 chars>.exe, 3 = TEMP\<10 chars>\<10 chars>.ps1 (-WindowStyle Hidden -ExecutionPolicy Bypass -File)
Miner: XMRig 6.26.0 in svchost.exe; TLS onion pool; socks5 on 127.0.0.1 port 9550; donation level 0; mutex Local\WindowsSecurity; Tor data in %TEMP%\torbundle\data; resumes after 240 seconds idle
Earlier build: host Cursor.exe (0x56221573); Startup shortcut msdefender_scheduler{7940-8490-6670-1081}.lnk; folder %APPDATA%\Microsaft Difendir\ with msdtc.exe and mswsock.dll
# Named tooling, lure and packaging names (hunt context, not blocks) Check Point names: Yoba (campaign), YobaDropper (winmm.dll), YobaLoader (wmpdui.dll) Lure app names: GPT-5.6 Sol, GPT-6 Astra, Claude Opus Release ZIPs: sol-setup.zip, Setup-Claude.zip, GPT-6-Astra-Setup.zip ZIP contents: Setup.exe (signed vendor file), winmm.dll (malicious), owl-shell-runtime.json, snapshot_blob.bin, v8_context_snapshot.bin, vk_swiftshader.dll, vk_swiftshader_icd.json, vulkan-1.dll, D3dx9_41.dll Legitimate abused: Setup.exe (OpenAI or Anthropic, signed), WMPDMC.exe (Windows), svchost.exe (Windows), XMRig (open source), Tor, lyrebird, WinRing0 driver Never block on: the names above that are legitimate software, the bare name winmm.dll, t.me, dns.google, files.catbox.moe, github.com, dedyn.io
# Read-only audit starters (Windows). Nothing here changes a setting.
# 1. Any winmm.dll outside the Windows system folders, with signature state
Get-ChildItem -Path "$env:SystemDrive\Users","$env:ProgramData" -Recurse -Force -File -Filter winmm.dll -ErrorAction SilentlyContinue | ForEach-Object { [pscustomobject]@{ Path=$_.FullName; Signature=(Get-AuthenticodeSignature $_.FullName).Status } }
# 2. The persistence footprint
Test-Path "$env:ProgramData\WMProcess"
Get-ScheduledTask | Where-Object { ($_.Actions.Execute -join ' ') -match 'ProgramData\\WMProcess' } | Select-Object TaskName, TaskPath, Author
# 3. ASR prevalence rule state (2 = audit, 1 = block, empty = not set)
$p = Get-MpPreference; for ($i=0; $i -lt $p.AttackSurfaceReductionRules_Ids.Count; $i++) { if ($p.AttackSurfaceReductionRules_Ids[$i] -eq '01443614-cd74-433a-b99e-2ecdc07bfc25') { $p.AttackSurfaceReductionRules_Actions[$i] } }
# 4. Who is a local administrator
Get-LocalGroupMember -Group Administrators
Detection Validation Gates
| Gate | Check | Pass condition |
|---|---|---|
| Telemetry ready | Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); Executable or file write (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents); DNS lookup with the requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents DnsQueryResponse); Outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents); Scheduled task creation (CrowdStrike: ScheduledTaskRegistered. SentinelOne: Task Register, confirm the spelling on a tenant. Defender: DeviceEvents ScheduledTaskCreated); Service creation (CrowdStrike: CreateService. SentinelOne: no listed event type, use Windows event 7045. Defender: DeviceRegistryEvents on the Services key). Q10 also needs loopback connections to be logged. | Q1 to Q5, Q12, Q13 depend on common events and should return rows for a test host. For Q6 register the harmless test task below and confirm a row. For Q10 run Test-NetConnection 127.0.0.1 -Port 9550 on a test host and check whether a loopback row arrives; if not, the loopback half of Q10 is blind and the coverage map must say so. |
| Benign baseline | Run Q2, Q3, Q4, Q7, Q13 and Q14 over 30 days before alerting. | Record every legitimate hit (game mods, audio tools, chat clients, hardware tools, installers with random TEMP folders) and add a full-path or parent exclusion. Q5, Q6, Q8, Q9 and Q12 should return nothing in a clean estate. |
| Positive tests | Use harmless stand-ins on an isolated test host; never run the malware. | Q3: copy C:\Windows\System32\winmm.dll to a new folder under Downloads using Explorer, then delete it. Q5: copy C:\Windows\System32\wmpdmc.exe to C:\ProgramData\WMProcess-test\ and start it, then delete it. Q6: schtasks /create /tn YobaTest /sc once /st 23:59 /tr C:\ProgramData\WMProcess\wmpdmc.exe (a path that does not exist), then schtasks /delete /tn YobaTest /f. Q7: nslookup t.me and nslookup dns.google from a command prompt. Q8: nslookup calm-piano-floats-313.dedyn.io. |
| Promotion | A query becomes an IOA or scheduled search only after the baseline. | IOA-1 to IOA-4 go to detect with a named owner. None goes to prevent in this version (see section 9). Review again when a second independent report appears. |
Hardening: Tiered & Deployable
- T1. Install AI desktop apps only from the vendor. Check Point's first recommendation: get software from vendor-controlled channels, not search results, GitHub Pages or third-party links. Publish an approved-source list for AI tools and route requests through your software catalog. Framework: ATT&CK T1204.002, T1608.006; M1017 User Training, M1038 Execution Prevention. Verify: proxy report for
github.com/*/releases/downloadexecutables and ZIPs (N1). - T2. Alert on the lure and the loader chain; do not block legitimate services. Load the CSV rows from section 10 as detect, run Q7 and Q12, and alert on Telegram plus Google DoH plus Catbox from one non-browser process. Do not block t.me, dns.google, files.catbox.moe, github.com or dedyn.io. Framework: M1031 Network Intrusion Prevention. Verify: the Q7 positive test in section 11.
- T3. Attack Surface Reduction prevalence rule in audit. The rule "Block executable files from running unless they meet a prevalence, age, or trusted list criterion" catches fresh unsigned executables such as the TEMP payloads and a copied WMPDMC.exe. Start in audit mode. Framework: M1038; Microsoft Defender ASR rules reference. Verify: playbook P2.
- T4. Turn on scheduled-task creation auditing. Yoba persists through a SYSTEM task. Event 4698 and the Task Scheduler Operational log give a second view next to Q6. Framework: M1047 Audit; ATT&CK T1053.005. Verify: playbook P3.
- T5. Remove standing administrator rights and tighten the elevation prompt. The dropper stops unless it runs elevated and shows a message asking the user to rerun it as administrator. Standard users without an admin path break the chain at that point. Framework: M1026 Privileged Account Management, M1052 User Account Control; CIS Microsoft Windows Benchmark, User Account Control settings (section 2.3.17). Verify:
Get-LocalGroupMember -Group AdministratorsandGet-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System | Select-Object EnableLUA, ConsentPromptBehaviorAdmin, ConsentPromptBehaviorUser. - T6. Application control that checks the whole folder, not just the signed EXE. A signature on Setup.exe does not cover the DLL beside it. Use Windows Defender Application Control or AppLocker (EXE and DLL rules) in audit mode first, with rules that allow Program Files and Windows and flag user-writable paths. Framework: M1038 Execution Prevention; ATT&CK T1574.002; Microsoft WDAC design guidance. Verify:
Get-AppLockerPolicy -Effective | Select-Object -ExpandProperty RuleCollectionsand the audit events. - T7. Control DNS-over-HTTPS and Tor egress for non-browser processes. Force name resolution through your resolver, block anonymizer categories at the proxy, and use application-aware rules to stop non-browser clients reaching public DoH endpoints. Framework: M1031, M1037 Filter Network Traffic; best-practice, no formal benchmark. Verify: Q7 and Q9 stay quiet after the change.
- T8. Deploy AI tools through a managed catalog with an application-control policy that trusts the catalog. Use Intune or your software distribution tool as the managed installer so tools installed any other way are not trusted. Framework: M1038; Microsoft WDAC managed installer. Verify: an unmanaged installer from Downloads is blocked in the pilot ring.
- T9. Treat any Yoba hit as a loader compromise. Check Point warns the loader can run any executable or script. Build the response rule into your playbooks: contain, look for second payloads and credentials exposure, and reimage rather than removing only the miner. Verify: tabletop with the containment runbook (section 14).
- T10. Developer and power-user awareness. New-model names (version numbers that do not exist yet) are bait. Teach staff to check the publisher and the official download page. Framework: M1017 User Training; best-practice, no formal benchmark.
Deployable Playbooks
P1 · Find an off-path winmm.dll and check its signature
Playbook P1: find winmm.dll beside an executable in user-writable folders and check its signature (read-only audit)
Prerequisites: PowerShell 5.1 or later; run elevated to read every profile, or as the user for one profile. The script reads file names, signature state and hashes only.
Reboot required: no
1. List every winmm.dll outside the Windows folders with its signature and the executables beside it:
$roots = @("$env:SystemDrive\Users", "$env:ProgramData")
foreach ($r in $roots) {
Get-ChildItem -Path $r -Recurse -Force -File -Filter winmm.dll -ErrorAction SilentlyContinue | ForEach-Object {
$sig = Get-AuthenticodeSignature -FilePath $_.FullName
$exe = (Get-ChildItem -Path $_.DirectoryName -File -Filter *.exe -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Name) -join ', '
[pscustomobject]@{ Path = $_.FullName; Signature = $sig.Status; Signer = $sig.SignerCertificate.Subject; ExecutablesBeside = $exe; SHA1 = (Get-FileHash -Algorithm SHA1 -Path $_.FullName).Hash }
}
}
2. Triage: a NotSigned or HashMismatch winmm.dll beside a Setup.exe is the Yoba shape. Compare SHA1 with the grab-sha1 block in section 10. Some legitimate software ships its own signed winmm.dll, so never delete on the name alone.
Rollback: none required. The script is read-only.P2 · ASR prevalence rule, audit first
Playbook P2: Defender ASR rule for executables that fail prevalence, age and trusted-list checks (audit first)
Prerequisites: Microsoft Defender Antivirus in active mode (ASR does not enforce when another antivirus is primary); local admin. On hosts that run only Falcon, use the Falcon prevention policy for unknown executables instead.
Reboot required: no
1. Turn the rule on in audit mode:
Add-MpPreference -AttackSurfaceReductionRules_Ids 01443614-cd74-433a-b99e-2ecdc07bfc25 -AttackSurfaceReductionRules_Actions AuditMode
2. Verify:
$p = Get-MpPreference
for ($i = 0; $i -lt $p.AttackSurfaceReductionRules_Ids.Count; $i++) { if ($p.AttackSurfaceReductionRules_Ids[$i] -eq '01443614-cd74-433a-b99e-2ecdc07bfc25') { "Action: $($p.AttackSurfaceReductionRules_Actions[$i])" } }
# Expect: 2 (Audit). 1 means Block.
3. Review the audit events (Microsoft-Windows-Windows Defender/Operational, event 1122) for 14 days, allow-list approved installers, then switch the action to Block for a pilot ring.
Rollback:
Remove-MpPreference -AttackSurfaceReductionRules_Ids 01443614-cd74-433a-b99e-2ecdc07bfc25
# Removes the rule from local policy. Policy pushed by Intune or Group Policy returns at the next refresh.P3 · Log scheduled-task creation
Playbook P3: log scheduled-task creation (Security event 4698 and Task Scheduler Operational log)
Prerequisites: local admin; a log forwarder that collects the Security and Task Scheduler Operational logs; free space on the log. Record the current state first so the rollback restores it.
Reboot required: no
1. Save the current audit policy and log state:
auditpol /backup /file:"$env:ProgramData\audit-before-p3.csv"
wevtutil gl Microsoft-Windows-TaskScheduler/Operational
2. Enable the audit subcategory and the operational log:
auditpol /set /subcategory:"Other Object Access Events" /success:enable /failure:enable
wevtutil sl Microsoft-Windows-TaskScheduler/Operational /e:true
3. Verify:
auditpol /get /subcategory:"Other Object Access Events"
Get-WinEvent -FilterHashtable @{ LogName = 'Security'; Id = 4698 } -MaxEvents 5
4. Search the collected events for a task whose action runs under ProgramData\WMProcess (N3).
Rollback:
auditpol /restore /file:"$env:ProgramData\audit-before-p3.csv"
wevtutil sl Microsoft-Windows-TaskScheduler/Operational /e:false
# Run the second command only if step 1 showed the log was disabled before.P4 · Check one host for the Yoba footprint
Playbook P4: check one host for the Yoba footprint (read-only triage)
Prerequisites: PowerShell 5.1 or later; run elevated. Reads folders, tasks and services only; changes nothing. Run from the Falcon real-time response shell or locally.
Reboot required: no
1. Persistence folder and task:
Test-Path "$env:ProgramData\WMProcess"
Get-ChildItem "$env:ProgramData\WMProcess" -Force -ErrorAction SilentlyContinue | Select-Object Name, Length, LastWriteTime
Get-ScheduledTask | Where-Object { ($_.Actions.Execute -join ' ') -match 'ProgramData\\WMProcess' } | Select-Object TaskName, TaskPath, Author, Description
2. Miner footprint (the payload runs as SYSTEM, so also check the system TEMP folder):
Test-Path "$env:TEMP\torbundle"
Test-Path "$env:SystemRoot\Temp\torbundle"
Get-Service | Where-Object { $_.Name -match 'WinRing0' -or $_.DisplayName -match 'WinRing0' }
3. Record findings and hashes for the ticket (section 16). Do not delete anything here; use the containment runbook (section 14).
Rollback: none required. The script is read-only.
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-contain the host in Falcon. Keep it powered on (the miner is injected into svchost.exe in memory; a power-off loses it). Do not reimage yet. Disable the user's sessions at the identity provider as a precaution, because the loader can run any payload. | SOC / IR | Containment timestamp, host and user, session-revocation record |
| Isolate: by platform | CrowdStrike: network-contain the host. SentinelOne: network quarantine (Disconnect from Network; confirm the label in your console version). Microsoft Defender: Isolate device (full network isolation). Keep the host powered on for memory capture on all of them. | SOC / IR | Containment timestamp, host and user, session-revocation record |
| Isolate: by platform | CrowdStrike: network-contain the host. SentinelOne: network quarantine. Microsoft Defender: Isolate device. Keep the host powered on for memory capture on all of them. | SOC / IR | Containment timestamp |
| Preserve | Capture memory if your tooling allows it, then copy ProgramData\WMProcess\, the Setup.exe folder with its winmm.dll, the ZIP from Downloads, the scheduled task XML (Export-ScheduledTask) and the browser download history. Hash everything with SHA-1 and compare to the grab-sha1 block. | IR | Evidence bundle with hashes |
| Scope | Run Q1 to Q14 over 90 days for the aid, then environment-wide for each hash, domain and address in section 10. Run N1 and N2 for the download source and other users. Check Q13 and Q12 for any second payload the loader delivered; Check Point says the loader can run any executable or PowerShell script. | IR | Process tree, first-seen file, list of other hosts |
| Eradicate | Preferred: reimage, because the payload ran inside svchost.exe and later payloads are unknown. If reimage is delayed: unregister the task, stop and remove the Tor and miner processes and the WinRing0 service if present, remove ProgramData\WMProcess and the Setup.exe folder, and reboot. Do this only after the Preserve step. | IR / Endpoint | Task removal output, reboot time, clean re-scan |
| Recover | Rebuild from the golden image. Reset credentials for accounts used on the host (conservative: later payloads could be credential stealers). Reinstall the AI desktop app only from the vendor's official page. | IT / Identity | Rebuild ticket, credential reset list |
| Prevent recurrence | Close the intake path: block the lure hosts at DNS or proxy, remove local admin, enable ASR in audit, and roll out T1 to T7 in section 12. Add the user and team to awareness follow-up. | SOC / IT | Change tickets |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | CrowdStrike coverage | SentinelOne | Defender XDR |
|---|---|---|---|---|---|---|
| T1204.002 / T1574.002 | Known sample hashes | Q1 | None (hash lists age quickly) | Partial | Partial: same limit as CrowdStrike | Partial: Q1 approximate |
| T1574.002 | winmm.dll beside Setup.exe in a user path | Q2, Q3 | IOA-3 | Partial | Partial: Q2 approximate | Partial: Q2 approximate |
| T1204.002 | Setup.exe launched from a ZIP or Downloads folder | Q4 | None | Partial | Partial: same limit as CrowdStrike | Partial: same limit as CrowdStrike |
| T1574.002 / T1036.005 | WMPDMC.exe or wmpdui.dll outside system folders | Q5, Q12 | IOA-2 | Good | Good, with assumptions | Partial: Q5 approximate, Q12 telemetry gap |
| T1053.005 | SYSTEM task for the WMProcess copy | Q6 | IOA-1 | Good | Partial: Q6 telemetry gap | Partial: Q6 telemetry gap |
| T1102.001 / T1071.004 | Telegram, Google DoH and Catbox from a non-browser process | Q7 | None | Partial | Partial: same limit as CrowdStrike | Partial: same limit as CrowdStrike |
| T1568.002 | DGA-shaped dedyn.io lookup | Q8 | None | Partial | Partial: same limit as CrowdStrike | Partial: same limit as CrowdStrike |
| T1090.003 / T1496 | Tor bridges, torbundle and local SOCKS5 | Q9, Q10 | IOA-4 | Partial | Partial: same limit as CrowdStrike | Partial: Q10 approximate |
| T1574.002 / T1053.005 / T1102.001 | Multi-stage correlation on one host | Q11 | None | Partial | Partial: Q11 telemetry gap | Partial: Q11 telemetry gap |
| T1059.001 / T1553.005 | Second payload from a random TEMP folder | Q13 | None | Partial | Partial: same limit as CrowdStrike | Partial: same limit as CrowdStrike |
| T1543.003 | WinRing0 driver service | Q14 | None | Partial | Partial: Q14 approximate | Partial: Q14 approximate |
| T1055 | Injection of the payload into svchost.exe | None | None | GAP | GAP | GAP |
| T1497.003 / T1480 | Sleep loop, host-name, language and admin checks | None | None | GAP | GAP | GAP |
| T1608.006 | SEO poisoning and the GitHub lure | None | None | GAP | GAP | GAP |
Gaps. Injection into svchost.exe, the sleep and environment checks, and the web lure stage have no endpoint query here. DLL-load (image-load) events are not queried; the sideload is inferred from file placement and process path, with Sysmon event 7 in N4 as the direct view. Q10 depends on loopback connections being logged. Validation gates are in section 11.
Hunt Summary Ticket
TITLE: Yoba fake ChatGPT and Claude desktop apps, signed-binary DLL sideload to XMRig (Check Point Research, 2026-10-27) SEVERITY: High. A generic loader runs any payload; the observed payload is a cryptominer. Treat a hit as a broader compromise. SCOPE: Windows endpoints where users download AI desktop apps from GitHub or search results; any host with ProgramData\WMProcess HYPOTHESIS: A user ran a signed Setup.exe from a downloaded ZIP; its winmm.dll deployed a copied WMPDMC.exe and loader under ProgramData\WMProcess, a SYSTEM task restarts it at boot, and the loader pulls a payload through Telegram, Google DoH and Catbox. QUERIES: 14 CQL queries (Q1-Q14). High confidence: Q1, Q5, Q6, Q9, Q12. Medium: Q2, Q3, Q7, Q8, Q10, Q11, Q13. Low: Q4, Q14. N1-N7 cover proxy, DNS, task, Sysmon, firewall and service logs. DO FIRST: 1) Run Q5, Q6, Q12 and Q1 over 90 days. 2) Run Q2, Q3, Q7, Q8 over 30 days. 3) Run N1 and N2 for hosts without a sensor. 4) On any hit: contain, preserve, then reimage (runbook section 14). FINDINGS: [fill in after the hunt] GAPS: Injection into svchost.exe, the sleep and environment checks, and the web lure are outside endpoint telemetry or not queried; DLL-load events are not queried; loopback connections may not be logged. ACTIONS: All indicators detect (single vendor report); ASR prevalence rule in audit; scheduled-task auditing; remove standing admin; vendor-only AI app installs; control non-browser DoH and Tor egress. OWNER: REPLACE_WITH_OWNER VERSION: v0.1 (Draft) 2026-11-02
Changelog
References
| Tier | Source | Used for | Access date |
|---|---|---|---|
| T1 | Check Point Research: Tricks from the Past deployed via signed ChatGPT and Claude binaries (2026-10-27) | Whole chain, hashes, network indicators, XMRig configuration, DGA word lists | 2026-11-02 |
| T1 | Check Point Blog: Yoba Malware Abuses Signed ChatGPT and Claude Binaries to Target AI Users (2026-10-27) | Signed-binary framing, nothing compromised at the vendors, broader-compromise advice | 2026-11-02 |
| T3 | Help Net Security: Yoba malware hides in fake desktop versions of ChatGPT and Claude (2026-10-29) | Cross-check of the task disguise and the earlier Cursor.exe variant | 2026-11-02 |
| T3 | Security Affairs: Yoba malware hides a crypto miner behind legitimate OpenAI and Anthropic binaries (2026-10-30) | Cross-check that the sleep loop runs on the failed host-name check | 2026-11-02 |
| T3 | Infosecurity Magazine: Attackers Hide Malware Behind Signed ChatGPT and Claude Binaries (2026-10-28) | Cross-check of the pre-checks and persistence description | 2026-11-02 |
| Ref | MITRE ATT&CK T1574.002 DLL Side-Loading | Technique mapping and mitigations | 2026-11-02 |
| Ref | Microsoft: Attack surface reduction rules reference | ASR prevalence rule in playbook P2 | 2026-11-02 |
Generated 2026-11-02 by HuntPack. Defensive content only.