Back to Intelligence

CVE-2026-110936: Siemens Software Center DLL Hijacking — Detection and Remediation Guide for ICS Environments

SA
Security Arsenal Team
October 23, 2026
12 min read

Siemens has published a security advisory — cataloged by CISA as ICSA-26-295-03 — disclosing CVE-2026-110936, an uncontrolled search path vulnerability in Siemens Software Center versions prior to 4.0.9.8. The application loads dynamic-link libraries (DLLs) from directories an authenticated local attacker can write to. By planting a specially crafted DLL in one of those searched directories, an attacker can achieve arbitrary code execution with the privileges of the affected application. The flaw carries a CVSS v3 score of 6.7 (Medium) — but do not let the "medium" label breed complacency. Siemens Software Center is the deployment and update mechanism used across Siemens engineering workstations and HMI/SCADA environments, which means this bug sits on exactly the systems that OT adversaries prize most: engineering workstations with privileged access to the process control network.

If you run Siemens software anywhere in your environment — TIA Portal, WinCC, PCS 7, or any product managed through Siemens Software Center — treat this as a priority patch item and a hunt trigger.

Why This Matters More Than the CVSS Score Suggests

A 6.7 local privilege/code execution bug rarely makes headlines. Context changes the math here:

  • DLL hijacking is a proven initial-access and persistence technique (MITRE ATT&CK T1574.001/T1574.002). Ransomware operators and APT groups routinely chain a low-privilege foothold with DLL search-order abuse to execute code under a more trusted, often whitelisted, signed binary.
  • Engineering workstations are high-value targets. In OT intrusions we have responded to, the engineering workstation was the pivot point into the control environment. Code execution under a Siemens management application means code execution on the box that programs your PLCs.
  • Signed-binary masquerading defeats naive allowlisting. Malicious code loaded as a DLL inside a legitimately signed Siemens process inherits that process's trust context in many EDR and application-control configurations.

CVSS scores severity of the bug, not the blast radius of the asset it lives on.

Technical Analysis

Affected Product

AttributeDetail
VendorSiemens
ProductSiemens Software Center
Affected VersionsAll versions < 4.0.9.8
CVECVE-2026-110936
CVSS v36.7 (Medium)
WeaknessCWE-427 — Uncontrolled Search Path Element
AdvisoryCISA ICSA-26-295-03 / Siemens SSA (see vendor advisory link in CSAF)

How the Vulnerability Works

The application resolves one or more DLL dependencies using a search path that includes directories the vendor does not fully control — typically the application's working directory, user-writable folders, or directories inherited from the system PATH environment variable. The attack chain looks like this from a defender's seat:

  1. Foothold: The attacker (or malware) already has an authenticated local session — even a low-privilege one. This could be a phished operator, a compromised service account, or malware dropped via another vector.
  2. Planting: The attacker writes a malicious DLL with the name of a legitimately loaded module into a directory that the vulnerable application searches before the legitimate system directory. User-writable locations such as %TEMP%, %APPDATA%, %USERPROFILE%\Downloads, or a weakly ACL'd application directory are the classic planting grounds.
  3. Execution: The next time Siemens Software Center (or a component it launches) starts, it loads the attacker's DLL. The malicious code executes inside the signed, trusted Siemens process — inheriting its privileges, its network access, and its reputation with security controls.
  4. Post-exploitation: From there, expect credential access, persistence (the planted DLL itself is persistence), and lateral movement toward the control network.

Exploitation requires local authenticated access — there is no remote trigger — which is why the CVSS vector keeps it at 6.7. But in environments where engineering workstations are shared, have weak local admin hygiene, or have already been breached at user level, the barrier is low.

Exploitation Status

At the time of the advisory, this is a vendor-disclosed vulnerability with a fix available. Siemens's advisory references a current known active security issue in its accompanying blog guidance, which defenders should read as a signal to treat detection as urgent, not theoretical. Check the Siemens ProductCERT advisory and the CISA ICS advisory page for the latest exploitation status, and monitor whether CVE-2026-110936 is added to the CISA Known Exploited Vulnerabilities (KEV) catalog — ICS advisories with active-issues language frequently land there.

Detection & Response

The detections below target the two observable stages of this attack: (1) DLL planting in user-writable/searchable directories, and (2) the Siemens process exhibiting anomalous behavior consistent with a hijacked load (unexpected child processes, loads from non-standard paths). Tune process names to your actual deployment — confirm the exact Siemens Software Center binary names and install paths in your environment before rolling out.

Sigma Rules

YAML
---
title: DLL Planted in User-Writable Directory for Search Path Hijacking
id: 3f8a1c42-7b2d-4e19-a6d5-9c0e2f4b7a18
status: experimental
description: Detects creation of DLL files in user-writable directories commonly abused for DLL search order hijacking against applications with uncontrolled search paths, such as Siemens Software Center (CVE-2026-110936).
references:
  - https://www.cisa.gov/news-events/ics-advisories/icsa-26-295-03
  - https://attack.mitre.org/techniques/T1574/001/
