Foreman WebSocket 代理(lib/ws_proxy.rb)中命令注入漏洞的概念验证,已负责任地披露给 Red Hat 并已修补。
Foreman 的 WebSocket 代理将未经过滤的 host 值——来源于计算资源提供商的 API 响应(例如 VMware vSphere HostSystem.name)——直接插入到通过 Open3.popen3 执行的 shell 命令中。攻击者如果控制或伪造了 Foreman 实例所连接的计算资源服务器,就可以注入任意 shell 命令,当管理员打开虚拟机的控制台时,以 foreman 用户身份实现远程代码执行。
成功利用后可获取 Foreman 的数据库凭据和加密密钥,暴露所有存储的基础设施凭据(vCenter、AWS、SSH 密钥、API 令牌),并能够进一步渗透到受管基础设施中。
| CVE | CVE-2026-1961 |
| CWE | CWE-78(操作系统命令注入) |
| CVSS 3.1 | 8.0(高)— AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:H |
| 受影响组件 | lib/ws_proxy.rb |
| 受影响版本 | Foreman 至 3.18.0(含)(已在 3.17.0 上确认;代码路径自 2020 年以来未变) |
| 修复版本 | Foreman 3.18.1、3.17.2、3.16.3 |
| 需要认证 | 无(攻击者运行恶意服务器;Foreman 管理员作为正常工作流程的一部分对其进行认证) |
| 用户交互 | 管理员在虚拟机上点击 Console(正常工作流程) |
| 安全公告 | https://access.redhat.com/security/cve/cve-2026-1961 |
在 lib/ws_proxy.rb:44 处,host 参数被直接插入到 shell 命令字符串中:
cmd = "websockify --daemon --idle-timeout=#{idle_timeout} --timeout=#{timeout} #{port} #{host}:#{host_port}"
host 来自计算资源 API 响应,在通过 Open3.popen3 传递给 shell 之前从未被过滤。
malicious_vsphere_server.py 实现了一个最小化的 vSphere SOAP API——足以处理认证和虚拟机枚举——并返回一个包含 shell 元字符载荷的恶意 HostSystem.name 值。
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)
在补丁发布后发布,遵循协调披露流程。仅供授权的安全测试和教育目的使用。请勿对您不拥有或未获得明确测试许可的系统使用。