
CVE-2026-58138 — Conductor (3.21.21..<3.30.2) RCE no autenticado a través del evaluador GraalVM INLINE (HostAccess.ALL). Lab + PoC, verificado e2e (root).
Resumen: Orkes/OSS Conductor (versiones
3.21.21a< 3.30.2) evalúa JavaScript proporcionado por el usuario en tareasINLINEusando un contexto GraalVM con acceso completo al host (HostAccess.ALL). Debido a que la API comunitaria no tiene autenticación por defecto, cualquier usuario no autenticado puede enviar un workflow malicioso, pivotar desde el objeto JavaScript enlazado ajava.lang.Runtime, y lograr Ejecución Remota de Código (RCE) no autenticada como el usuario del proceso Conductor (a menudoroot).
Nota sobre la versión: Las versiones hasta
~3.29.xusan la configuración simpleallowHostAccess(HostAccess.ALL), que este PoC explota directamente. Las versiones3.30.0y3.30.1introdujeron una lista de bloqueo parcial (bloqueando algo de reflexión), pero la corrección completa (allowHostClassLoading(false)+ endurecimiento del motor) solo se implementó en3.30.2. Este PoC apunta a la configuración sin sandbox.
La vulnerabilidad reside en cómo Conductor configura el contexto polyglot de GraalVM para la evaluación de scripts.
En core/.../events/ScriptEvaluator.java (≤ 3.29.x), el contexto se construye así:
return Context.newBuilder("js")
.allowHostAccess(HostAccess.ALL) // DANGER: Full host interop, no sandbox
.build();
Por qué esto es un game over:
HostAccess.ALL otorga al motor JavaScript permiso para llamar a cualquier método o acceder a cualquier campo de objetos host de Java.INLINE enlaza sus parámetros de entrada a la variable JavaScript $, que es un objeto Java real.$:
$.getClass().getClass() ➔ java.lang.Class ➔ Class.forName("java.lang.Runtime") ➔ Runtime.getRuntime().exec("sh -c <command>").Context.newBuilder("python").allowAllAccess(true)).El ataque no requiere autenticación y sigue tres sencillos pasos:
POST a /api/metadata/workflow con una definición de workflow maliciosa. La tarea INLINE contiene el payload JavaScript reflexivo en su campo expression.POST a /api/workflow/{workflow_name} para ejecutar el workflow.Runtime.exec reflexivo ejecuta el comando del sistema operativo, y el PoC captura hábilmente la stdout y la devuelve como salida del resultado de la tarea, que luego se obtiene a través de la API.Inicie una instancia local de la versión vulnerable de Conductor usando 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
Ejecute el script de exploit en Python proporcionado. Depende únicamente de la biblioteca estándar de Python (no se requieren dependencias externas).
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
Nota: La salida uid=0(root) demuestra una ejecución genuina en el host, no una respuesta falsificada.
Una explotación exitosa otorga al atacante ejecución arbitraria de comandos del sistema operativo en el host orquestador de Conductor.
Debido a que Conductor a menudo se despliega con privilegios elevados para gestionar infraestructura, esto típicamente resulta en:
≥ 3.30.2. En esta versión, los evaluadores JS y Python ya no se ejecutan con acceso al host ni carga de clases habilitada.Monitoree su entorno en busca de los siguientes indicadores de compromiso (IoCs):
INLINE, LAMBDA, DO_WHILE o SWITCH cuyos campos expression contengan referencias a:
getClass, forName, Runtime, exec, ProcessBuilderjava.lang.reflect o acceso genérico a paquetes java.sh, bash, ) o realizan conexiones de red salientes.Para un análisis en profundidad de la cadena de reflexión, las configuraciones del evaluador específicas de la versión y el análisis del parche, consulte ANALYSIS.md.
Descargo de responsabilidad: Este repositorio contiene un laboratorio independiente y reproducible y una Prueba de Concepto (PoC) destinados estrictamente a fines defensivos, educativos y de pruebas de seguridad autorizadas. No use este código contra sistemas que no posea o para los cuales no tenga permiso explícito por escrito para realizar pruebas. Los autores no asumen ninguna responsabilidad por el mal uso.
| Atributo | Detalles |
|---|
| Identificador CVE | CVE-2026-58138 |
| Software Afectado | Conductor 3.21.21 hasta 3.30.1 |
| Versión Corregida | 3.30.2 (Commits: 87a7d96, c691e35) |
| Clase de Vulnerabilidad | CWE-94: Inyección de Código (evasión del sandbox polyglot de GraalVM) |
| Puntaje CVSS v3.1 | 9.8 (Crítico) 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) |
| Verificación | Confirmada como root contra conductoross/conductor:3.22.3 |
cmd.exe