author: Security Arsenal
date: 2026/04/06
tags:
  - attack.persistence
  - attack.privilege_escalation
  - attack.t1574.001
logsource:
  category: file_event
  product: windows
detection:
  selection_paths:
    TargetFilename|contains:
      - '\AppData\Local\Temp\'
      - '\AppData\Roaming\'
      - '\Downloads\'
      - '\Users\Public\'
      - '\ProgramData\'
  selection_ext:
    TargetFilename|endswith: '.dll'
  filter_legit_installers:
    Image|endswith:
      - '\msiexec.exe'
      - '\setup.exe'
  condition: selection_paths and selection_ext and not filter_legit_installers
falsepositives:
  - Legitimate application installers and updaters writing DLLs to ProgramData
  - Developer build tooling
level: medium
---
title: Siemens Software Center Process Spawning Suspicious Child Process
id: 8c2e5d91-4f6a-4b38-9e1c-2d7a9f3b6e05
status: experimental
description: Detects Siemens Software Center processes spawning command shells, script interpreters, or LOLBins, consistent with arbitrary code execution following DLL hijacking (CVE-2026-110936).
references:
  - https://www.cisa.gov/news-events/ics-advisories/icsa-26-295-03
  - https://attack.mitre.org/techniques/T1574/002/
author: Security Arsenal
date: 2026/04/06
tags:
  - attack.execution
  - attack.privilege_escalation
  - attack.t1574.002
  - attack.t1059
logsource:
  category: process_creation
  product: windows
detection:
  selection_parent:
    ParentImage|contains:
      - '\Siemens\'
    ParentImage|endswith:
      - '.exe'
  selection_parent_swc:
    ParentImage|contains:
      - 'SoftwareCenter'
      - 'Software Center'
  selection_child:
    Image|endswith:
      - '\cmd.exe'
      - '\powershell.exe'
      - '\pwsh.exe'
      - '\wscript.exe'
      - '\cscript.exe'
      - '\mshta.exe'
      - '\rundll32.exe'
      - '\regsvr32.exe'
      - '\wmic.exe'
      - '\certutil.exe'
      - '\bitsadmin.exe'
  condition: (selection_parent or selection_parent_swc) and selection_child
falsepositives:
  - Rare: Siemens update routines invoking system utilities — validate against change windows
level: high
---
title: Unsigned or Non-Standard Path DLL Loaded by Siemens Process
id: 5d1b9f73-2a8c-4e67-b3d4-6f0c8a2e9b41
status: experimental
description: Detects DLL image loads by Siemens Software Center binaries from user-writable or non-standard directories, indicative of DLL search order hijacking (CVE-2026-110936).
references:
  - https://www.cisa.gov/news-events/ics-advisories/icsa-26-295-03
  - https://attack.mitre.org/techniques/T1574/001/
author: Security Arsenal
date: 2026/04/06
tags:
  - attack.defense_evasion
  - attack.persistence
  - attack.t1574.001
logsource:
  category: image_load
  product: windows
detection:
  selection_image:
    Image|contains:
      - '\Siemens\'
      - 'SoftwareCenter'
  selection_dllpath:
    ImageLoaded|contains:
      - '\AppData\'
      - '\Users\Public\'
      - '\Temp\'
      - '\Downloads\'
      - '\ProgramData\'
  filter_known:
    ImageLoaded|contains:
      - '\AppData\Local\Microsoft\'
  condition: selection_image and selection_dllpath and not filter_known
falsepositives:
  - Legitimate Siemens plugins installed to ProgramData — baseline and whitelist per host
level: high

Tuning note: Rules two and three require Sysmon (or equivalent EDR telemetry via a Sigma pipeline) for process_creation with parent image and image_load events. If you are not collecting Event ID 7 (image load) today, enable it selectively for Siemens install paths — full image-load logging is noisy, targeted collection is not.

KQL — Microsoft Sentinel / Defender

Hunt for Siemens Software Center binaries spawning suspicious children (stage 2, code execution) and for DLL plant artifacts (stage 1). The second query assumes Sysmon file-creation telemetry forwarded to Sentinel via the Event table — adjust to your ingestion path.

