Siemens Software Center CVE-2026-110936 (Romulus ClickFix DLL side-loading)
Executive Summary
On 2026-10-19 Siemens ProductCERT confirmed active exploitation of CVE-2026-110936, a DLL side-loading flaw (CWE-427, uncontrolled search path element, CVSS v4.0 8.4) in Siemens Software Center. Attackers did not tamper with Siemens software. They bundled a genuine, validly signed Siemens Software Center 3.5.8.7 with their own DLLs in the same folder, distributed it outside official Siemens channels as AllMyBasic.msi through ClickFix lures, and let the vulnerable program load the attacker files when it started. Siemens attributes the activity to the Romulus multi-platform ClickFix campaign. CISA added the flaw to the KEV catalog on 2026-10-20 with a federal due date of 2026-11-03. All versions before 4.0.9.8 are affected.
The highest-value defensive angle is behaviour, not reputation. The Siemens executable is genuine and signed, so a hash or signature block on it would be both useless against the attacker and harmful to real users. Siemens itself says to detect on folder and behaviour: SiemensSoftwareCenter.exe running from AppData\Local\Programs after an msiexec launch (Q1), the SM Software Provisioning Service folder (Q4), a start-up entry or task for a product the host never had (Q6, Q7), and the three Siemens-published network indicators (Q8, Q9).
Source Review & Web Hunter Notes
| Tier | Source | Key finding | Carry forward | Snapshot |
|---|---|---|---|---|
| 1 | Siemens ProductCERT blog: Active Exploitation of CVE-2026-110936 (2026-10-19) | Primary source. Confirms exploitation, Romulus attribution, the IP/domain table, both SHA-256 hashes, warning signs and detection guidance | Yes | 01-siemens-productcert-blog.txt |
| 1 | Siemens Security Advisory SSA-580366 (2026-10-15, V1.2) | CWE-427, CVSS v3.1 6.7 and v4.0 8.4, affected range below V4.0.9.8, remediation, reporter credit | Yes | 02-siemens-ssa-580366.txt |
| 1 | CISA Known Exploited Vulnerabilities Catalog entry | Date added 2026-10-20, due date 2026-11-03, uncontrolled search path element wording | Yes | 03-cisa-kev-catalog.txt |
| 2 | SecurityOnline (2026-10-20) | Restates Siemens guidance and IOCs. Says CISA had not yet added the CVE; the CISA entry supersedes that | Partial | 04-securityonline.txt |
| 2 | The Hacker News: CISA orders federal agencies to patch (2026-10-21) | KEV addition, ClickFix attacks using a platform called Romulus | Yes (KEV context) | 05-thn-cisa-kev.txt |
| 2 | Infosecurity Magazine (2026-10-20) | Describes Romulus as a server hosting panel identified by Forescout on 2026-10-14; lists warning signs | Yes | 06-infosecurity-magazine.txt |
| 2 | heise online (2026-10-21) | Names AllMyBasic.msi and Siemens Software Center 3.5.8.7; independent confirmation of the delivery file | Yes | 07-heise.txt |
| 2 | SOC Prime analysis (2026-10-20) | Names archive.dll as a malicious component and the msiexec to AllMyBasic.msi to SiemensSoftwareCenter.exe chain | Yes (partial) | 08-socprime.txt |
Decisions and discrepancies
- Single upstream for every indicator. The IPs, the domain and both hashes originate in the Siemens ProductCERT blog. SecurityOnline, Infosecurity Magazine and SOC Prime republish them; heise and The Hacker News point to Siemens. Counting those outlets as independent sources would be wrong, so every atomic indicator ships at detect, none at prevent.
- Disqualified source. The SC Media article returned HTTP 403 to every fetch, so no text could be snapshotted. It is not cited and nothing in this pack depends on it.
- Malicious DLL names. Only
archive.dllis named, and only its hash is published. Siemens and SOC Prime imply other attacker DLLs but name none. No further DLL name or hash is invented; Section 10 carries a labelled REPLACE_WITH placeholder. - CVSS. SSA-580366 scores 6.7 on CVSS v3.1 and 8.4 on CVSS v4.0. This pack uses 8.4, the figure the reporting and CISA coverage use.
- Romulus scope. Romulus is a multi-platform ClickFix delivery panel that serves several payloads. This pack carries only the indicators Siemens ties to the Siemens Software Center bundle and takes nothing from other Romulus or ClickFix reporting.
Hunt Brief & Attack Chain
Hunt hypotheses
| # | Hypothesis | MITRE | Telemetry | Confidence | Queries |
|---|---|---|---|---|---|
| H1 | A host ran the genuine Siemens binary from a per-user AppData path right after msiexec, loading attacker DLLs from its own folder | T1574.002, T1218.007 | Process creation with parent and image path (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | High | Q1, Q2 |
| H2 | A host installed the out-of-channel bundle AllMyBasic.msi or executed from the provisioning folder | T1204.002, T1218.007 | Process creation with command line and image path | High | Q3, Q4 |
| H3 | Attacker DLLs were written beside the carrier | T1574.002, T1105 | Executable write events (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents) | Medium | Q5, Q10 |
| H4 | The bundle set persistence for a product the host never had | T1547.001, T1053.005 | Auto-start registry and scheduled task registration (CrowdStrike: AsepValueUpdate, ScheduledTaskRegistered. SentinelOne: Registry Value Modified, Task Register. Defender: DeviceRegistryEvents, DeviceEvents) | Medium | Q6, Q7 |
| H5 | The carrier or the host talked to Siemens-published infrastructure | T1071.001, T1071.004, T1105 | Outbound connection and DNS request with requesting process (CrowdStrike: NetworkConnectIP4, DnsRequest. SentinelOne: IP Connect, DNS Resolved. Defender: DeviceNetworkEvents) | High | Q8, Q9, Q11 |
| H6 | The side-loaded code spawned interpreters under the trusted signed parent | T1059 | Process creation with parent | Low (hypothesis) | Q12 |
Attack chain
| Step | Behaviour | Telemetry | Hunt angle |
|---|---|---|---|
| 1 | Victim meets a ClickFix web lure and is told to run a command | Browser and Run-dialog activity (outside endpoint telemetry for the web page itself) | Known gap. Siemens guidance: never paste web commands into Win+R or PowerShell |
| 2 | msiexec launches the bundle AllMyBasic.msi, distributed outside official Siemens channels | Process creation with command line | Q3, then Q1 for the msiexec parent |
| 3 | The package places a genuine signed Siemens Software Center 3.5.8.7 and attacker DLLs together, creating SM Software Provisioning Service, activate.bak, statinfosta.DB and FTSuite\ftc.uml | Executable writes, process creation with image path | Q4, Q5, Q10 |
| 4 | SiemensSoftwareCenter.exe starts from AppData\Local\Programs and loads the attacker DLLs from its own folder (CVE-2026-110936) | Process creation; image-load telemetry is a native hunt | Q1, Q2 |
| 5 | Persistence as a start-up entry or scheduled task named Siemens Software Center | Auto-start registry, scheduled task registration | Q6, Q7 |
| 6 | Contact with payload hosting and C2 at 96.62.218.59 and wizardexpensive.com | Outbound connection, DNS | Q8, Q9, Q11 |
| 7 | Post-exploitation under the trusted signed process | Process creation with parent | Q12 (hypothesis; no child process is named in the reporting) |
Consolidated IOC Table
| Type | Value | Confidence | Action | Context |
|---|---|---|---|---|
| sha256 | f4d7c5321bb0d1bda439304a753bcf9b467b98ca53c7e9493b9c2c3451092e4a | Medium (single upstream) | detect | AllMyBasic.msi, the malware bundle. Source: Siemens ProductCERT |
| sha256 | 3fdcc7d7d049a89711fb31fb236940a1c5a09d899143ffd20c3c41fb1f2cf491 | Medium (single upstream) | detect | archive.dll, malicious DLL. Source: Siemens ProductCERT |
| ipv4 | 96.62.218.59 | Medium (single upstream) | detect | Active when published. Payload hosting and C2 |
| domain | wizardexpensive.com | Medium (single upstream) | detect | Active when published. Payload hosting and C2 |
| ipv4 | 2.27.248.127 | Medium (single upstream) | detect | Inactive. Distribution channel of AllMyBasic.msi. Useful retrospectively |
| filename | AllMyBasic.msi | Medium | hunt | Out-of-channel bundle name (Q3). Renameable |
| filename | archive.dll | Medium | hunt | Generic name; pivot only (Q5) |
| filename | activate.bak, statinfosta.DB | Medium | hunt | Found beside SiemensSoftwareCenter.exe. Not covered by file-write telemetry; native filesystem sweep (PB1) |
| path | AppData\Local\Programs\SM Software Provisioning Service | Medium | hunt | Folder the malware creates (Q4) |
| path | AppData\Local\FTSuite\ftc.uml | Medium | hunt | Warning sign named by Siemens (PB1) |
| behaviour | SiemensSoftwareCenter.exe from AppData\Local\Programs after msiexec | High | hunt | The observed execution pattern (Q1) |
The signed SiemensSoftwareCenter.exe and its hash are intentionally absent. It is a genuine Siemens binary; matching or blocking it produces false positives and does not stop the attack.
Affected Surface & Telemetry Matrix
| Surface | Telemetry (plain terms, then platforms) | Priority | Gap |
|---|---|---|---|
| Windows endpoints where users can run msiexec and install per-user software | Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | High | None for the launch pattern |
| Per-user AppData\Local\Programs folders | Executable writes (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents) | High | Non-PE artefacts (activate.bak, statinfosta.DB, ftc.uml) are outside endpoint telemetry; use the filesystem sweep |
| DLL load by the signed carrier | Image-load events (CrowdStrike: image-load events vary by sensor; SentinelOne: Module Load. Defender: DeviceImageLoadEvents) | High | Not queried in CQL here; run the native image-load hunts in Section 7 where collected |
| Persistence | Auto-start registry and scheduled task registration (CrowdStrike: AsepValueUpdate, ScheduledTaskRegistered. SentinelOne: Registry Value Modified, Task Register. Defender: DeviceRegistryEvents, DeviceEvents) | Medium | Start-up folder shortcuts are not covered |
| Egress and DNS | Outbound connections and DNS with requesting process (CrowdStrike: NetworkConnectIP4, DnsRequest. SentinelOne: IP Connect, DNS Resolved. Defender: DeviceNetworkEvents) | High | Browser-side ClickFix page and clipboard are outside endpoint telemetry |
| Software distribution | Software inventory and package-source logs | Medium | Outside endpoint telemetry: where the MSI came from |
ATT&CK Mapping
| Tactic | Technique | Observed behaviour | Query or control |
|---|---|---|---|
| Initial Access / Execution | T1204.004 User Execution: Malicious Copy and Paste | ClickFix lure instructs the victim to run a command | Training, restrict Run (Section 12); Q3 for the result |
| Execution | T1204.002 User Execution: Malicious File | Out-of-channel AllMyBasic.msi | Q3, Q10 |
| Defense Evasion | T1218.007 System Binary Proxy Execution: Msiexec | msiexec launches the bundle and the carrier | Q1, Q3 |
| Persistence / Defense Evasion | T1574.002 Hijack Execution Flow: DLL Side-Loading | Genuine signed Siemens binary loads attacker DLLs from its own folder (CVE-2026-110936, CWE-427) | Q1, Q2, Q4, Q5 |
| Persistence | T1547.001 Registry Run Keys / Start-up Folder | Start-up entry named Siemens Software Center | Q7 |
| Persistence | T1053.005 Scheduled Task | Task named Siemens Software Center | Q6 |
| Command and Control | T1071.001 / T1071.004 Application Layer Protocol | Contact with 96.62.218.59 and wizardexpensive.com | Q8, Q9, Q11 |
| Command and Control | T1105 Ingress Tool Transfer | Payload hosting at the same infrastructure | Q8, Q9 |
| Execution | T1059 Command and Scripting Interpreter | Hypothesis: interpreters under the carrier | Q12 |
Native Audit-Log Hunts
| # | Source | Hunt |
|---|---|---|
| N1 | Sysmon Event ID 7 (Image loaded) | Image = SiemensSoftwareCenter.exe from a path containing AppData\Local\Programs and ImageLoaded in the same folder with Signed = false or a DLL name such as archive.dll. This is the direct side-load signal |
| N2 | Sysmon Event ID 1 (Process create) | ParentImage ends msiexec.exe and Image ends SiemensSoftwareCenter.exe, mirroring Q1 |
| N3 | Sysmon Event ID 11 (File create) | TargetFilename ending activate.bak, statinfosta.DB, or ftc.uml under FTSuite, which endpoint executable-write telemetry does not cover |
| N4 | Windows Application log, source MsiInstaller (11707 or 11708) | Product name or package for AllMyBasic on hosts with no Siemens software in your inventory |
| N5 | Task Scheduler Operational log (106) and Security 4698 | Task named Siemens Software Center registered by a standard user |
| N6 | Proxy, DNS and firewall logs | Any request to wizardexpensive.com, 96.62.218.59 or 2.27.248.127 over the full retention; downloads of an MSI from a non-Siemens host |
| N7 | Defender XDR DeviceImageLoadEvents (where licensed) | InitiatingProcessFileName = SiemensSoftwareCenter.exe with FolderPath under AppData\Local\Programs and a non-Siemens signer |
| N8 | Software inventory (RMM, Intune, SCCM) | Installed Siemens Software Center versions below 4.0.9.8, and installs on hosts with no business need |
Hunt Queries: CrowdStrike CQL, SentinelOne PowerQuery and Defender XDR KQL
Use your tenant's own address. SentinelOne does not document a link that pre-fills a query, so each "Copy & open SentinelOne" button copies the query and opens this console: paste it into PowerQuery.
Pick your portal. Microsoft documents a Share link in advanced hunting but not its URL format, so each "Copy & open Defender" button copies the query and opens Advanced hunting: paste it into the editor.
Looks for: SiemensSoftwareCenter.exe running from a per-user AppData\Local\Programs path with msiexec as its parent: the observed execution pattern of the Romulus side-load bundle (T1574.002, T1218.007). FP: A sanctioned per-user install launched once by msiexec at install time looks identical. Confirm the file version: 3.5.8.7 is the abused build, 4.0.9.8 or later is fixed.
Known limitations and deployment notes
- PowerQuery: A process the agent did not observe starting is not captured.
- PowerQuery assumes: Image paths are reported with backslash separators on Windows endpoints.
- PowerQuery assumes: in:anycase and contains are case-insensitive, which reproduces the CQL case-insensitive intent.
- KQL – Defender XDR: A process the sensor did not observe starting is not captured.
- KQL – Defender XDR assumes: FolderPath holds the full image path of the created process.
// HUNT: Siemens Software Center launched by msiexec from AppData\Local\Programs (CVE-2026-110936 carrier) // MITRE: T1574.002, T1218.007, T1204.002 // CONF: high FP: medium COST: low | REQUIRES: process creation with parent and image path // TUNING: exclude ComputerName values of a sanctioned per-user rollout and the packaging UserName; confirm FileVersion is 4.0.9.8 or later before closing a hit. // NOTE: the binary is genuine and signed. Never hash-match or block it; the signal is the path plus the msiexec parent. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^SiemensSoftwareCenter(\.exe)?$/i | ImageFileName=/\\AppData\\Local\\Programs\\/i | ParentBaseFileName=/^msiexec(\.exe)?$/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData, aid])
5 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.time: Event timeevent.type: Event typetgt.process.name: Created process nametgt.process.image.path: Created process pathsrc.process.name: Creator process name
Recommended fields
endpoint.name: Host nametgt.process.cmdline: Created command line
Optional fields
tgt.process.image.sha256: Hash. Population varies by tenant; shown for triage only.
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' tgt.process.name = * | limit 5 | columns event.time, event.type, tgt.process.name, tgt.process.image.path, src.process.name
// HUNT: Siemens Software Center launched by msiexec from AppData\Local\Programs (CVE-2026-110936 carrier)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1574.002, T1218.007, T1204.002
// CONF: high | FP: medium
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: the carrier by name, the per-user Programs path, and msiexec as the creator. On a Process Creation event the created process is tgt.process.* and its creator is src.process.*, so msiexec is matched on src.process.name.
// REQUIRES: SentinelOne process-creation telemetry with creator and image path
// TUNING: Exclude hosts of a sanctioned per-user rollout and the packaging account; confirm the file version is 4.0.9.8 or later before closing a hit. The binary is genuine and signed, so never hash-match or block it.
// LOOKBACK: 7d on the CQL tab; set the console time picker to the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A process the agent did not observe starting is not captured.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' tgt.process.name in:anycase ('SiemensSoftwareCenter.exe', 'SiemensSoftwareCenter') tgt.process.image.path contains '\\AppData\\Local\\Programs\\' src.process.name in:anycase ('msiexec.exe', 'msiexec')
| columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.image.path, tgt.process.cmdline, tgt.process.image.sha256, agent.uuid
| limit 200Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeFileName: Created process nameFolderPath: Created process pathInitiatingProcessFileName: Creator process name
Recommended fields
ProcessCommandLine: Created command line
Optional fields
SHA256: Hash. SHA256 is often unpopulated in DeviceProcessEvents; SHA1 is the safer pivot.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, FileName, FolderPath, InitiatingProcessFileName | take 5
// HUNT: Siemens Software Center launched by msiexec from AppData\Local\Programs (CVE-2026-110936 carrier)
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1574.002, T1218.007, T1204.002
// CONF: high | FP: medium
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: the carrier by name, the per-user Programs path, and msiexec as the creator. The created process is FileName and its creator is InitiatingProcessFileName.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents)
// TUNING: Exclude devices of a sanctioned per-user rollout and the packaging account; confirm the file version is 4.0.9.8 or later before closing a hit. The binary is genuine and signed, so never hash-match or block it.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A process the sensor did not observe starting is not captured.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(7d)
| where FileName in~ ("SiemensSoftwareCenter.exe", "SiemensSoftwareCenter")
| where FolderPath contains "\\AppData\\Local\\Programs\\"
| where InitiatingProcessFileName in~ ("msiexec.exe", "msiexec")
| project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, FolderPath, ProcessCommandLine, SHA1, SHA256
| sort by Timestamp desc
| take 200Looks for: Every host where the genuine Siemens binary runs from a per-user AppData path regardless of parent. Use it to baseline legitimate per-user installs and to catch relaunches after the first msiexec start (for example from the start-up entry). FP: Legitimate per-user installs and the auto-updater also run from AppData. Rank by rare ParentBaseFileName and by hosts that never had Siemens software provisioned.
Known limitations and deployment notes
- PowerQuery: A launch with no hash populated still groups, with an empty hash column.
- PowerQuery assumes: The hash is a group key instead of a collected list, so one row per distinct hash.
- PowerQuery assumes: in:anycase and contains are case-insensitive, which reproduces the CQL case-insensitive intent.
- KQL – Defender XDR: SHA256 is not collected because it is often unpopulated; the set holds SHA1 values.
- KQL – Defender XDR assumes: FolderPath holds the full image path of the created process.
// HUNT: Siemens Software Center per-user path baseline (any parent) // MITRE: T1574.002 // CONF: medium FP: medium COST: low | REQUIRES: process creation with parent and image path // TUNING: drop ParentBaseFileName values you see on sanctioned installs (for example your software-deployment agent); keep rows whose host never had Siemens software provisioned. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^SiemensSoftwareCenter(\.exe)?$/i | ImageFileName=/\\AppData\\Local\\Programs\\/i | groupBy([ComputerName, UserName, ParentBaseFileName, ImageFileName], function=[count(as=Launches), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen), collect([SHA256HashData])], limit=1000) | sort(Launches, order=desc, limit=200)
6 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.time: Event timeevent.type: Event typetgt.process.name: Created process nametgt.process.image.path: Created process pathendpoint.name: Host namesrc.process.name: Creator process name
Recommended fields
src.process.user: Creator user
Optional fields
tgt.process.image.sha256: Hash. Population varies by tenant.
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' tgt.process.name = * | limit 5 | columns event.time, event.type, tgt.process.name, tgt.process.image.path, endpoint.name, src.process.name
// HUNT: Siemens Software Center per-user path baseline (any parent)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1574.002
// CONF: medium | FP: medium
// EQUIVALENCE: equivalent-with-schema-assumptions - Same population and grouping as the CQL baseline. The CQL collects the hashes into a list per group; here the hash is a group key, so a group with two hashes becomes two rows.
// REQUIRES: SentinelOne process-creation telemetry with creator and image path
// TUNING: Drop creator names you see on sanctioned installs, for example your software-deployment agent; keep rows whose host never had Siemens software provisioned.
// LOOKBACK: 7d on the CQL tab; set the console time picker to the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A launch with no hash populated still groups, with an empty hash column.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' tgt.process.name in:anycase ('SiemensSoftwareCenter.exe', 'SiemensSoftwareCenter') tgt.process.image.path contains '\\AppData\\Local\\Programs\\'
| group launches=count(), first_seen=min(event.time), last_seen=max(event.time) by endpoint.name, src.process.user, src.process.name, tgt.process.image.path, tgt.process.image.sha256
| sort -launches
| limit 200Automated validation: static-passed
6 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeFileName: Created process nameFolderPath: Created process pathInitiatingProcessFileName: Creator process nameDeviceName: Device nameAccountName: Account name
Optional fields
SHA1: Hash. SHA256 is often unpopulated in DeviceProcessEvents; SHA1 is the safer pivot.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, FileName, FolderPath, InitiatingProcessFileName, DeviceName, AccountName | take 5
// HUNT: Siemens Software Center per-user path baseline (any parent)
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1574.002
// CONF: medium | FP: medium
// EQUIVALENCE: equivalent-with-schema-assumptions - Same population and grouping as the CQL baseline, with the creator as InitiatingProcessFileName. Hashes are collected into a set per group as in the CQL.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents)
// TUNING: Drop creator names you see on sanctioned installs, for example your software-deployment agent; keep rows whose device never had Siemens software provisioned.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: SHA256 is not collected because it is often unpopulated; the set holds SHA1 values.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed-with-warnings; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(7d)
| where FileName in~ ("SiemensSoftwareCenter.exe", "SiemensSoftwareCenter")
| where FolderPath contains "\\AppData\\Local\\Programs\\"
| summarize Launches = count(), FirstSeen = min(Timestamp), LastSeen = max(Timestamp), Sha1s = make_set(SHA1) by DeviceName, AccountName, InitiatingProcessFileName, FolderPath
| sort by Launches desc
| take 200Looks for: msiexec.exe whose command line names AllMyBasic.msi, the bundle Siemens reports was distributed outside official channels. A renamed package will not match; pair with Q1 and Q4.
Known limitations and deployment notes
- PowerQuery: An MSI renamed before execution is not matched.
- PowerQuery assumes: contains is case-insensitive, which reproduces the CQL case-insensitive intent.
- KQL – Defender XDR: An MSI renamed before execution is not matched.
- KQL – Defender XDR assumes: ProcessCommandLine carries the full msiexec argument string.
// HUNT: msiexec running AllMyBasic.msi (out-of-channel Romulus bundle) // MITRE: T1218.007, T1204.002 // CONF: high FP: low COST: low | REQUIRES: process creation with command line // NOTE: filename-only signal, so an attacker who renames the MSI evades it. Q1 and Q4 do not depend on the MSI name. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^msiexec(\.exe)?$/i | CommandLine=/AllMyBasic\.msi/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData, aid])
4 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.time: Event timeevent.type: Event typetgt.process.name: Created process nametgt.process.cmdline: Created command line
Recommended fields
endpoint.name: Host namesrc.process.name: Creator process name
Optional fields
tgt.process.image.sha256: Hash. Hash of msiexec itself; population varies by tenant.
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' tgt.process.cmdline = * | limit 5 | columns event.time, event.type, tgt.process.name, tgt.process.cmdline
// HUNT: msiexec running AllMyBasic.msi (out-of-channel Romulus bundle)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1218.007, T1204.002
// CONF: high | FP: low
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: msiexec created with AllMyBasic.msi on its command line. The CQL's dot is a regex escape for a literal dot, which contains reproduces exactly.
// REQUIRES: SentinelOne process-creation telemetry with command line
// TUNING: Filename-only signal: a renamed MSI evades it, so read this with the carrier-path hunts on the neighbouring cards.
// LOOKBACK: 7d on the CQL tab; set the console time picker to the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: An MSI renamed before execution is not matched.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' tgt.process.name in:anycase ('msiexec.exe', 'msiexec') tgt.process.cmdline contains 'AllMyBasic.msi'
| columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.image.path, tgt.process.cmdline, tgt.process.image.sha256, agent.uuid
| limit 200Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeFileName: Created process nameProcessCommandLine: Created command line
Recommended fields
InitiatingProcessFileName: Creator process name
Optional fields
SHA256: Hash. SHA256 is often unpopulated in DeviceProcessEvents; SHA1 is the safer pivot.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, FileName, ProcessCommandLine | take 5
// HUNT: msiexec running AllMyBasic.msi (out-of-channel Romulus bundle)
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1218.007, T1204.002
// CONF: high | FP: low
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: msiexec created with AllMyBasic.msi on its command line. contains is case-insensitive, which reproduces the CQL case-insensitive intent.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents)
// TUNING: Filename-only signal: a renamed MSI evades it, so read this with the carrier-path hunts on the neighbouring cards.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: An MSI renamed before execution is not matched.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(7d)
| where FileName in~ ("msiexec.exe", "msiexec")
| where ProcessCommandLine contains "AllMyBasic.msi"
| project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, FolderPath, ProcessCommandLine, SHA1, SHA256
| sort by Timestamp desc
| take 200Looks for: A process image under a folder named SM Software Provisioning Service, which Siemens says the malware creates inside AppData\Local\Programs.
Known limitations and deployment notes
- PowerQuery: A payload moved out of the folder before it runs is not matched.
- PowerQuery assumes: Image paths are reported with backslash separators on Windows endpoints.
- PowerQuery assumes: contains is case-insensitive, which reproduces the CQL case-insensitive intent.
- KQL – Defender XDR: A payload moved out of the folder before it runs is not matched.
- KQL – Defender XDR assumes: FolderPath holds the folder of the created process, so the folder name appears inside it.
// HUNT: process running from SM Software Provisioning Service folder // MITRE: T1574.002, T1036.005 // CONF: high FP: low COST: low | REQUIRES: process creation with image path // NOTE: folder name taken from the Siemens ProductCERT warning signs; the legitimate product does not create it. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ImageFileName=/\\SM Software Provisioning Service\\/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData, aid])
3 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.time: Event timeevent.type: Event typetgt.process.image.path: Created process path
Recommended fields
endpoint.name: Host nametgt.process.cmdline: Created command line
Optional fields
tgt.process.image.sha256: Hash. Population varies by tenant.
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' tgt.process.image.path = * | limit 5 | columns event.time, event.type, tgt.process.image.path
// HUNT: process running from SM Software Provisioning Service folder // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1574.002, T1036.005 // CONF: high | FP: low // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: any created process whose image path contains the provisioning-service folder name between backslashes. // REQUIRES: SentinelOne process-creation telemetry with image path // TUNING: The legitimate product does not create this folder; investigate every hit rather than tuning it away. // LOOKBACK: 7d on the CQL tab; set the console time picker to the incident window // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A payload moved out of the folder before it runs is not matched. // VALIDATION LEVEL: static-reviewed event.type = 'Process Creation' tgt.process.image.path contains '\\SM Software Provisioning Service\\' | columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.image.path, tgt.process.cmdline, tgt.process.image.sha256, agent.uuid | limit 200
Automated validation: static-passed
2 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeFolderPath: Created process path
Recommended fields
ProcessCommandLine: Created command line
Optional fields
SHA256: Hash. SHA256 is often unpopulated in DeviceProcessEvents; SHA1 is the safer pivot.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, FolderPath | take 5
// HUNT: process running from SM Software Provisioning Service folder // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1574.002, T1036.005 // CONF: high | FP: low // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: any created process whose image path contains the provisioning-service folder name between backslashes. // REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents) // TUNING: The legitimate product does not create this folder; investigate every hit rather than tuning it away. // LOOKBACK: 7d; extend to 30d for the incident window // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A payload moved out of the folder before it runs is not matched. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceProcessEvents | where Timestamp >= ago(7d) | where FolderPath contains "\\SM Software Provisioning Service\\" | project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, FolderPath, ProcessCommandLine, SHA1, SHA256 | sort by Timestamp desc | take 200
Looks for: A PE write named archive.dll under a user AppData\Local path. Siemens names archive.dll as a malicious file in this campaign; the name is generic, so this is a pivot and not proof. FP: archive.dll is a common library name for unrelated per-user applications. Check the writer (ContextBaseFileName) and compare SHA256HashData with Q10.
Known limitations and deployment notes
- PowerQuery: The PE-content verdict of the CQL is not available, so non-PE files named archive.dll also match.
- PowerQuery assumes: File Creation and File Modification stand in for the executable-write events; no PE-content check is applied.
- PowerQuery assumes: On a file event the acting process is src.process.*.
- PowerQuery assumes: File paths are reported with backslash separators on Windows endpoints.
- KQL – Defender XDR: The PE-content verdict of the CQL is not available, so non-PE files named archive.dll also match.
- KQL – Defender XDR assumes: FileCreated and FileModified stand in for the executable-write events; no PE-content check is applied.
- KQL – Defender XDR assumes: FolderPath holds the folder of the written file.
// HUNT: archive.dll PE write under AppData\Local // MITRE: T1574.002, T1105 // CONF: medium FP: medium COST: low | REQUIRES: executable write telemetry // TUNING: exclude writers and folders of applications you own that legitimately ship archive.dll; keep hits written by msiexec or next to SiemensSoftwareCenter.exe. #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ | FileName=/^archive\.dll$/i | TargetFileName=/\\AppData\\Local\\/i | table([@timestamp, ComputerName, UserName, ContextBaseFileName, TargetFileName, SHA256HashData, aid])
3 required fields · View requirements
Required telemetry
- File Creation
- File Modification
Required fields
event.time: Event timeevent.type: Event typetgt.file.path: Written file path
Recommended fields
endpoint.name: Host namesrc.process.name: Writing process name
Optional fields
tgt.file.sha256: Hash. Population varies by tenant.
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'File Creation' tgt.file.path = * | limit 5 | columns event.time, event.type, tgt.file.path
// HUNT: archive.dll PE write under AppData\Local
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1574.002, T1105
// CONF: medium | FP: medium
// EQUIVALENCE: approximate-analytic - The CQL fires on executable-write events, which carry a PE-content verdict. SentinelOne exposes File Creation and File Modification without that verdict, so this matches the filename and folder only. A non-PE file named archive.dll would also match.
// REQUIRES: SentinelOne file creation and modification telemetry
// TUNING: Exclude writers and folders of applications you own that legitimately ship archive.dll; keep hits written by msiexec or next to SiemensSoftwareCenter.exe.
// LOOKBACK: 7d on the CQL tab; set the console time picker to the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: The PE-content verdict of the CQL is not available, so non-PE files named archive.dll also match.
// VALIDATION LEVEL: static-reviewed
event.type in ('File Creation', 'File Modification') tgt.file.path matches '\\\\archive\\.dll$' tgt.file.path contains '\\AppData\\Local\\'
| columns event.time, endpoint.name, src.process.user, src.process.name, tgt.file.path, tgt.file.sha256, agent.uuid
| limit 200Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceFileEvents
Required fields
Timestamp: Event timeActionType: Action typeFileName: Written file nameFolderPath: Written file folder
Recommended fields
InitiatingProcessFileName: Writing process
Optional fields
SHA1: Hash. SHA256 is often unpopulated; SHA1 is the safer pivot.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceFileEvents | where Timestamp > ago(1d) | project Timestamp, ActionType, FileName, FolderPath | take 5
// HUNT: archive.dll PE write under AppData\Local
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1574.002, T1105
// CONF: medium | FP: medium
// EQUIVALENCE: approximate-analytic - The CQL fires on executable-write events, which carry a PE-content verdict. DeviceFileEvents records file creation and modification without that verdict, so this matches the filename and folder only.
// REQUIRES: Defender for Endpoint file event telemetry (DeviceFileEvents)
// TUNING: Exclude writers and folders of applications you own that legitimately ship archive.dll; keep hits written by msiexec or next to SiemensSoftwareCenter.exe.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: The PE-content verdict of the CQL is not available, so non-PE files named archive.dll also match.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceFileEvents
| where Timestamp >= ago(7d)
| where ActionType in ("FileCreated", "FileModified")
| where FileName =~ "archive.dll"
| where FolderPath contains "\\AppData\\Local\\"
| project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, FileName, FolderPath, SHA1, SHA256
| sort by Timestamp desc
| take 200Looks for: A scheduled task whose name contains Siemens Software Center, SiemensSoftwareCenter or SM Software Provisioning. Matching on the task name keeps the query to fields in the Falcon reference; a task with an unrelated name needs the task action path from native logs (Section 7, N5). Siemens lists a task or start-up entry on a PC that never had the product as a warning sign. FP: A managed install may register a task of its own. Expect a few hits on sanctioned installs; the signal is a task on a host that never had the product.
Known limitations and deployment notes
- PowerQuery: Tasks registered through the Task Scheduler API, COM or an imported XML file without the task name on a command line are not seen.
- PowerQuery assumes: A task created through the schtasks command line carries its name in the command line.
- PowerQuery assumes: contains is case-insensitive, which reproduces the CQL case-insensitive intent.
- KQL – Defender XDR: If the tenant does not record ScheduledTaskCreated, the query returns nothing; the readiness test shows which keys are populated.
- KQL – Defender XDR assumes: ScheduledTaskCreated is recorded on the tenant and carries the task name under the TaskName key of AdditionalFields.
- KQL – Defender XDR assumes: contains is case-insensitive, which reproduces the CQL case-insensitive intent.
// HUNT: scheduled task for Siemens Software Center on hosts that never had it // MITRE: T1053.005 // CONF: medium FP: medium COST: low | REQUIRES: scheduled task registration events // TUNING: exclude hosts in your sanctioned Siemens software group and tasks you can tie to a managed install; keep tasks on hosts with no Siemens software. #event_simpleName=ScheduledTaskRegistered | TaskName=/Siemens Software Center|SiemensSoftwareCenter|SM Software Provisioning/i | table([@timestamp, ComputerName, UserName, TaskName, aid])
4 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.time: Event timeevent.type: Event typetgt.process.name: Created process nametgt.process.cmdline: Created command line
Recommended fields
endpoint.name: Host namesrc.process.user: Creator user
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' tgt.process.cmdline contains '/create' | limit 5 | columns event.time, event.type, tgt.process.name, tgt.process.cmdline
// HUNT: scheduled task for Siemens Software Center on hosts that never had it // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1053.005 // CONF: medium | FP: medium // EQUIVALENCE: approximate-analytic - No scheduled-task registration event is attested in the SentinelOne field model. This pivots on the schtasks command line that creates a task, which catches command-line registration only. // REQUIRES: SentinelOne process-creation telemetry with command line // TUNING: Exclude hosts in your sanctioned Siemens software group and tasks you can tie to a managed install; keep tasks on hosts with no Siemens software. // LOOKBACK: 7d on the CQL tab; set the console time picker to the incident window // CONFIGURATION: No lookup objects required. // KNOWN GAPS: Tasks registered through the Task Scheduler API, COM or an imported XML file without the task name on a command line are not seen. // VALIDATION LEVEL: static-reviewed event.type = 'Process Creation' (tgt.process.cmdline contains '/create' or tgt.process.cmdline contains '-create') (tgt.process.cmdline contains 'Siemens Software Center' or tgt.process.cmdline contains 'SiemensSoftwareCenter' or tgt.process.cmdline contains 'SM Software Provisioning') | columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline, agent.uuid | limit 200
Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceEvents
Required fields
Timestamp: Event timeActionType: Action typeAdditionalFields: Task details
Recommended fields
InitiatingProcessFileName: Registering process
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceEvents | where Timestamp > ago(1d) | where ActionType == "ScheduledTaskCreated" | project Timestamp, ActionType, AdditionalFields | take 5
// HUNT: scheduled task for Siemens Software Center on hosts that never had it // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1053.005 // CONF: medium | FP: medium // EQUIVALENCE: equivalent-with-schema-assumptions - Same event population: a task-registration action filtered on the task name. The ScheduledTaskCreated action and its TaskName key are attested in Microsoft hunting repositories rather than on the Learn table page. // REQUIRES: Defender for Endpoint DeviceEvents with the ScheduledTaskCreated action // TUNING: Exclude devices in your sanctioned Siemens software group and tasks you can tie to a managed install; keep tasks on devices with no Siemens software. // LOOKBACK: 7d; extend to 30d for the incident window // CONFIGURATION: No lookup objects required. // KNOWN GAPS: If the tenant does not record ScheduledTaskCreated, the query returns nothing; the readiness test shows which keys are populated. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceEvents | where Timestamp >= ago(7d) | where ActionType == "ScheduledTaskCreated" | extend TaskName = tostring(parse_json(AdditionalFields)["TaskName"]) | where TaskName contains "Siemens Software Center" or TaskName contains "SiemensSoftwareCenter" or TaskName contains "SM Software Provisioning" | project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, TaskName, AdditionalFields | sort by Timestamp desc | take 200
Looks for: An auto-start registry value named Siemens Software Center, or one pointing at the carrier or the provisioning folder under AppData\Local\Programs. FP: A legitimate per-user install may set its own start-up entry. Require a host with no sanctioned Siemens software.
Known limitations and deployment notes
- PowerQuery: The CQL's ordering of path before carrier name is relaxed, which can only widen the match.
- PowerQuery assumes: Registry Value Modified covers Run-key writes the CQL sees as auto-start updates.
- PowerQuery assumes: The path and carrier name are matched as two substrings without order.
- PowerQuery assumes: Key paths are reported with backslash separators.
- KQL – Defender XDR: Values written through a path the sensor does not log as RegistryValueSet are not captured.
- KQL – Defender XDR assumes: RegistryValueSet covers the Run-key writes the CQL sees as auto-start updates.
- KQL – Defender XDR assumes: RegistryKey holds the full key path including the CurrentVersion\Run segment.
// HUNT: Run-key persistence for the Siemens carrier // MITRE: T1547.001 // CONF: medium FP: medium COST: low | REQUIRES: auto-start registry telemetry // TUNING: exclude hosts in your sanctioned Siemens software group; keep values that point at AppData. #event_simpleName=AsepValueUpdate | RegObjectName=/\\CurrentVersion\\Run/i | RegValueName=/Siemens Software Center/i or RegStringValue=/AppData\\Local\\Programs\\.*SiemensSoftwareCenter\.exe|SM Software Provisioning Service/i | table([@timestamp, ComputerName, UserName, RegObjectName, RegValueName, RegStringValue, aid])
5 required fields · View requirements
Required telemetry
- Registry Value Modified
Required fields
event.time: Event timeevent.type: Event typeregistry.keyPath: Registry keyregistry.valueName: Registry value nameregistry.value: Registry value data
Recommended fields
endpoint.name: Host namesrc.process.name: Writing process
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Registry Value Modified' registry.keyPath = * | limit 5 | columns event.time, event.type, registry.keyPath, registry.valueName, registry.value
// HUNT: Run-key persistence for the Siemens carrier // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1547.001 // CONF: medium | FP: medium // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: a Run-key value written with the product name, the provisioning folder, or a per-user Programs path to the carrier. The CQL requires the path to precede the carrier name; here both are required as substrings without order. // REQUIRES: SentinelOne registry value modification telemetry // TUNING: Exclude hosts in your sanctioned Siemens software group; keep values that point at AppData. // LOOKBACK: 7d on the CQL tab; set the console time picker to the incident window // CONFIGURATION: No lookup objects required. // KNOWN GAPS: The CQL's ordering of path before carrier name is relaxed, which can only widen the match. // VALIDATION LEVEL: static-reviewed event.type = 'Registry Value Modified' registry.keyPath contains '\\CurrentVersion\\Run' (registry.valueName contains 'Siemens Software Center' or registry.value contains 'SM Software Provisioning Service' or (registry.value contains '\\AppData\\Local\\Programs\\' and registry.value contains 'SiemensSoftwareCenter.exe')) | columns event.time, endpoint.name, src.process.user, src.process.name, registry.keyPath, registry.valueName, registry.value, agent.uuid | limit 200
Automated validation: static-passed
5 required fields · View requirements
Required telemetry
- DeviceRegistryEvents
Required fields
Timestamp: Event timeActionType: Action typeRegistryKey: Registry keyRegistryValueName: Registry value nameRegistryValueData: Registry value data
Recommended fields
InitiatingProcessFileName: Writing process
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceRegistryEvents | where Timestamp > ago(1d) | where ActionType == "RegistryValueSet" | project Timestamp, ActionType, RegistryKey, RegistryValueName, RegistryValueData | take 5
// HUNT: Run-key persistence for the Siemens carrier // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1547.001 // CONF: medium | FP: medium // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate on DeviceRegistryEvents: a Run-key value written with the product name, the provisioning folder, or a per-user Programs path followed by the carrier name, using the same ordered regex as the CQL. // REQUIRES: Defender for Endpoint registry telemetry (DeviceRegistryEvents) // TUNING: Exclude devices in your sanctioned Siemens software group; keep values that point at AppData. // LOOKBACK: 7d; extend to 30d for the incident window // CONFIGURATION: No lookup objects required. // KNOWN GAPS: Values written through a path the sensor does not log as RegistryValueSet are not captured. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceRegistryEvents | where Timestamp >= ago(7d) | where ActionType == "RegistryValueSet" | where RegistryKey contains "\\CurrentVersion\\Run" | where RegistryValueName contains "Siemens Software Center" or RegistryValueData contains "SM Software Provisioning Service" or RegistryValueData matches regex @"(?i)AppData\\Local\\Programs\\.*SiemensSoftwareCenter\.exe" | project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, RegistryKey, RegistryValueName, RegistryValueData | sort by Timestamp desc | take 200
Looks for: Any outbound IPv4 connection to 96.62.218.59 (active, payload hosting and C2) or 2.27.248.127 (inactive distribution channel). Siemens asks defenders to search logs for both, because hosts that downloaded before takedown may still be infected.
Known limitations and deployment notes
- PowerQuery: Connections made through a proxy show the proxy address, not the campaign address.
- PowerQuery assumes: IP Connect events carry the remote address in dst.ip.address for outbound connections.
- KQL – Defender XDR: Advanced Hunting keeps 30 days, so older historic hits are visible only on the CQL tab.
- KQL – Defender XDR: Connections made through a proxy show the proxy address, not the campaign address.
- KQL – Defender XDR assumes: RemoteIP holds the destination address of outbound connections.
// HUNT: connections to Siemens-published Romulus bundle IPs // MITRE: T1071.001, T1105 // CONF: high FP: low COST: low | REQUIRES: outbound IPv4 connection telemetry // NOTE: single upstream (Siemens ProductCERT). Run over the longest retention; the distribution IP is inactive so only historic hits matter. #event_simpleName=NetworkConnectIP4 | in(field=RemoteAddressIP4, values=["96.62.218.59", "2.27.248.127"]) | table([@timestamp, ComputerName, UserName, ContextBaseFileName, RemoteAddressIP4, RemotePort, aid])
3 required fields · View requirements
Required telemetry
- IP Connect
Required fields
event.time: Event timeevent.type: Event typedst.ip.address: Destination address
Recommended fields
endpoint.name: Host namesrc.process.name: Connecting processdst.port.number: Destination port
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'IP Connect' dst.ip.address = * | limit 5 | columns event.time, event.type, dst.ip.address, dst.port.number
// HUNT: connections to Siemens-published Romulus bundle IPs
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1071.001, T1105
// CONF: high | FP: low
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: an IPv4 connection whose destination is one of the two published addresses. The acting process on a network event is src.process.*.
// REQUIRES: SentinelOne IP Connect telemetry
// TUNING: Single upstream source (Siemens ProductCERT). Run over the longest retention; the distribution address is inactive, so only historic hits matter.
// LOOKBACK: Longest retention available; the CQL tab is run over the same range
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: Connections made through a proxy show the proxy address, not the campaign address.
// VALIDATION LEVEL: static-reviewed
event.type = 'IP Connect' dst.ip.address in ('96.62.218.59', '2.27.248.127')
| columns event.time, endpoint.name, src.process.user, src.process.name, src.ip.address, dst.ip.address, dst.port.number, agent.uuid
| limit 200Automated validation: static-passed
2 required fields · View requirements
Required telemetry
- DeviceNetworkEvents
Required fields
Timestamp: Event timeRemoteIP: Destination address
Recommended fields
InitiatingProcessFileName: Connecting processRemotePort: Destination port
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceNetworkEvents | where Timestamp > ago(1d) | project Timestamp, RemoteIP, RemotePort | take 5
// HUNT: connections to Siemens-published Romulus bundle IPs
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1071.001, T1105
// CONF: high | FP: low
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate on DeviceNetworkEvents: remote address is one of the two published addresses.
// REQUIRES: Defender for Endpoint network telemetry (DeviceNetworkEvents)
// TUNING: Single upstream source (Siemens ProductCERT). The distribution address is inactive, so only historic hits matter.
// LOOKBACK: 30d (Advanced Hunting retention; the CQL tab covers the longest retention available)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: Advanced Hunting keeps 30 days, so older historic hits are visible only on the CQL tab. Connections made through a proxy show the proxy address, not the campaign address.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceNetworkEvents
| where Timestamp >= ago(30d)
| where RemoteIP in ("96.62.218.59", "2.27.248.127")
| project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, RemoteIP, RemotePort, ActionType
| sort by Timestamp desc
| take 200Looks for: DNS requests for the Siemens-published payload hosting and C2 domain, including subdomains.
Known limitations and deployment notes
- PowerQuery: If the tenant populates dns.request instead, the query returns nothing until the field is swapped.
- PowerQuery assumes: The request name is held in event.dns.request on this tenant; the vendor docs name dns.request, so the readiness test prints both.
- PowerQuery assumes: matches is case-insensitive, which reproduces the CQL case-insensitive intent.
- KQL – Defender XDR: Advanced Hunting keeps 30 days, so older hits are visible only on the CQL tab.
- KQL – Defender XDR assumes: The tenant records DnsQueryResponse and keeps the name under DnsQueryString or QueryName in AdditionalFields.
// HUNT: DNS requests for the Siemens-published Romulus domain // MITRE: T1071.004, T1105 // CONF: high FP: low COST: low | REQUIRES: DNS request telemetry with requesting process // NOTE: single upstream (Siemens ProductCERT). #event_simpleName=DnsRequest | DomainName=/(^|\.)wizardexpensive\.com$/i | table([@timestamp, ComputerName, UserName, ContextBaseFileName, DomainName, aid])
3 required fields · View requirements
Required telemetry
- DNS Resolved
Required fields
event.time: Event timeevent.type: Event typeevent.dns.request: Requested name
Recommended fields
endpoint.name: Host namesrc.process.name: Requesting process
Fallbacks
event.dns.request→dns.request: Which request field a tenant populates; swap it in the query if the readiness test shows only the fallback.endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.category = 'dns' | limit 5 | columns event.time, event.type, event.dns.request, dns.request
// HUNT: DNS requests for the Siemens-published Romulus domain // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1071.004, T1105 // CONF: high | FP: low // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: a DNS request for wizardexpensive.com or any subdomain of it, using the same anchored regex. The request name is event.dns.request, which the independent pySigma backend attests; the vendor field docs name dns.request instead. // REQUIRES: SentinelOne DNS Resolved telemetry with the requesting process // TUNING: Single upstream source (Siemens ProductCERT). Any hit on a host with no sanctioned Siemens software is in scope. // LOOKBACK: 7d on the CQL tab; set the console time picker to the incident window // CONFIGURATION: No lookup objects required. // KNOWN GAPS: If the tenant populates dns.request instead, the query returns nothing until the field is swapped. // VALIDATION LEVEL: static-reviewed event.type = 'DNS Resolved' event.dns.request matches '(^|\\.)wizardexpensive\\.com$' | columns event.time, endpoint.name, src.process.user, src.process.name, event.dns.request, agent.uuid | limit 200
Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceEvents
Required fields
Timestamp: Event timeActionType: Action typeAdditionalFields: Query details
Recommended fields
InitiatingProcessFileName: Requesting process
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceEvents | where Timestamp > ago(1d) | where ActionType == "DnsQueryResponse" | project Timestamp, ActionType, AdditionalFields | take 5
// HUNT: DNS requests for the Siemens-published Romulus domain // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1071.004, T1105 // CONF: high | FP: low // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: a DNS request for wizardexpensive.com or any subdomain of it. Defender has no endpoint DNS table, so the name is read from the DnsQueryResponse action's AdditionalFields. // REQUIRES: Defender for Endpoint DeviceEvents with the DnsQueryResponse action // TUNING: Single upstream source (Siemens ProductCERT). Any hit on a device with no sanctioned Siemens software is in scope. // LOOKBACK: 30d (Advanced Hunting retention); the CQL tab covers the longest retention available // CONFIGURATION: No lookup objects required. // KNOWN GAPS: Advanced Hunting keeps 30 days, so older hits are visible only on the CQL tab. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceEvents | where Timestamp >= ago(30d) | where ActionType == "DnsQueryResponse" | extend QueryName = tostring(coalesce(parse_json(AdditionalFields)["DnsQueryString"], parse_json(AdditionalFields)["QueryName"])) | where QueryName =~ "wizardexpensive.com" or QueryName endswith ".wizardexpensive.com" | project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, QueryName, ActionType, AdditionalFields | sort by Timestamp desc | take 200
Looks for: Exact SHA-256 matches for the two hashes in the Siemens ProductCERT table. The MSI is not a PE file, so a sensor may never hash it; the DLL hash is the more reliable half. Never hash-match the Siemens executable itself.
Known limitations and deployment notes
- PowerQuery: Hosts or event types where the agent does not compute SHA-256 return nothing.
- PowerQuery assumes: SHA-256 is populated on the tenant for process images and written files.
- KQL – Defender XDR: A process started from a file with one of these hashes is not matched, because the process-start table is not read.
- KQL – Defender XDR: SHA256 is often unpopulated, so a clean result is weaker than the CQL tab's.
- KQL – Defender XDR: Advanced Hunting keeps 30 days; older hits are visible only on the CQL tab.
- KQL – Defender XDR assumes: SHA256 is populated on file events for the tenant.
// HUNT: Siemens-published campaign file hashes // MITRE: T1574.002, T1204.002 // CONF: high FP: low COST: low | REQUIRES: file hash on process and executable-write events // NOTE: single upstream (Siemens ProductCERT). Detect only. The genuine SiemensSoftwareCenter.exe hash is deliberately absent. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|PeFileWritten|NewExecutableWritten)$/ | in(field=SHA256HashData, values=["f4d7c5321bb0d1bda439304a753bcf9b467b98ca53c7e9493b9c2c3451092e4a", "3fdcc7d7d049a89711fb31fb236940a1c5a09d899143ffd20c3c41fb1f2cf491"]) | table([@timestamp, #event_simpleName, ComputerName, UserName, FileName, TargetFileName, ImageFileName, SHA256HashData, aid])
3 required fields · View requirements
Required telemetry
- Process Creation
- File Creation
Required fields
event.time: Event timetgt.process.image.sha256: Process image hashtgt.file.sha256: File hash
Recommended fields
event.type: Event typeendpoint.name: Host name
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
tgt.process.image.sha256 = * | limit 5 | columns event.time, event.type, tgt.process.image.sha256, tgt.file.sha256
// HUNT: Siemens-published campaign file hashes
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1574.002, T1204.002
// CONF: high | FP: low
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: either published SHA-256 on a created process image or on a written file. SentinelOne attests SHA-256 on both, so both halves of the CQL's event population are covered.
// REQUIRES: SentinelOne process-creation and file telemetry with SHA-256 populated
// TUNING: Single upstream source (Siemens ProductCERT). Detect only; do not block on these hashes without confirming against the genuine product.
// LOOKBACK: 7d on the CQL tab; set the console time picker to the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: Hosts or event types where the agent does not compute SHA-256 return nothing.
// VALIDATION LEVEL: static-reviewed
(tgt.process.image.sha256 in:anycase ('f4d7c5321bb0d1bda439304a753bcf9b467b98ca53c7e9493b9c2c3451092e4a', '3fdcc7d7d049a89711fb31fb236940a1c5a09d899143ffd20c3c41fb1f2cf491') or tgt.file.sha256 in:anycase ('f4d7c5321bb0d1bda439304a753bcf9b467b98ca53c7e9493b9c2c3451092e4a', '3fdcc7d7d049a89711fb31fb236940a1c5a09d899143ffd20c3c41fb1f2cf491'))
| columns event.time, event.type, endpoint.name, src.process.name, tgt.process.image.path, tgt.file.path, tgt.process.image.sha256, tgt.file.sha256, agent.uuid
| limit 200Automated validation: static-passed
2 required fields · View requirements
Required telemetry
- DeviceFileEvents
Required fields
Timestamp: Event timeSHA256: File hash
Recommended fields
InitiatingProcessFileName: Writing process
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceFileEvents | where Timestamp > ago(1d) | project Timestamp, SHA256 | take 5
// HUNT: Siemens-published campaign file hashes
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1574.002, T1204.002
// CONF: high | FP: low
// EQUIVALENCE: telemetry-gap - Partial pivot: DeviceFileEvents covers the written-file half of the CQL's population. The process-start half is left out because a query reads one table, and SHA256 is often unpopulated in the Device tables.
// REQUIRES: Defender for Endpoint file event telemetry (DeviceFileEvents) with SHA256 populated
// TUNING: Single upstream source (Siemens ProductCERT). Detect only; do not block on these hashes without confirming against the genuine product.
// LOOKBACK: 30d (Advanced Hunting retention); the CQL tab covers the longest retention available
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A process started from a file with one of these hashes is not matched, because the process-start table is not read. SHA256 is often unpopulated, so a clean result is weaker than the CQL tab's. Advanced Hunting keeps 30 days; older hits are visible only on the CQL tab.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceFileEvents
| where Timestamp >= ago(30d)
| where SHA256 in~ ("f4d7c5321bb0d1bda439304a753bcf9b467b98ca53c7e9493b9c2c3451092e4a", "3fdcc7d7d049a89711fb31fb236940a1c5a09d899143ffd20c3c41fb1f2cf491")
| project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, ActionType, FileName, FolderPath, SHA256
| sort by Timestamp desc
| take 200Looks for: Rare external destinations contacted by the Siemens carrier process. The real product talks to Siemens services, so this ranks destinations by how few hosts reach them instead of alerting on any one. FP: The legitimate updater and download features connect to Siemens infrastructure on every host. Baseline first; investigate destinations reached by one or two hosts only.
Known limitations and deployment notes
- PowerQuery: Only a single sample host is listed per destination.
- PowerQuery assumes: The distinct-host count is an estimate (estimate_distinct).
- PowerQuery assumes: Only one sample host name is shown per destination instead of the full list.
- KQL – Defender XDR: Host names are capped at 20 per destination.
- KQL – Defender XDR assumes: InitiatingProcessFileName holds the connecting process name.
// HUNT: rare external destinations of the Siemens carrier process // MITRE: T1071.001 // CONF: low FP: high COST: medium | REQUIRES: outbound IPv4 connection telemetry with process name // TUNING: build an allowlist of Siemens destinations from 30 days of clean hosts and subtract it; escalate any destination with Hosts=1 that is not on it. #event_simpleName=NetworkConnectIP4 | ContextBaseFileName=/^SiemensSoftwareCenter(\.exe)?$/i | !cidr(RemoteAddressIP4, subnet=["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "127.0.0.0/8", "169.254.0.0/16"]) | groupBy([RemoteAddressIP4, RemotePort], function=[count(as=Conns), count(aid, distinct=true, as=Hosts), collect([ComputerName])], limit=500) | sort(Hosts, order=asc, limit=100)
6 required fields · View requirements
Required telemetry
- IP Connect
Required fields
event.time: Event timeevent.type: Event typesrc.process.name: Connecting processdst.ip.address: Destination addressdst.port.number: Destination portagent.uuid: Endpoint identifier
Recommended fields
endpoint.name: Host name
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'IP Connect' dst.ip.address = * | limit 5 | columns event.time, event.type, src.process.name, dst.ip.address, dst.port.number, agent.uuid
// HUNT: rare external destinations of the Siemens carrier process
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1071.001
// CONF: low | FP: high
// EQUIVALENCE: equivalent-with-schema-assumptions - Same population and grouping: connections by the carrier process to destinations outside the five private and local ranges, grouped by address and port with a distinct-host count. Host names are sampled with any() instead of collected.
// REQUIRES: SentinelOne IP Connect telemetry with the connecting process
// TUNING: Build an allowlist of Siemens destinations from 30 days of clean hosts and subtract it; escalate any destination seen on one host that is not on it.
// LOOKBACK: 7d on the CQL tab; set the console time picker to the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: Only a single sample host is listed per destination.
// VALIDATION LEVEL: static-reviewed
event.type = 'IP Connect' src.process.name in:anycase ('SiemensSoftwareCenter.exe', 'SiemensSoftwareCenter') !(net_ipsubnet(dst.ip.address, '10.0.0.0/8') or net_ipsubnet(dst.ip.address, '172.16.0.0/12') or net_ipsubnet(dst.ip.address, '192.168.0.0/16') or net_ipsubnet(dst.ip.address, '127.0.0.0/8') or net_ipsubnet(dst.ip.address, '169.254.0.0/16'))
| group conns=count(), hosts=estimate_distinct(agent.uuid), sample_host=any(endpoint.name) by dst.ip.address, dst.port.number
| sort +hosts
| limit 100Automated validation: static-passed
5 required fields · View requirements
Required telemetry
- DeviceNetworkEvents
Required fields
Timestamp: Event timeInitiatingProcessFileName: Connecting processRemoteIP: Destination addressRemotePort: Destination portDeviceId: Device identifier
Recommended fields
DeviceName: Device name
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceNetworkEvents | where Timestamp > ago(1d) | project Timestamp, InitiatingProcessFileName, RemoteIP, RemotePort, DeviceId | take 5
// HUNT: rare external destinations of the Siemens carrier process
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1071.001
// CONF: low | FP: high
// EQUIVALENCE: equivalent-with-schema-assumptions - Same population and grouping: connections by the carrier process to destinations outside the five private and local ranges, grouped by address and port with a distinct-device count.
// REQUIRES: Defender for Endpoint network telemetry (DeviceNetworkEvents)
// TUNING: Build an allowlist of Siemens destinations from 30 days of clean devices and subtract it; escalate any destination seen on one device that is not on it.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: Host names are capped at 20 per destination.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed-with-warnings; fixtures=0/0
DeviceNetworkEvents
| where Timestamp >= ago(7d)
| where InitiatingProcessFileName in~ ("SiemensSoftwareCenter.exe", "SiemensSoftwareCenter")
| where not(ipv4_is_in_range(RemoteIP, "10.0.0.0/8") or ipv4_is_in_range(RemoteIP, "172.16.0.0/12") or ipv4_is_in_range(RemoteIP, "192.168.0.0/16") or ipv4_is_in_range(RemoteIP, "127.0.0.0/8") or ipv4_is_in_range(RemoteIP, "169.254.0.0/16"))
| summarize Conns = count(), Hosts = dcount(DeviceId), HostNames = make_set(DeviceName, 20) by RemoteIP, RemotePort
| sort by Hosts asc
| take 100Looks for: Command or script interpreters, rundll32 or regsvr32 whose parent is the Siemens carrier. A hypothesis-level post-exploitation signal: the report does not name child processes. FP: The legitimate product launches its own installers. Only the interpreters listed here are matched, so benign installer children do not fire; a Siemens setup wrapper that calls cmd.exe is the expected exception.
Known limitations and deployment notes
- PowerQuery: Interpreters launched by a child of the carrier rather than the carrier itself are not matched.
- PowerQuery assumes: in:anycase is case-insensitive, which reproduces the CQL case-insensitive intent.
- KQL – Defender XDR: Interpreters launched by a child of the carrier rather than the carrier itself are not matched.
- KQL – Defender XDR assumes: InitiatingProcessFileName holds the creator process name.
// HUNT: shell or script interpreter child of the Siemens carrier // MITRE: T1059, T1574.002 // CONF: low FP: medium COST: low | REQUIRES: process creation with parent and command line // TUNING: exclude CommandLine values of the Siemens installer wrapper after you baseline it; any interpreter on a host with no sanctioned Siemens software stays in scope. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^SiemensSoftwareCenter(\.exe)?$/i | FileName=/^(cmd|powershell|pwsh|wscript|cscript|mshta|rundll32|regsvr32)(\.exe)?$/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData, aid])
4 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.time: Event timeevent.type: Event typesrc.process.name: Creator process nametgt.process.name: Created process name
Recommended fields
endpoint.name: Host nametgt.process.cmdline: Created command line
Optional fields
tgt.process.image.sha256: Hash. Population varies by tenant.
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' src.process.name = * | limit 5 | columns event.time, event.type, src.process.name, tgt.process.name
// HUNT: shell or script interpreter child of the Siemens carrier
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1059, T1574.002
// CONF: low | FP: medium
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: an interpreter or script host created by the carrier process. On a Process Creation event the creator is src.process.* and the created process is tgt.process.*.
// REQUIRES: SentinelOne process-creation telemetry with creator and command line
// TUNING: Exclude command lines of the Siemens installer wrapper after you baseline it; any interpreter on a host with no sanctioned Siemens software stays in scope.
// LOOKBACK: 7d on the CQL tab; set the console time picker to the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: Interpreters launched by a child of the carrier rather than the carrier itself are not matched.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' src.process.name in:anycase ('SiemensSoftwareCenter.exe', 'SiemensSoftwareCenter') tgt.process.name in:anycase ('cmd.exe', 'cmd', 'powershell.exe', 'powershell', 'pwsh.exe', 'pwsh', 'wscript.exe', 'wscript', 'cscript.exe', 'cscript', 'mshta.exe', 'mshta', 'rundll32.exe', 'rundll32', 'regsvr32.exe', 'regsvr32')
| columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.image.path, tgt.process.cmdline, tgt.process.image.sha256, agent.uuid
| limit 200Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeInitiatingProcessFileName: Creator process nameFileName: Created process name
Recommended fields
ProcessCommandLine: Created command line
Optional fields
SHA256: Hash. SHA256 is often unpopulated in DeviceProcessEvents; SHA1 is the safer pivot.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, InitiatingProcessFileName, FileName | take 5
// HUNT: shell or script interpreter child of the Siemens carrier
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1059, T1574.002
// CONF: low | FP: medium
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: an interpreter or script host created by the carrier process. The created process is FileName and its creator is InitiatingProcessFileName.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents)
// TUNING: Exclude command lines of the Siemens installer wrapper after you baseline it; any interpreter on a device with no sanctioned Siemens software stays in scope.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: Interpreters launched by a child of the carrier rather than the carrier itself are not matched.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(7d)
| where InitiatingProcessFileName in~ ("SiemensSoftwareCenter.exe", "SiemensSoftwareCenter")
| where FileName in~ ("cmd.exe", "cmd", "powershell.exe", "powershell", "pwsh.exe", "pwsh", "wscript.exe", "wscript", "cscript.exe", "cscript", "mshta.exe", "mshta", "rundll32.exe", "rundll32", "regsvr32.exe", "regsvr32")
| project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, FolderPath, ProcessCommandLine, SHA1, SHA256
| sort by Timestamp desc
| take 200Detection Rules by Platform
CrowdStrike: Custom IOA
| IOA name | Pattern | Exclusions | Path |
|---|---|---|---|
| Siemens carrier launched by msiexec from user AppData | ParentBaseFileName msiexec, FileName SiemensSoftwareCenter.exe, image under AppData\Local\Programs (Promote Q1) | Sanctioned per-user rollouts | Detect only (legitimate signed binary, never Prevent) |
| Out-of-channel AllMyBasic.msi install | msiexec command line contains AllMyBasic.msi (Promote Q3) | None expected | Detect |
| Execution from SM Software Provisioning Service | Image path contains the folder name (Promote Q4) | None expected | Detect |
| Siemens-named persistence under a user profile | Task or Run value naming Siemens Software Center pointing at AppData (Promote Q6, Q7) | Sanctioned Siemens software group | Detect |
| Network contact with Siemens-published infrastructure | RemoteAddressIP4 or DomainName matches the published IPs or domain (Promote Q8, Q9) | None expected | Detect (single upstream, so not Prevent) |
No IOA in this pack ships at Prevent or Critical. Every indicator traces to one upstream (Siemens ProductCERT) and the central binary is legitimate signed software.
SentinelOne: custom detection rules
| Rule | Source query | Run as | Notes |
|---|---|---|---|
| Siemens carrier launched by msiexec from user AppData | Q1, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| Out-of-channel AllMyBasic.msi install | Q3, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| Execution from SM Software Provisioning Service | Q4, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| Siemens-named persistence under a user profile | Q6, Q7, PowerQuery tab | Hunt only until the gap is closed | Q6 is only an approximation here. No scheduled-task registration event is attested in the SentinelOne field model. This pivots on the schtasks command line that creates a task, which catches command-line registration only. |
| Network contact with Siemens-published infrastructure | Q8, Q9, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
Create the rule with POST /web/api/v2.1/cloud-detection/rules, queryType: "scheduled" and queryLang: "2.0", with the query in data.scheduledParams.query. Use 2.0 operator spellings: a rule written with the 1.0 token ContainsCIS was accepted and never fired on a tenant. The API does not warn, so lint the body before deploying.
Microsoft Defender: custom detection rules
| Rule | Source query | Run as | Notes |
|---|---|---|---|
| Siemens carrier launched by msiexec from user AppData | Q1, KQL – Defender XDR tab | Custom detection rule, alert only, every hour | The query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself |
| Out-of-channel AllMyBasic.msi install | Q3, KQL – Defender XDR tab | Custom detection rule, alert only, every hour | The query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself |
| Execution from SM Software Provisioning Service | Q4, KQL – Defender XDR tab | Custom detection rule, alert only, every hour | The query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself |
| Siemens-named persistence under a user profile | Q6, Q7, KQL – Defender XDR tab | Custom detection rule, alert only, every hour | The query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself |
| Network contact with Siemens-published infrastructure | Q8, Q9, KQL – Defender XDR tab | Custom detection rule, alert only, every hour | The query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself |
Q2, Q5, Q10, Q11 and Q12 stay a hunt in this pack, not a rule. A rule can generate only 150 alerts per run. Continuous (NRT) frequency needs a single table and no comment lines, so delete the generated comment header from the query first.
Machine-Readable IOC Appendix
type,value,action,severity,expiration,description,tags sha256,f4d7c5321bb0d1bda439304a753bcf9b467b98ca53c7e9493b9c2c3451092e4a,detect,high,2027-04-21,AllMyBasic.msi malware bundle (Siemens ProductCERT),campaign:Romulus-ClickFix;cve:CVE-2026-110936 sha256,3fdcc7d7d049a89711fb31fb236940a1c5a09d899143ffd20c3c41fb1f2cf491,detect,high,2027-04-21,archive.dll malicious DLL (Siemens ProductCERT),campaign:Romulus-ClickFix;cve:CVE-2026-110936 domain,wizardexpensive.com,detect,high,2027-04-21,payload hosting and C2 (Siemens ProductCERT),campaign:Romulus-ClickFix;cve:CVE-2026-110936 ipv4,96.62.218.59,detect,high,2027-04-21,payload hosting and C2 (Siemens ProductCERT),campaign:Romulus-ClickFix;cve:CVE-2026-110936 ipv4,2.27.248.127,detect,medium,2027-04-21,inactive AllMyBasic.msi distribution channel (Siemens ProductCERT),campaign:Romulus-ClickFix;cve:CVE-2026-110936
indicatorType,indicatorValue,action,title,description,expirationTime,severity,recommendedActions,rbacGroups,category,mitretechniques,GenerateAlert FileSha256,f4d7c5321bb0d1bda439304a753bcf9b467b98ca53c7e9493b9c2c3451092e4a,Audit,AllMyBasic.msi malware bundle,AllMyBasic.msi malware bundle (Siemens ProductCERT),2027-04-21T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True FileSha256,3fdcc7d7d049a89711fb31fb236940a1c5a09d899143ffd20c3c41fb1f2cf491,Audit,archive.dll malicious DLL,archive.dll malicious DLL (Siemens ProductCERT),2027-04-21T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True DomainName,wizardexpensive.com,Audit,payload hosting and C2,payload hosting and C2 (Siemens ProductCERT),2027-04-21T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True IpAddress,96.62.218.59,Audit,payload hosting and C2,payload hosting and C2 (Siemens ProductCERT),2027-04-21T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True IpAddress,2.27.248.127,Audit,inactive AllMyBasic.msi distribution channel,inactive AllMyBasic.msi distribution channel (Siemens ProductCERT),2027-04-21T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
Column names and allowed values are from Microsoft's documented parameter table. Check each expirationTime before importing: an indicator whose date has passed is already expired. Download the sample CSV from the Import page to confirm the column order before a bulk import. Each file takes at most 500 indicators. Learn describes the import per entity type, so if a mixed file is rejected, split it by indicatorType. An imported indicator does nothing unless the matching Advanced features are on (for example Custom network indicators and Allow or block file).
This pack does not ship a SentinelOne import block: the import format could not be verified against SentinelOne's own documentation. Export a sample from your console and the block can be added with confidence.
# Behavioral signatures (detect on these, not on the signed Siemens file) SiemensSoftwareCenter.exe running from %LOCALAPPDATA%\Programs, parent msiexec.exe Folder: %LOCALAPPDATA%\Programs\SM Software Provisioning Service Files: activate.bak and statinfosta.DB beside SiemensSoftwareCenter.exe Folder: %LOCALAPPDATA%\FTSuite containing ftc.uml Start-up entry or scheduled task named "Siemens Software Center" on a host that never had it Out-of-channel package: AllMyBasic.msi Vulnerable range: all versions below 4.0.9.8 (abused build: 3.5.8.7)
# Analyst fill-ins: NOT published by any snapshotted source. Do not import until replaced. REPLACE_WITH_ADDITIONAL_ATTACKER_DLL_NAME REPLACE_WITH_ADDITIONAL_ATTACKER_DLL_SHA256
# Patch / exposure audit Installed Siemens Software Center version must be 4.0.9.8 or later Search every user profile for SiemensSoftwareCenter.exe under AppData\Local\Programs (PB1) Search for: SM Software Provisioning Service, activate.bak, statinfosta.DB, FTSuite\ftc.uml Search proxy, DNS and firewall logs for all three network indicators, including the inactive IP Confirm Siemens software is only installed from official Siemens sources
Detection Validation Gates
| Gate | Requirement | Evidence |
|---|---|---|
| 1 · Telemetry ready | Process creation with parent, command line and image path (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents), executable writes, auto-start registry and scheduled task registration, outbound connections and DNS flowing from user endpoints; longest available retention | Event counts per source for a sample of user endpoints |
| 2 · Benign baseline | Run Q1, Q2, Q11 and Q12 in hunt mode for 14 days; list sanctioned Siemens Software Center installs and their parents | Per-query exclusion list |
| 3 · Positive tests | In a lab, copy a harmless renamed executable into a folder named SM Software Provisioning Service under a test AppData path and run it (Q4); run msiexec against a harmless MSI named AllMyBasic.msi (Q3); register a test task named Siemens Software Center (Q6) | Q3, Q4, Q6 fire |
| 4 · Promotion | Promote IOA candidates after zero unexplained hits over the baseline window; keep every legitimate-binary IOA at Detect; never promote a Siemens executable hash | Change record |
Hardening: Tiered
- Update Siemens Software Center to 4.0.9.8 or later and verify the version, because automatic update happens only when the application is started. Authority: MITRE M1051 Update Software; Siemens SSA-580366; CISA KEV due date 2026-11-03. Verify: PB1 version listing.
- Block 96.62.218.59, wizardexpensive.com and 2.27.248.127 at DNS, proxy and firewall, and search logs back for all three. Authority: MITRE M1037 Filter Network Traffic; Siemens recommendation. Verify: PB2 and a failed test connection.
- Restrict Siemens software installs to official sources (managed deployment only). Authority: M1051 and Siemens recommendation. best-practice, no formal benchmark.
- Run the ASR prevalence rule in audit mode to see unknown executables and DLLs that would be blocked. Authority: M1038 Execution Prevention; Microsoft ASR rules reference. Verify: PB3.
- Allow Siemens Software Center only from approved install locations with an AppLocker or WDAC rule, so a signed copy running from a user profile is not trusted. Authority: M1038; Microsoft WDAC and AppLocker guidance. Verify: audit-mode events first.
- Limit who can run MSI installs with the Windows Installer policy for non-managed applications. Authority: M1038 and M1026 Privileged Account Management. Verify: PB4.
- Remove or restrict the Run dialog for users who do not need it, as a ClickFix control. Authority: M1038 and M1017 User Training. best-practice, no formal benchmark. Verify: PB4.
- User training on ClickFix: a real verification check never asks to paste a command into Win+R, Run or PowerShell. Authority: M1017 User Training; Siemens guidance.
- Egress control by category and destination, denying newly seen domains by default for user endpoints. Authority: M1037.
- Application inventory with signer and path baselines, so a trusted signer in an untrusted path raises an alert. Authority: M1047 Audit. best-practice, no formal benchmark.
Folder-search hardening such as CWDIllegalInDllSearch addresses current-directory loads and does not stop a DLL placed in the application's own folder, which is this attack. The effective controls are patching, install-source control and path-aware application control.
Deployable Playbooks
PB1 · Inventory versions and warning-sign artefacts
# PB1 - Inventory Siemens Software Center versions and warning-sign artefacts (read-only)
# Prerequisites: local administrator, PowerShell 5.1 or later. Reboot required: no. Rollback: none required, read-only.
$hits = foreach ($u in Get-ChildItem C:\Users -Directory -ErrorAction SilentlyContinue) {
$p = Join-Path $u.FullName 'AppData\Local\Programs'
Get-ChildItem $p -Recurse -Filter SiemensSoftwareCenter.exe -ErrorAction SilentlyContinue |
ForEach-Object { [pscustomobject]@{ User=$u.Name; Path=$_.FullName; Version=$_.VersionInfo.FileVersion; Signer=(Get-AuthenticodeSignature $_.FullName).SignerCertificate.Subject } }
}
$hits | Format-Table -AutoSize
# Warning-sign folders and files named by Siemens
Get-ChildItem C:\Users -Directory | ForEach-Object {
Get-ChildItem (Join-Path $_.FullName 'AppData\Local\Programs\SM Software Provisioning Service') -ErrorAction SilentlyContinue
Get-ChildItem (Join-Path $_.FullName 'AppData\Local\FTSuite\ftc.uml') -ErrorAction SilentlyContinue
}
Get-ChildItem C:\Users -Recurse -Include activate.bak,statinfosta.DB -ErrorAction SilentlyContinue | Select-Object FullName
PB2 · Host firewall block for the published IPs
# PB2 - Block Siemens-published campaign IPs on the host firewall (domain blocking belongs in DNS or proxy) # Prerequisites: local administrator, Windows Defender Firewall enabled. Reboot required: no. # Rollback: Remove-NetFirewallRule -DisplayName 'HuntPack-CVE-2026-110936-Block' New-NetFirewallRule -DisplayName 'HuntPack-CVE-2026-110936-Block' -Direction Outbound -Action Block ` -RemoteAddress 96.62.218.59,2.27.248.127 -Profile Any Get-NetFirewallRule -DisplayName 'HuntPack-CVE-2026-110936-Block' | Get-NetFirewallAddressFilter # Verify: Test-NetConnection 96.62.218.59 -Port 443 (expect failure)
PB3 · ASR prevalence rule in audit mode
# PB3 - ASR prevalence rule in AUDIT mode (no blocking) # Prerequisites: Microsoft Defender Antivirus active, administrator. Reboot required: no. # Rollback: Remove-MpPreference -AttackSurfaceReductionRules_Ids 01443614-cd74-433a-b99e-2ecdc07bfc25 Add-MpPreference -AttackSurfaceReductionRules_Ids 01443614-cd74-433a-b99e-2ecdc07bfc25 -AttackSurfaceReductionRules_Actions AuditMode # Verify (Get-MpPreference).AttackSurfaceReductionRules_Ids (Get-MpPreference).AttackSurfaceReductionRules_Actions # Review audit events: Microsoft-Windows-Windows Defender/Operational, Event ID 1122
PB4 · Windows Installer and Run dialog restriction
# PB4 - Restrict Windows Installer and the Run dialog for standard users (pilot ring first) # Prerequisites: administrator; pilot on a test OU; confirm no business app needs user MSI installs. Reboot required: no (sign-out for NoRun). # Rollback: delete the two values below (or set them to 0), then gpupdate /force. # Step 1: Windows Installer, "Turn off Windows Installer" = For non-managed applications only New-Item -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\Installer' -Force | Out-Null Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\Installer' -Name DisableMSI -Type DWord -Value 1 # Step 2: remove Run from the Start menu for users who do not need it (ClickFix control) New-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer' -Force | Out-Null Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer' -Name NoRun -Type DWord -Value 1 # Verify Get-ItemProperty 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\Installer' -Name DisableMSI Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer' -Name NoRun # Note: NoRun hides the Run dialog, it does not block PowerShell or cmd. Treat it as friction, not a boundary.
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Isolate the PC from the network first. Then stop the SiemensSoftwareCenter.exe process before removing anything, as Siemens directs | SOC | Isolation timestamp, process list |
| Scope | Run Q1 to Q12 over the full retention; sweep for the SM Software Provisioning Service folder, activate.bak, statinfosta.DB and FTSuite\ftc.uml (PB1); search logs for all three network indicators including the inactive IP | Threat hunt | Host list with first-seen times |
| Eradicate | Remove the start-up entry and the scheduled task, then the provisioning folder and attacker DLLs. Preserve copies of the DLLs and the MSI first for analysis | IR | Removal log, preserved samples, hashes |
| Credentials | Reset passwords for the affected user and any account used on the host, as Siemens directs; review sessions and tokens | Identity team | Reset tickets |
| Recover | Reinstall Siemens Software Center only from official Siemens sources at 4.0.9.8 or later; confirm the version with PB1 | IT | Version evidence |
| Prevent recurrence | Apply the Immediate and Near term hardening tiers and ClickFix awareness training | Security engineering | Change record |
Detection Coverage Map
| Technique / behaviour | CQL | IOA | CrowdStrike coverage | SentinelOne | Defender XDR |
|---|---|---|---|---|---|
| Signed carrier started by msiexec from AppData (T1574.002, T1218.007) | Q1, Q2 | Yes | Good | Good, with assumptions | Good, with assumptions |
| Out-of-channel AllMyBasic.msi (T1204.002) | Q3, Q10 | Yes | Partial | Partial: same limit as CrowdStrike | Partial: Q10 telemetry gap |
| Provisioning folder execution (T1574.002) | Q4 | Yes | Good | Good, with assumptions | Good, with assumptions |
| Attacker DLL written beside carrier (T1574.002, T1105) | Q5, Q10 | No | Partial | Partial: Q5 approximate | Partial: Q5 approximate, Q10 telemetry gap |
| Attacker DLL actually loaded by the carrier (image load) | No | GAP | GAP | GAP | |
| Scheduled task persistence (T1053.005) | Q6 | Yes | Good | Partial: Q6 approximate | Good, with assumptions |
| Run-key persistence (T1547.001) | Q7 | Yes | Good | Good, with assumptions | Good, with assumptions |
| Network IOCs, IP and DNS (T1071, T1105) | Q8, Q9 | Yes | Good | Good, with assumptions | Good, with assumptions |
| Rare egress from the carrier (T1071.001) | Q11 | No | Partial | Partial: same limit as CrowdStrike | Partial: same limit as CrowdStrike |
| Interpreters under the carrier (T1059) | Q12 | No | Partial | Partial: same limit as CrowdStrike | Partial: same limit as CrowdStrike |
| ClickFix lure and clipboard command (T1204.004) | No | GAP | GAP | GAP |
Gaps: the ClickFix web page and clipboard paste are outside endpoint telemetry, and the DLL load itself is a native hunt (Section 7, N1 and N7). Validation gates are in Section 11; run the benign baseline before any promotion.
Hunt Summary Ticket
TITLE: Siemens Software Center CVE-2026-110936 (Romulus ClickFix DLL side-loading)
SEVERITY: HIGH (exploited in the wild, CISA KEV 2026-10-20, due 2026-11-03)
SCOPE: Windows endpoints with user-writable AppData where msiexec can run; any host that ever ran AllMyBasic.msi
HYPOTHESIS: A user followed a ClickFix lure, msiexec installed an out-of-channel bundle holding a genuine signed
Siemens Software Center 3.5.8.7 plus attacker DLLs, and the carrier loaded them from its own folder.
QUERIES RUN: Q1 msiexec carrier | Q2 carrier baseline | Q3 AllMyBasic.msi | Q4 provisioning folder | Q5 archive.dll |
Q6 task | Q7 Run key | Q8 IPs | Q9 DNS | Q10 hashes | Q11 rare egress | Q12 interpreters (+8 native hunts)
DATA SOURCES: Process creation, executable writes, auto-start registry, scheduled task registration, outbound
connections and DNS (CrowdStrike: ProcessRollup2, PeFileWritten, AsepValueUpdate,
ScheduledTaskRegistered, NetworkConnectIP4, DnsRequest. SentinelOne and Defender equivalents in section 5)
DO FIRST: Verify installed versions are 4.0.9.8 or later (PB1); run Q1, Q3, Q4, Q8, Q9 over the longest retention.
FINDINGS: <pending analyst execution>
GAPS: ClickFix web page and clipboard paste are outside endpoint telemetry; the DLL image load is a native hunt.
Only archive.dll is named; no other attacker DLL name or hash is published.
ACTIONS: Patch to 4.0.9.8; block the three network indicators; ASR audit; promote Q1, Q3, Q4 to Custom IOA (Detect).
Never hash-match or block the genuine Siemens executable. No prevent: single upstream for all indicators.
OWNER: HuntPack
VERSION: v0.1 (Draft) - 2026-10-21Changelog
References
| Tier | Source | Used for | Accessed |
|---|---|---|---|
| 1 | Siemens ProductCERT: Active Exploitation of CVE-2026-110936 in Siemens Software Center | Exploitation confirmation, IOCs, hashes, warning signs, detection guidance | 2026-10-21 |
| 1 | Siemens SSA-580366 | CWE, CVSS, affected and fixed versions | 2026-10-21 |
| 1 | CISA Known Exploited Vulnerabilities Catalog | KEV date and due date | 2026-10-21 |
| 2 | SecurityOnline | Corroboration of guidance | 2026-10-21 |
| 2 | The Hacker News | KEV and Romulus context | 2026-10-21 |
| 2 | Infosecurity Magazine | Romulus description, warning signs | 2026-10-21 |
| 2 | heise online | AllMyBasic.msi and version 3.5.8.7 | 2026-10-21 |
| 2 | SOC Prime | archive.dll and the chain | 2026-10-21 |
| 2 | MITRE ATT&CK and mitigations | Technique and mitigation mapping | 2026-10-21 |
| 2 | Microsoft: Attack surface reduction rules reference | ASR rule used in PB3 | 2026-10-21 |