
pfSense CE 2.9.0-DEVELOPMENT — высокий уровень — удалённое выполнение кода — остаточный CARP VHID
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-carp-vhid
Разбор: https://abraxaslabs.tech/research/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) | Целостность (доказано в лаборатории): root shell. В лаборатории ipalias-unescaped записал свидетельство. Применение CARP с тем же VHID ничего не записало (carp-escaped=yes). |
Тот же сохранённый VHID, затем GET status_carp.php или рендеринг carp_status.widget.php | конвейер grep в exec (pfsense-utils.inc:794) | Целостность (доказано в лаборатории): подстановка команд внутри двойных кавычек выполнилась и записала свидетельство (status-sink=yes, status-subst=yes). Точка с запятой осталась в кавычках. Триггер виджета может быть из другой сессии GUI. |
| Тот же root shell | файловая система хоста | Разведка (предположительно): config.xml, ключи. |
Root shell или сломанный ifconfig | устройства CARP / alias | Доступность (предположительно): нарушение работы интерфейса / 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 |
| 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 при применении stacked IP Alias и при grep статуса — так же, как это уже делает CARP apply.
9363ac5b8651a1c7a333180425ce7719070f95f9firewall_virtual_ip.inc saveVIPinterfaces.inc stacked ipalias mwexecpfsense-utils.inc CARP status grep