Threat Overview
Fortinet and independent reporting confirm active exploitation of CVE-2026-58138, a critical unauthenticated RCE in Orkes Conductor. Attackers can submit workflow definitions containing malicious JavaScript or Python expressions to vulnerable workflow API endpoints. Unsandboxed GraalVM evaluation with host access can lead to operating-system command execution. Fortinet observed 1,290 attempts in 24 hours and nearly 7,000 attempts during September 2-9. Public exploit code is available.
References
- SecurityWeek, September 18, 2026: https://www.securityweek.com/critical-orkes-conductor-vulnerability-exploited-in-attacks/
- Empirical Security, September 2026: https://research.empiricalsecurity.com/research/september-2026-cve-of-the-month
Impacted Systems
Orkes/conductor-oss Conductor 3.21.21 through versions before 3.30.2. Self-managed workflow orchestration servers are the primary concern. Internet-reachable workflow APIs increase risk. Fixed in 3.30.2.
Why this matters
Active exploitation plus pre-authentication OS command execution on an orchestration platform creates a direct route to application secrets, internal APIs, and downstream systems.
Exploitation Status
Confirmed active exploitation. Fortinet observed high-volume attempts. No specific actor attribution is established.
What this hunt looks for
Malicious workflow/API requests followed by Java child-process execution, temporary-file creation, persistence, and unusual Java network connections.
Required logs
Web/WAF or reverse-proxy logs in CommonSecurityLog, Defender XDR DeviceProcessEvents, DeviceNetworkEvents and DeviceFileEvents, and Linux Syslog where available.
First Pass – Conductor API Workflow Activity
CommonSecurityLog
| where TimeGenerated >= ago(30d)
| where RequestURL has_any ("/api/workflow","/api/metadata/workflow","/workflow")
| project TimeGenerated,SourceIP,DestinationIP,RequestMethod,RequestURL,DeviceAction,Message
| order by TimeGenerated descInline Script Indicators
CommonSecurityLog
| where TimeGenerated >= ago(30d)
| where RequestURL has_any ("/api/workflow","/api/metadata/workflow")
| where Message has_any ("INLINE","LAMBDA","DO_WHILE","SWITCH","javascript","python","Runtime.getRuntime","ProcessBuilder")
| project TimeGenerated,SourceIP,DestinationIP,RequestMethod,RequestURL,DeviceAction,Message
| order by TimeGenerated descJava Spawning Shells
DeviceProcessEvents
| where Timestamp >= ago(30d)
| where InitiatingProcessFileName in~ ("java","java.exe")
| where FileName in~ ("sh","bash","dash","cmd.exe","powershell.exe","pwsh.exe","curl","wget","python","python3")
| project Timestamp,DeviceName,AccountName,InitiatingProcessFileName,InitiatingProcessCommandLine,FileName,ProcessCommandLine,SHA256
| order by Timestamp descRare Java Network Destinations
let Baseline=DeviceNetworkEvents
| where Timestamp between (ago(30d)..ago(2d))
| where InitiatingProcessFileName in~ ("java","java.exe")
| summarize by DeviceId,RemoteIP,RemotePort;
DeviceNetworkEvents
| where Timestamp >= ago(2d)
| where InitiatingProcessFileName in~ ("java","java.exe")
| join kind=leftanti Baseline on DeviceId,RemoteIP,RemotePort
| project Timestamp,DeviceName,InitiatingProcessCommandLine,RemoteUrl,RemoteIP,RemotePort
| order by Timestamp descJava File Creation in Temporary Paths
DeviceFileEvents
| where Timestamp >= ago(30d)
| where InitiatingProcessFileName in~ ("java","java.exe")
| where ActionType in~ ("FileCreated","FileModified")
| where FolderPath has_any ("/tmp/","/var/tmp/","/dev/shm/","\\Temp\\")
| project Timestamp,DeviceName,ActionType,FileName,FolderPath,SHA256,InitiatingProcessCommandLine
| order by Timestamp descPersistence Following Java Execution
DeviceProcessEvents
| where Timestamp >= ago(30d)
| where FileName in~ ("crontab","systemctl","schtasks.exe","reg.exe")
| where InitiatingProcessFileName in~ ("java","java.exe","sh","bash","cmd.exe","powershell.exe")
| project Timestamp,DeviceName,AccountName,FileName,ProcessCommandLine,InitiatingProcessFileName,InitiatingProcessCommandLine
| order by Timestamp descSyslog Post-Exploitation Fallback
Syslog
| where TimeGenerated >= ago(30d)
| where SyslogMessage has_any ("java","conductor")
| where SyslogMessage has_any ("bash","sh -c","curl ","wget ","python ","sudo","cron","systemctl")
| project TimeGenerated,Computer,HostName,ProcessName,SeverityLevel,SyslogMessage
| order by TimeGenerated descDetection Notes
Web request fields vary by parser. Java child-process behavior is high-value but not unique to Conductor. Lack of WAF/API logging can hide the initial exploit. Public reporting does not provide a stable malicious IP list suitable for primary detection.