
PoC para CVE-2026-1961 — injeção de comando no proxy WebSocket do Foreman (lib/ws_proxy.rb) através de hostname de recurso de computação não sanitizado, levando a RCE como o usuário foreman. Divulgado e corrigido de forma responsável.
Prova de conceito para uma vulnerabilidade de injeção de comando no proxy WebSocket do Foreman (lib/ws_proxy.rb), divulgada de forma responsável à Red Hat e corrigida.
O proxy WebSocket do Foreman interpola um valor host não sanitizado — proveniente da resposta da API de um provedor de recurso de computação (por exemplo, HostSystem.name do VMware vSphere) — diretamente em um comando de shell executado via Open3.popen3. Um atacante que controla ou falsifica um servidor de recurso de computação ao qual uma instância do Foreman se conecta pode injetar comandos de shell arbitrários, alcançando execução remota de código como o usuário foreman quando um administrador abre o Console de uma VM.
A exploração bem-sucedida concede acesso às credenciais de banco de dados e chaves de criptografia do Foreman, expondo todas as credenciais de infraestrutura armazenadas (vCenter, AWS, chaves SSH, tokens de API) e permitindo maior movimentação lateral na infraestrutura gerenciada.
| CVE | CVE-2026-1961 |
| CWE | CWE-78 (Injeção de Comando de SO) |
| CVSS 3.1 | 8.0 (Alto) — AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:H |
| Componente afetado | lib/ws_proxy.rb |
| Versões afetadas | Foreman até e incluindo 3.18.0 (confirmado na 3.17.0; caminho de código inalterado desde 2020) |
| Corrigido em | Foreman 3.18.1, 3.17.2, 3.16.3 |
| Autenticação necessária | Nenhuma (o atacante executa o servidor malicioso; o administrador do Foreman autentica-se nele como parte do fluxo de trabalho normal) |
| Interação do usuário | O administrador clica em Console em uma VM (fluxo de trabalho normal) |
| Aviso | https://access.redhat.com/security/cve/cve-2026-1961 |
Em lib/ws_proxy.rb:44, o parâmetro host é interpolado diretamente em uma string de comando de shell:
cmd = "websockify --daemon --idle-timeout=#{idle_timeout} --timeout=#{timeout} #{port} #{host}:#{host_port}"
O host vem da resposta da API do recurso de computação e nunca é sanitizado antes de ser passado para um shell via Open3.popen3.
malicious_vsphere_server.py implementa uma API SOAP mínima do vSphere — suficiente para lidar com autenticação e enumeração de VMs — e retorna um valor HostSystem.name envenenado contendo um payload de metacaractere 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)
Lançado após a correção, seguindo divulgação coordenada. Fornecido apenas para testes de segurança autorizados e fins educacionais. Não use contra sistemas que você não possui ou não tem permissão explícita para testar.