KQL — Microsoft Sentinel / Defender
// Hunt 1: Siemens Software Center processes spawning shells/LOLBins (post-hijack execution)
let SiemensProc = dynamic(["SoftwareCenter", "\\Siemens\\"]);
let SuspiciousChildren = dynamic(["cmd.exe","powershell.exe","pwsh.exe","wscript.exe","cscript.exe","mshta.exe","rundll32.exe","regsvr32.exe","wmic.exe","certutil.exe","bitsadmin.exe"]);
DeviceProcessEvents
| where TimeGenerated > ago(14d)
| where InitiatingProcessFolderPath has_any (SiemensProc)
| where FileName in~ (SuspiciousChildren)
| project TimeGenerated, DeviceName, InitiatingProcessFolderPath, InitiatingProcessCommandLine,
          FileName, ProcessCommandLine, AccountName, SHA256
| order by TimeGenerated desc;

// Hunt 2: DLLs created in user-writable directories on hosts with Siemens installed
let WritablePaths = dynamic(["\\AppData\\Local\\Temp\\","\\AppData\\Roaming\\","\\Downloads\\","\\Users\\Public\\","\\ProgramData\\"]);
Event
| where TimeGenerated > ago(14d)
| where EventLog == "Microsoft-Windows-Sysmon/Operational"
| where EventID == 11
| extend EvData = parse_xml(EventData)
| extend TargetFile = tostring(EvData.EventData.Data.[7].["#text"])
| extend Creator = tostring(EvData.EventData.Data.[4].["#text"])
| where TargetFile endswith ".dll"
| where TargetFile has_any (WritablePaths)
| where Creator !has "msiexec"
| project TimeGenerated, Computer, Creator, TargetFile
| order by TimeGenerated desc;

// Hunt 3: Baseline — enumerate all Siemens Software Center installs and versions via process launch paths
DeviceProcessEvents
| where TimeGenerated > ago(30d)
| where FolderPath has "SoftwareCenter" or FolderPath has "\\Siemens\\"
| summarize FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated), LaunchCount=count()
  by DeviceName, FolderPath, FileName, ProcessVersionInfoProductVersion
| order by DeviceName asc;

Velociraptor VQL

Use this artifact to sweep engineering workstations for planted DLLs in writable directories and to enumerate running Siemens processes with their loaded context. Deploy as a hunt scoped to your OT/engineering workstation collection.

VQL — Velociraptor
-- Hunt: DLLs planted in user-writable directories (CVE-2026-110936 staging)
-- plus running Siemens processes for triage

LET planted_dlls = SELECT
    FullPath,
    Size,
    Mtime AS Modified,
    Btime AS Created
FROM glob(globs=[
    'C:/Users/*/AppData/Local/Temp/**/*.dll',
    'C:/Users/*/AppData/Roaming/**/*.dll',
    'C:/Users/*/Downloads/**/*.dll',
    'C:/Users/Public/**/*.dll',
    'C:/ProgramData/**/*.dll'
])
WHERE Modified > now() - 60*60*24*30  -- last 30 days

SELECT * FROM planted_dlls
ORDER BY Modified DESC;

-- Companion: enumerate running Siemens Software Center processes
SELECT Pid, Name, Exe, CommandLine, Username, CreateTime
FROM pslist()
WHERE Exe =~ 'Siemens' OR Exe =~ 'SoftwareCenter';

