
CVE-2026-58138 — Conductor (3.21.21..<3.30.2) unauthenticated RCE via INLINE GraalVM evaluator (HostAccess.ALL). Lab + PoC, verified e2e (root).
TL;DR: Orkes/OSS Conductor (versions
3.21.21to< 3.30.2) evaluates user-supplied JavaScript inINLINEtasks using a GraalVM context with full host access (HostAccess.ALL). Because the community API has no authentication by default, any unauthenticated user can submit a malicious workflow, pivot from the bound JavaScript object tojava.lang.Runtime, and achieve as the Conductor process user (often ).
root| Attribute | Details |
|---|---|
| CVE Identifier | CVE-2026-58138 |
| Affected Software | Conductor 3.21.21 through 3.30.1 |
| Fixed Version | 3.30.2 (Commits: 87a7d96, c691e35) |
| Vulnerability Class | CWE-94: Code Injection (GraalVM polyglot sandbox bypass) |
| CVSS v3.1 Score | 9.8 (Critical) AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Authentication | None (Community API is unauthenticated by default) |
| Verification | Confirmed as root against conductoross/conductor:3.22.3 |
Version Note: Versions up to
~3.29.xuse the plainallowHostAccess(HostAccess.ALL)configuration, which this PoC directly exploits. Versions3.30.0and3.30.1introduced a partial blocklist (blocking some reflection), but the complete fix (allowHostClassLoading(false)+ engine hardening) was only implemented in3.30.2. This PoC targets the unsandboxed configuration.
The vulnerability exists in how Conductor configures the GraalVM polyglot context for script evaluation.
In core/.../events/ScriptEvaluator.java (≤ 3.29.x), the context is built like this:
return Context.newBuilder("js")
.allowHostAccess(HostAccess.ALL) // DANGER: Full host interop, no sandbox
.build();
Why this is a game over:
HostAccess.ALL grants the JavaScript engine permission to call any method or access any field on Java host objects.INLINE task binds its input parameters to the JavaScript variable $, which is a real Java object.$:
$.getClass().getClass() ➔ java.lang.Class ➔ Class.forName("java.lang.Runtime") ➔ Runtime.getRuntime().exec("sh -c <command>").Context.newBuilder("python").allowAllAccess(true)).The attack requires zero authentication and follows three simple steps:
POST request to /api/metadata/workflow with a malicious workflow definition. The INLINE task contains the reflective JavaScript payload in its expression field.POST request to /api/workflow/{workflow_name} to trigger the workflow.Runtime.exec runs the OS command, and the PoC cleverly captures the stdout and returns it as the task's result output, which is then fetched via the API.Start a local instance of the vulnerable Conductor version using Docker.
# Clone the repository and start the lab environment
docker compose -f docker/docker-lab.yml up -d
# Wait ~60 seconds for the all-in-one server to fully boot
Run the provided Python exploit script. It relies only on the Python standard library (no external dependencies required).
python3 exploit.py http://127.0.0.1:8080 -c "id; hostname; whoami"
[*] Target: http://127.0.0.1:8080
[*] Command: 'id; hostname; whoami'
[*] Registering workflow with a malicious INLINE (javascript) task ... (no auth)
[*] Starting workflow execution ... (no auth)
[*] Started workflow id=pwn_1705432100; reading INLINE task output ...
[+] UNAUTHENTICATED RCE CONFIRMED - command output from the Conductor host:
uid=0(root) gid=0(root) groups=0(root)
vbox
Linux 6.18.12+deb13-amd64
Note: The uid=0(root) output proves genuine execution on the host, not a mocked response.
Successful exploitation grants the attacker arbitrary OS command execution on the Conductor orchestrator host.
Because Conductor is often deployed with elevated privileges to manage infrastructure, this typically results in:
≥ 3.30.2. In this version, JS and Python evaluators no longer run with host access or class loading enabled.Monitor your environment for the following indicators of compromise (IoCs):
INLINE, LAMBDA, DO_WHILE, or SWITCH tasks containing expression strings that reference:
getClass, forName, Runtime, exec, ProcessBuilderjava.lang.reflect or generic java. package accesssh, bash, cmd.exe) or making outbound network connections.For a deep dive into the reflection chain, version-specific evaluator configurations, and patch analysis, refer to ANALYSIS.md.
Disclaimer: This repository contains an independent, reproducible lab and Proof of Concept (PoC) intended strictly for defensive, educational, and authorized security testing purposes. Do not use this code against systems you do not own or have explicit written permission to test. The authors assume no liability for misuse.