
PoC para CVE-2026-1961 — inyección de comandos en el proxy WebSocket de Foreman (lib/ws_proxy.rb) a través de un hostname de recurso de cómputo no saneado, lo que provoca RCE como el usuario foreman. Divulgado y parcheado de forma responsable.
Prueba de concepto para una vulnerabilidad de inyección de comandos en el proxy WebSocket de Foreman (lib/ws_proxy.rb), divulgada de forma responsable a Red Hat y parcheada.
El proxy WebSocket de Foreman interpola un valor host no saneado — obtenido de la respuesta de la API de un proveedor de recursos de cómputo (por ejemplo, HostSystem.name de VMware vSphere) — directamente en un comando de shell ejecutado mediante Open3.popen3. Un atacante que controle o suplante un servidor de recursos de cómputo al que se conecte una instancia de Foreman puede inyectar comandos de shell arbitrarios, logrando ejecución remota de código como el usuario foreman cuando un administrador abre la Consola de una VM.
La explotación exitosa otorga acceso a las credenciales de base de datos y claves de cifrado de Foreman, exponiendo todas las credenciales de infraestructura almacenadas (vCenter, AWS, claves SSH, tokens de API) y permitiendo un mayor pivoteo hacia la infraestructura gestionada.
| CVE | CVE-2026-1961 |
| CWE | CWE-78 (Inyección de Comandos del SO) |
| CVSS 3.1 | 8.0 (Alto) — AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:H |
| Componente afectado | lib/ws_proxy.rb |
| Versiones afectadas | Foreman hasta la 3.18.0 inclusive (confirmado en la 3.17.0; ruta de código sin cambios desde 2020) |
| Corregido en | Foreman 3.18.1, 3.17.2, 3.16.3 |
| Autenticación requerida | Ninguna (el atacante ejecuta el servidor malicioso; el administrador de Foreman se autentica contra él como parte del flujo de trabajo normal) |
| Interacción del usuario | El administrador hace clic en Console en una VM (flujo de trabajo normal) |
| Aviso | https://access.redhat.com/security/cve/cve-2026-1961 |
En lib/ws_proxy.rb:44, el parámetro host se interpola directamente en una cadena de comando de shell:
cmd = "websockify --daemon --idle-timeout=#{idle_timeout} --timeout=#{timeout} #{port} #{host}:#{host_port}"
host proviene de la respuesta de la API del recurso de cómputo y nunca se sanea antes de pasarse a un shell mediante Open3.popen3.
malicious_vsphere_server.py implementa una API SOAP de vSphere mínima — suficiente para manejar la autenticación y la enumeración de VMs — y devuelve un valor HostSystem.name envenenado que contiene una carga útil con metacaracteres de 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)
Publicado tras el parche, siguiendo una divulgación coordinada. Proporcionado únicamente para pruebas de seguridad autorizadas y fines educativos. No lo utilice contra sistemas que no posea o para los que no tenga permiso explícito de probar.