For any hit on a planted DLL, carve the file immediately (Velociraptor's upload() function), hash it, and check it against your EDR and VirusTotal before remediation.

Verification & Hardening Script

Run this on engineering workstations to (1) identify the installed Siemens Software Center version, (2) flag vulnerable installs, and (3) audit the install directory and PATH for world-writable directories that enable search-path abuse.

PowerShell
# CVE-2026-110936 - Siemens Software Center verification and hardening audit
# Run elevated on each engineering workstation / HMI

$fixedVersion = [version]"4.0.9.8"
$report = [System.Collections.Generic.List[object]]::new()

# --- 1. Locate installed version via registry uninstall keys ---
$uninstallPaths = @(
    'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*',
    'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
)
$swc = Get-ItemProperty $uninstallPaths -ErrorAction SilentlyContinue |
       Where-Object { $_.DisplayName -match 'Siemens Software Center' }

if ($swc) {
    foreach ($app in $swc) {
        $ver = $null
        [void][version]::TryParse($app.DisplayVersion, [ref]$ver)
        $status = if ($ver -and $ver -lt $fixedVersion) { 'VULNERABLE - update to 4.0.9.8+' } else { 'Patched/Unknown' }
        $report.Add([pscustomobject]@{
            Check   = 'Installed Version'
            Detail  = "$($app.DisplayName) $($app.DisplayVersion)"
            Status  = $status
        })
    }
} else {
    $report.Add([pscustomobject]@{ Check='Installed Version'; Detail='Siemens Software Center not found via registry'; Status='Verify manually if Siemens products present' })
}

# --- 2. Audit install directory ACLs for non-admin write access ---
$installGuess = @('C:\Program Files\Siemens', 'C:\Program Files (x86)\Siemens')
foreach ($dir in $installGuess) {
    if (Test-Path $dir) {
        $acl = Get-Acl $dir
        $weak = $acl.Access | Where-Object {
            $_.FileSystemRights -match 'Write|Modify|FullControl' -and
            $_.IdentityReference -match 'Users|Everyone|Authenticated Users' -and
            $_.AccessControlType -eq 'Allow'
        }
        if ($weak) {
            $report.Add([pscustomobject]@{ Check='Directory ACL'; Detail="$dir writable by: $($weak.IdentityReference -join ', ')"; Status='RISK - restrict ACLs' })
        } else {
            $report.Add([pscustomobject]@{ Check='Directory ACL'; Detail="$dir"; Status='OK' })
        }
    }
}

# --- 3. Audit system PATH for user-writable directories (search path abuse) ---
$pathDirs = [Environment]::GetEnvironmentVariable('Path','Machine') -split ';'
foreach ($p in $pathDirs) {
    if ($p -and (Test-Path $p -ErrorAction SilentlyContinue)) {
        $a = Get-Acl $p -ErrorAction SilentlyContinue
        $w = $a.Access | Where-Object {
            $_.FileSystemRights -match 'Write|Modify|FullControl' -and
            $_.IdentityReference -match 'Users|Everyone|Authenticated Users' -and
            $_.AccessControlType -eq 'Allow'
        }
        if ($w) {
            $report.Add([pscustomobject]@{ Check='PATH Directory'; Detail="$p writable by standard users"; Status='RISK - enables DLL search path abuse' })
        }
    }
}

# --- 4. Sweep for recently created DLLs in writable staging dirs ---
$stageDirs = @("$env:TEMP","$env:APPDATA","$env:USERPROFILE\Downloads",'C:\Users\Public')
foreach ($sd in $stageDirs) {
    Get-ChildItem $sd -Recurse -Filter *.dll -ErrorAction SilentlyContinue |
        Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-14) } |
        ForEach-Object {
            $report.Add([pscustomobject]@{ Check='Staged DLL'; Detail="$($_.FullName) (modified $($_.LastWriteTime))"; Status='INVESTIGATE' })
        }
}

$report | Format-Table -AutoSize
$report | Export-Csv -Path ".\CVE-2026-110936-Audit-$env:COMPUTERNAME.csv" -NoTypeInformation
Write-Host "`nAudit complete. Any 'VULNERABLE', 'RISK', or 'INVESTIGATE' rows require action." -ForegroundColor Yellow

Remediation

  1. Patch immediately. Update Siemens Software Center to version 4.0.9.8 or later on every engineering workstation, HMI, and server where it is installed. Siemens's advisory notes the update is the complete fix. Obtain the update only through Siemens's official distribution channels — ironic as it sounds, a DLL-hijacked software updater is the last thing you want fetching its own fix from an unverified source.
  2. Consult the official advisories:
    • CISA ICS Advisory: ICSA-26-295-03
    • Siemens ProductCERT advisory (SSA) linked from the CSAF document referenced in the CISA advisory — read the Siemens blog guidance on the current known active security issue and its detection recommendations.
  3. Restrict write access to application directories. Ensure C:\Program Files\Siemens and any Siemens working directories are writable only by Administrators/SYSTEM. Remove Write/Modify rights for BUILTIN\Users, Everyone, and Authenticated Users.
  4. Sanitize the PATH. Remove user-writable directories from the system and user PATH environment variables on engineering workstations. Every writable PATH entry is a DLL planting ground for any application with an uncontrolled search path — not just this one.
  5. Apply the principle of least privilege locally. Exploitation requires an authenticated local attacker. Reduce local admin counts on OT workstations, enforce unique per-machine local admin passwords (LAPS), and restrict interactive logon to named engineering accounts.
  6. Segment and monitor. Engineering workstations should sit in a dedicated OT DMZ segment with egress filtering and no direct internet access. Log and alert on their process execution telemetry — these are the machines that touch your PLCs.
  7. Deploy the detections above and run the audit script fleet-wide. Any INVESTIGATE findings — DLLs staged in user-writable directories — warrant forensic triage before the patch closes the window.
  8. Track KEV status. If CVE-2026-110936 is added to CISA's Known Exploited Vulnerabilities catalog, federal civilian agencies face a Binding Operational Directive deadline — and you should treat that deadline as your own regardless of sector.

The Bigger Lesson

Uncontrolled search path flaws are a 20-year-old bug class, and they keep shipping in new industrial software. CVE-2026-110936 is a reminder that patch management and ACL hygiene on engineering workstations are OT security fundamentals — not IT afterthoughts. The adversary who lands on your HMI at user level needs exactly one flaw like this to own the box that programs your plant. Close the path, patch the software, and hunt for what may already be planted.

Related Resources

Security Arsenal Managed SOC Services AlertMonitor Platform Book a SOC Assessment soc-mdr Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.