
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 commandes 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, issue 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 d'API) et permettant de pivoter plus avant dans l'infrastructure gérée.
| CVE | CVE-2026-1961 |
| CWE | CWE-78 (Injection de commandes 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'à 3.18.0 inclus (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 à 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
Sortie attendue : foremanHoussam Sahli (Malleum)
Publié après la correction, dans le cadre d'une divulgation coordonnée. Fourni uniquement à des fins de tests de sécurité autorisés et pédagogiques. Ne pas utiliser contre des systèmes que vous ne possédez pas ou pour lesquels vous ne disposez pas d'une autorisation explicite de test.