
pfSense CE 2.9.0-DEVELOPMENT — высокий уровень — удалённое выполнение кода — остаточный CARP VHID
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-carp-vhid
Класс: RCE Доступ: Удалённый
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
Редактирование виртуального IP сохраняет CARP VHID из POST без проверки диапазона 1-255. Опции Form_Select существуют только в HTML. При применении CARP VHID обрабатывается escapeshellarg. При применении составного IP Alias значение vhid {$carpvip['vhid']} подставляется вне escapeshellarg. Статус CARP подставляет тот же сохранённый VHID в конвейер grep с двойными кавычками; точка с запятой остаётся в кавычках, но подстановка команд всё равно выполняется под /bin/sh -c. Требуемые привилегии — редактирование VIP + применение, а не Diagnostics: Command.
| ID | CVE пока нет |
| Класс | RCE |
| Доступ | Удалённый (аутентифицированный WebGUI) |
| CWE | CWE-78 |
| CVSS | High: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Продукт | pfSense CE |
| Затронуто | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) CARP VHID |
| Аутентификация | Сессия WebGUI с правами редактирования VIP + применения (статус/виджет — более поздний триггер) |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Я зафиксировал публичный master 9363ac5. Лаборатория представляет собой PHP-гаджет из зафиксированных interface_carp_configure, составного ipalias mwexec и статуса exec. Loopback 127.0.0.1:18830.
| Метод | Точка сброса | Привилегия |
|---|---|---|
POST carp VIP с нецелочисленным VHID, затем применение составного IP Alias на родителе _vip{uniqid} | mwexec ifconfig ... alias {$gateway} {$vhid} (interfaces.inc:3238) | Integrity (подтверждено в лаборатории): root shell. В лаборатории ipalias-unescaped записал свидетельство. Применение CARP с тем же VHID не записало ничего (carp-escaped=yes). |
Тот же сохранённый VHID, затем GET status_carp.php или рендеринг carp_status.widget.php | exec конвейер grep (pfsense-utils.inc:794) | Integrity (подтверждено в лаборатории): подстановка команд внутри двойных кавычек выполнилась и записала свидетельство (status-sink=yes, status-subst=yes). Точка с запятой осталась в кавычках. Триггер виджета может быть из другой сессии GUI. |
| Тот же root shell | файловая система хоста | Recon (предположительно): config.xml, ключи. |
Root shell или сломанный ifconfig | устройства CARP / alias | Availability (предположительно): нарушение работы интерфейса / CARP / фильтра. |
Подтверждено в лаборатории vs предположительно: carp-escaped, свидетельство ipalias-unescaped и свидетельство подстановки команд в статусе подтверждены в лаборатории. Разведка файловой системы и нарушение работы фильтра предполагаются исходя из root PHP-FPM.
Требуется: page-firewall-virtualipaddress-edit (сохранение) и page-firewall-virtualipaddresses (применение). Точка сброса статуса: page-status-carp или любая панель управления с виджетом CARP. CSRF на POST.
| Поверхность | Лаборатория |
|---|---|
| Само применение CARP | escapeshellarg для VHID, carp-escaped=yes |
| Пароль CARP / advbase / advskew / subnet | is_ipaddr / экранировано |
| Без аутентификации | закрыто |
| xmlrpc-применение тех же объектов без учётных данных HA | SA-26_22 skip-list |
| Diagnostics: Command | остаётся закрытым, если не предоставлено дополнительно |
cd lab
./run.sh
Loopback 127.0.0.1:18830. Проект Compose pfsense-carp-vhid. Тег образа pfsense-carp-vhid:2.9.0-dev. Свидетельство PFSENSE-CARP-VHID-WITNESS. Последняя строка:
SUCCESS PFSENSE-CARP-VHID carp-escaped=yes ipalias-unescaped=yes status-sink=yes PFSENSE-CARP-VHID-WITNESS
Ограничить VHID целочисленным диапазоном 1-255 при сохранении. Применять escapeshellarg к VHID при применении составного IP Alias и в grep статуса — так же, как это уже делает применение CARP.
9363ac5b8651a1c7a333180425ce7719070f95f9firewall_virtual_ip.inc saveVIPinterfaces.inc составной ipalias mwexecpfsense-utils.inc grep статуса CARP