
CVE-2026-58138 — Conductor (3.21.21..<3.30.2) nicht authentifizierte RCE über INLINE GraalVM-Evaluator (HostAccess.ALL). Labor + PoC, Ende-zu-Ende verifiziert (root).
TL;DR: Orkes/OSS Conductor (Versionen
3.21.21bis< 3.30.2) wertet inINLINE-Tasks vom Benutzer bereitgestelltes JavaScript mit einem GraalVM-Kontext aus, der vollen Host-Zugriff (HostAccess.ALL) besitzt. Da die Community-API standardmäßig keine Authentifizierung hat, kann jeder nicht authentifizierte Benutzer einen bösartigen Workflow einreichen, vom gebundenen JavaScript-Objekt zujava.lang.Runtimespringen und als Conductor-Prozessbenutzer (oft ) erreichen.
root| Attribut | Details |
|---|---|
| CVE-Kennung | CVE-2026-58138 |
| Betroffene Software | Conductor 3.21.21 bis 3.30.1 |
| Behobene Version | 3.30.2 (Commits: 87a7d96, c691e35) |
| Schwachstellenklasse | CWE-94: Code-Injection (GraalVM-Polyglot-Sandbox-Umgehung) |
| CVSS v3.1 Punktezahl | 9.8 (Kritisch) AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Authentifizierung | Keine (Community-API ist standardmäßig ohne Authentifizierung) |
| Bestätigung | Als root gegen conductoross/conductor:3.22.3 bestätigt |
Hinweis zur Version: Versionen bis etwa
3.29.xverwenden die einfacheallowHostAccess(HostAccess.ALL)-Konfiguration, die dieser PoC direkt ausnutzt. Die Versionen3.30.0und3.30.1führten eine teilweise Blockliste ein (die einige Reflection-Aufrufe blockiert), aber die vollständige Behebung (allowHostClassLoading(false)+ Engine-Härtung) wurde erst in3.30.2umgesetzt. Dieser PoC zielt auf die nicht isolierte Konfiguration ab.
Die Schwachstelle liegt in der Art und Weise, wie Conductor den GraalVM-Polyglot-Kontext für die Skriptauswertung konfiguriert.
In core/.../events/ScriptEvaluator.java (≤ 3.29.x) wird der Kontext wie folgt aufgebaut:
return Context.newBuilder("js")
.allowHostAccess(HostAccess.ALL) // GEFAHR: Vollständige Host-Interop, kein Sandbox
.build();
Warum dies ein Spielverderber ist:
HostAccess.ALL gewährt der JavaScript-Engine die Berechtigung, jede Methode aufzurufen oder jedes Feld auf Java-Host-Objekten zuzugreifen.INLINE-Task bindet seine Eingabeparameter an die JavaScript-Variable $, die ein echtes Java-Objekt ist.$ verketten:
$.getClass().getClass() ➔ java.lang.Class ➔ Class.forName("java.lang.Runtime") ➔ Runtime.getRuntime().exec("sh -c <command>").Context.newBuilder("python").allowAllAccess(true)).Der Angriff erfordert keine Authentifizierung und folgt drei einfachen Schritten:
POST-Anfrage an /api/metadata/workflow mit einer bösartigen Workflow-Definition. Der INLINE-Task enthält die reflektive JavaScript-Nutzlast in seinem expression-Feld.POST-Anfrage an /api/workflow/{workflow_name}, um den Workflow zu starten.Runtime.exec führt den Betriebssystembefehl aus, und der PoC fängt clever die stdout ab und gibt sie als result-Ausgabe des Tasks zurück, die dann über die API abgerufen wird.Starten Sie eine lokale Instanz der angreifbaren Conductor-Version mit Docker.
# Repository klonen und die Laborumgebung starten
docker compose -f docker/docker-lab.yml up -d
# ~60 Sekunden warten, bis der All-in-One-Server vollständig gestartet ist
Führen Sie das bereitgestellte Python-Exploit-Skript aus. Es benötigt nur die Python-Standardbibliothek (keine externen Abhängigkeiten erforderlich).
python3 exploit.py http://127.0.0.1:8080 -c "id; hostname; whoami"
[*] Ziel: http://127.0.0.1:8080
[*] Befehl: 'id; hostname; whoami'
[*] Registriere Workflow mit bösartigem INLINE (javascript)-Task ... (keine Authentifizierung)
[*] Starte Workflow-Ausführung ... (keine Authentifizierung)
[*] Gestartete Workflow-ID=pwn_1705432100; lese INLINE-Task-Ausgabe ...
[+] NICHT AUTHENTIFIZIERTE RCE BESTÄTIGT - Befehlsausgabe vom Conductor-Host:
uid=0(root) gid=0(root) groups=0(root)
vbox
Linux 6.18.12+deb13-amd64
Hinweis: Die Ausgabe uid=0(root) beweist die echte Ausführung auf dem Host, nicht eine vorgetäuschte Antwort.
Eine erfolgreiche Ausnutzung gewährt dem Angreifer beliebige Betriebssystembefehle auf dem Conductor-Orchestrator-Host.
Da Conductor oft mit erhöhten Privilegien zur Verwaltung der Infrastruktur eingesetzt wird, führt dies typischerweise zu:
≥ 3.30.2. In dieser Version führen die JS- und Python-Evaluatoren nicht mehr mit Host-Zugriff oder aktiviertem Klassenladen aus.Überwachen Sie Ihre Umgebung auf die folgenden Indikatoren für eine Kompromittierung (IoCs):
INLINE-, LAMBDA-, DO_WHILE- oder SWITCH-Tasks, deren expression-Strings Folgendes enthalten:
getClass, forName, Runtime, exec, ProcessBuilderjava.lang.reflect oder generischen java.-Paketzugriffsh, bash, cmd.exe) starten oder ausgehende Netzwerkverbindungen aufbauen.Eine ausführliche Analyse der Reflection-Kette, versionsspezifischer Evaluator-Konfigurationen und der Patch-Analyse finden Sie in ANALYSIS.md.
Haftungsausschluss: Dieses Repository enthält eine unabhängige, reproduzierbare Testumgebung und einen Proof of Concept (PoC), der ausschließlich für defensive, pädagogische und autorisierte Sicherheitstestzwecke bestimmt ist. Verwenden Sie diesen Code nicht gegen Systeme, die Sie nicht besitzen oder für die Sie keine ausdrückliche schriftliche Erlaubnis zum Testen haben. Die Autoren übernehmen keine Haftung für Missbrauch.