BiiTts/CVE-2026-58138-Conductor-Unauth-RCE
GitHub: BiiTts/CVE-2026-58138-Conductor-Unauth-RCE
该项目复现了 Conductor 工作流引擎因 GraalVM 脚本评估器配置不当导致的未授权远程代码执行漏洞(CVE-2026-58138),并提供完整的实验靶场与 PoC 利用脚本。
Stars: 0 | Forks: 0
# CVE-2026-58138 — 通过 INLINE GraalVM Evaluator 实现的 Conductor 未授权 RCE
| | |
|---|---|
| **CVE** | CVE-2026-58138 |
| **公告** | [vulncheck — 通过 GraalVM 脚本评估器实现的 Orkes Conductor 未授权 RCE](https://www.vulncheck.com/advisories/orkes-conductor-unauthenticated-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` |
| **认证** | **无** (community API 默认未授权) |
| **状态** | **已确认** — 以 **root** 身份对 `conductoross/conductor:3.22.3` 复现成功 |
## 根本原因
`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 host 对象上的任何方法/字段。`INLINE` 任务将其输入绑定为 `$`(一个真实的 Java 对象),因此脚本可以进行提权操作:
`$.getClass().getClass()` → `java.lang.Class` → `Class.forName("java.lang.Runtime")`
→ `Runtime.getRuntime().exec(...)`。Python 评估器也是同理
(`Context.newBuilder("python").allowAllAccess(true)`)。
## 漏洞利用
1. 注册一个包含恶意 `expression` 的 `INLINE` 任务的工作流
(`POST /api/metadata/workflow`,无需认证)。
2. 启动工作流(`POST /api/workflow/{name}`,无需认证)。
3. INLINE 任务执行该 JS 脚本;反射调用 `Runtime.exec` 运行命令,
并且 PoC 将其 **stdout** 作为任务结果返回。
## 复现
```
docker compose -f lab/docker-compose.yml up -d # conductoross/conductor:3.22.3 (in range)
# 等待约 60s 以便 all-in-one server 启动
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 标准库。
## 影响
任何能够访问 Conductor API 的人都可以在 orchestrator 主机上执行任意 OS 命令(此处为
**root** 身份)— 从而完全控制工作流引擎、其
持久化层/队列,以及与其工作流和存储凭据相关的所有系统。
## 修复建议
* 升级至 **Conductor ≥ 3.30.2** (JS/Python 评估器不再以启用 host 访问/类加载的方式运行)。
* 纵深防御:在 Conductor API 前端设置身份验证,以非 root 且最小权限的用户运行服务器,并限制可以注册/运行工作流的人员。
## 检测
标记那些其 `INLINE`/`LAMBDA`/`DO_WHILE`/`SWITCH` 任务包含
引用了 `getClass`、`forName`、`Runtime`、`exec`、
`ProcessBuilder` 或 `java.` 反射的 `expression` 字符串的工作流定义,并标记产生 shell 进程的 Conductor 进程。
有关反射链、跨版本的评估器配置以及补丁详情,请参阅 [`ANALYSIS.md`](ANALYSIS.md) 。
* 作者:**Caio Fabrício** — [github.com/BiiTts](https://github.com/BiiTts)
* 漏洞功劳归属于原始报告者/供应商公告;本仓库
是一个独立的、可复现的实验环境及 PoC,仅用于防御和教育目的。仅限用于
授权的安全测试。
标签:Go语言工具, JS文件枚举, PoC, 数据可视化, 暴力破解, 编程工具, 请求拦截, 远程代码执行, 逆向工具