
CVE-2026-58138 — Conductor (3.21.21..<3.30.2) RCE no autenticado a través del evaluador INLINE de GraalVM (HostAccess.ALL). Laboratorio + PoC, verificado e2e (root).
Conductor (OSS / Orkes)
3.21.21… antes de3.30.2evalúa JavaScript proporcionado por el usuario en tareasINLINE(yLAMBDA/DO_WHILE/SWITCH) con un contexto de GraalVM construido con acceso completo al host (HostAccess.ALL). El script refleja hastajava.lang.Runtimey ejecuta comandos del sistema operativo. La API comunitaria no tiene autenticación por defecto, por lo que enviar un flujo de trabajo con dicha tarea es ejecución remota de código no autenticada.
Nota sobre versiones (léase). La configuración del evaluador varía dentro del rango afectado: las versiones hasta ~
3.29.x(este laboratorio usa3.22.3) construyen el contexto conallowHostAccess(HostAccess.ALL)— la configuración sin sandbox que describe el CVE, y la que este PoC explota directamente. La línea3.30.0/3.30.1agregó una lista negra parcialdenyAccess(...)(reflexión bloqueada); la corrección completa (allowHostClassLoading(false)+ endurecimiento del motor) solo llega en3.30.2. Este PoC apunta a la configuraciónHostAccess.ALLsimple; no afirma evitar la lista negra de3.30.1.
core/.../events/ScriptEvaluator.java (≤ 3.29.x / 3.22.3):
return Context.newBuilder("js")
.allowHostAccess(HostAccess.ALL) // interop total con el host -> sin sandbox
.build();
HostAccess.ALL permite que el script llame a cualquier método/campo en objetos Java del host. La
tarea INLINE vincula su entrada como $, un objeto Java real, por lo que el script puede pivotar:
$.getClass().getClass() → java.lang.Class → Class.forName("java.lang.Runtime")
→ Runtime.getRuntime().exec(...). El evaluador de Python es equivalente
(Context.newBuilder("python").allowAllAccess(true)).
INLINE lleve la expression maliciosa
(POST /api/metadata/workflow, sin autenticación).POST /api/workflow/{name}, sin autenticación).Runtime.exec reflectivo ejecuta el comando
y el PoC devuelve su stdout como resultado de la tarea.docker compose -f lab/docker-compose.yml up -d # conductoross/conductor:3.22.3 (en rango)
# esperar ~60s a que arranque el servidor todo-en-uno
python3 exploit.py http://127.0.0.1:8080 -c "id; hostname"
Observado:
[*] registrando flujo de trabajo con una tarea INLINE (javascript) maliciosa ... (sin auth)
[*] flujo de trabajo iniciado id=...; leyendo salida de tarea INLINE ...
[+] RCE NO AUTENTICADA CONFIRMADA - salida del comando desde el host Conductor:
uid=0(root) gid=0(root) groups=0(root)
vbox
Linux 6.18.12+kali-amd64
uid=0(root) es el usuario del proceso Conductor; la salida es el estado vivo de id/uname —
ejecución genuina, no eco. exploit.py solo usa la biblioteca estándar de Python.
Cualquiera que pueda alcanzar la API de Conductor ejecuta comandos arbitrarios del SO (aquí como root) en el host orquestador — compromiso total del motor de flujos de trabajo, sus persistencia/colas, y cada sistema al que los flujos y sus credenciales almacenadas acceden.
Identificar definiciones de flujos cuyas tareas INLINE/LAMBDA/DO_WHILE/SWITCH contengan
cadenas expression que referencien getClass, forName, Runtime, exec,
ProcessBuilder, o reflexión java., y procesos Conductor que generen shells.
Consulte ANALYSIS.md para la cadena de reflexión, la configuración del evaluador en todas las
versiones y el parche.
| CVE | CVE-2026-58138 |
| Advertencia | vulncheck — Orkes Conductor RCE no autenticada a través de evaluadores de script GraalVM |
| Afectado | Conductor 3.21.21 … antes de 3.30.2 |
| Corregido | 3.30.2 (commits 87a7d96, c691e35) |
| Clase | CWE-94 (Inyección de código) — El sandbox políglota de GraalVM no se aplicó |
| CVSS | 9.8 — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Autenticación | Ninguna (la API comunitaria no está autenticada por defecto) |
| Estado | CONFIRMADO — reproducido como root contra conductoross/conductor:3.22.3 |