
PoC per CVE-2026-1961 — command injection nel proxy WebSocket di Foreman (lib/ws_proxy.rb) tramite hostname di compute resource non sanificato, che porta a RCE come utente foreman. Divulgato in modo responsabile e corretto.
Proof-of-concept per una vulnerabilità di command injection nel proxy WebSocket di Foreman (lib/ws_proxy.rb), divulgata in modo responsabile a Red Hat e corretta.
Il proxy WebSocket di Foreman interpola un valore host non sanitizzato, proveniente dalla risposta API di un provider di risorse di calcolo (ad es. VMware vSphere HostSystem.name), direttamente in un comando shell eseguito tramite Open3.popen3. Un attaccante che controlla o falsifica un server di risorse di calcolo a cui un'istanza Foreman si connette può iniettare comandi shell arbitrari, ottenendo l'esecuzione di codice remoto come utente foreman quando un amministratore apre la Console di una VM.
Una sfruttamento riuscito consente l'accesso alle credenziali del database e alle chiavi di cifratura di Foreman, esponendo tutte le credenziali dell'infrastruttura memorizzate (vCenter, AWS, chiavi SSH, token API) e permettendo ulteriori movimenti laterali nell'infrastruttura gestita.
| CVE | CVE-2026-1961 |
| CWE | CWE-78 (OS Command Injection) |
| CVSS 3.1 | 8.0 (High) - AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:H |
| Componente interessato | lib/ws_proxy.rb |
| Versioni interessate | Foreman fino alla 3.18.0 inclusa (confermato sulla 3.17.0; percorso di codice invariato dal 2020) |
| Corretto in | Foreman 3.18.1, 3.17.2, 3.16.3 |
| Autenticazione richiesta | Nessuna (l'attaccante esegue il server malevolo; l'amministratore di Foreman si autentica ad esso come parte del normale flusso di lavoro) |
| Interazione utente | L'amministratore fa clic su Console su una VM (flusso di lavoro normale) |
| Advisory | https://access.redhat.com/security/cve/cve-2026-1961 |
In lib/ws_proxy.rb:44, il parametro host viene interpolato direttamente in una stringa di comando shell:
cmd = "websockify --daemon --idle-timeout=#{idle_timeout} --timeout=#{timeout} #{port} #{host}:#{host_port}"
host proviene dalla risposta API della risorsa di calcolo e non viene mai sanitizzato prima di essere passato a una shell tramite Open3.popen3.
malicious_vsphere_server.py implementa una API SOAP vSphere minimale, sufficiente a gestire l'autenticazione e l'enumerazione delle VM, e restituisce un valore HostSystem.name avvelenato contenente un payload con metacaratteri 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
Output atteso: foremanHoussam Sahli (Malleum)
Rilasciato dopo la patch, seguendo la divulgazione coordinata. Fornito esclusivamente per test di sicurezza autorizzati e scopi educativi. Non utilizzare contro sistemi di cui non si è proprietari o per i quali non si dispone di esplicita autorizzazione al test.