
PoC pour CVE-2026-1961 — injection de commande dans le proxy WebSocket de Foreman (lib/ws_proxy.rb) via un hostname de ressource de calcul non assaini, menant à une RCE en tant qu'utilisateur foreman. Divulgué de manière responsable et corrigé.
Preuve de concept pour une vulnérabilité d'injection de commande dans le proxy WebSocket de Foreman (lib/ws_proxy.rb), divulguée de manière responsable à Red Hat et corrigée.
Le proxy WebSocket de Foreman interpole une valeur host non assainie — provenant de la réponse API d'un fournisseur de ressource de calcul (par exemple HostSystem.name de VMware vSphere) — directement dans une commande shell exécutée via Open3.popen3. Un attaquant qui contrôle ou usurpe un serveur de ressource de calcul auquel une instance Foreman se connecte peut injecter des commandes shell arbitraires, obtenant ainsi une exécution de code à distance sous l'utilisateur foreman lorsqu'un administrateur ouvre la Console d'une VM.
Une exploitation réussie donne accès aux identifiants de base de données et aux clés de chiffrement de Foreman, exposant tous les identifiants d'infrastructure stockés (vCenter, AWS, clés SSH, jetons API) et permettant de pivoter davantage dans l'infrastructure gérée.
| CVE | CVE-2026-1961 |
| CWE | CWE-78 (Injection de commande OS) |
| CVSS 3.1 | 8.0 (Élevé) — AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:H |
| Composant affecté | lib/ws_proxy.rb |
| Versions affectées | Foreman jusqu'à et y compris 3.18.0 (confirmé sur 3.17.0 ; chemin de code inchangé depuis 2020) |
| Corrigé dans | Foreman 3.18.1, 3.17.2, 3.16.3 |
| Authentification requise | Aucune (l'attaquant exécute le serveur malveillant ; l'administrateur Foreman s'y authentifie dans le cadre du flux de travail normal) |
| Interaction utilisateur | L'administrateur clique sur Console sur une VM (flux de travail normal) |
| Avis | https://access.redhat.com/security/cve/cve-2026-1961 |
À lib/ws_proxy.rb:44, le paramètre host est interpolé directement dans une chaîne de commande shell :
cmd = "websockify --daemon --idle-timeout=#{idle_timeout} --timeout=#{timeout} #{port} #{host}:#{host_port}"
host provient de la réponse API de la ressource de calcul et n'est jamais assaini avant d'être transmis à un shell via Open3.popen3.
malicious_vsphere_server.py implémente une API SOAP vSphere minimale — suffisante pour gérer l'authentification et l'énumération des VM — et renvoie une valeur HostSystem.name empoisonnée contenant une charge utile avec un métacaractère shell.
python3 malicious_vsphere_server.py
python3 malicious_vsphere_server.py
VMware<attacker_ip>user / pass)EvilDatacenter)VNCTestVMfind /tmp -name "vsphere_rce.txt" 2>/dev/null
cat /tmp/systemd-private-*/tmp/vsphere_rce.txt
foremanHoussam Sahli (Malleum)
Publié après le correctif, dans le cadre d'une divulgation coordonnée. Fourni uniquement à des fins de tests de sécurité autorisés et d'éducation. Ne pas utiliser contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas l'autorisation explicite de tester.