
PoC для CVE-2026-1961 — внедрение команд в WebSocket-прокси Foreman (lib/ws_proxy.rb) через несанитизированное имя хоста вычислительного ресурса, приводящее к RCE от имени пользователя foreman. Ответственно раскрыто и исправлено.
Доказательство концепции уязвимости инъекции команд в WebSocket-прокси Foreman (lib/ws_proxy.rb), раскрытой ответственно перед Red Hat и исправленной.
WebSocket-прокси Foreman подставляет несанитизированное значение host — полученное из ответа API провайдера вычислительного ресурса (например, VMware vSphere HostSystem.name) — напрямую в команду оболочки, выполняемую через Open3.popen3. Злоумышленник, контролирующий или подменяющий сервер вычислительного ресурса, к которому подключается экземпляр Foreman, может внедрить произвольные команды оболочки, добившись удалённого выполнения кода от имени пользователя 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 подставляется напрямую в строку команды оболочки:
cmd = "websockify --daemon --idle-timeout=#{idle_timeout} --timeout=#{timeout} #{port} #{host}:#{host_port}"
host берётся из ответа API вычислительного ресурса и никогда не санитизируется перед передачей в оболочку через Open3.popen3.
malicious_vsphere_server.py реализует минимальный SOAP API vSphere — достаточный для обработки аутентификации и перечисления виртуальных машин — и возвращает отравленное значение 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)
Выпущено после патча, в соответствии с координированным раскрытием. Предоставлено исключительно для авторизованного тестирования безопасности и образовательных целей. Не используйте против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.