
pfSense CE 2.9.0-DEVELOPMENT — высокий уровень — удалённое выполнение кода — RCE — QinQ parent-if ifconfig
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-qinq-parent-if
Класс: RCE Достижимость: Удалённая
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
Редактирование QinQ сохраняет имя родительского интерфейса без проверки does_interface_exist. Редактирование VLAN уже отклоняет родителя, который не является активным интерфейсом. Form_Select не выполняет повторную валидацию POST. Создание выполняет write_config даже когда interface_qinq_configure завершается досрочно. Добавление/удаление участника затем подставляет сохранённый vlanif в неэкранированный ifconfig. PHP exec — это /bin/sh -c. WebGUI PHP-FPM работает от root. Привилегия — page-interfaces-qinq-edit, а не 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) редактирование QinQ |
| Аутентификация | Сессия WebGUI с page-interfaces-qinq-edit |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Я зафиксировал публичный master 9363ac5. Лаборатория — это PHP-гаджет из зафиксированных строк vlan_interface / interface_qinq_configure / member exec, HTTP на loopback 127.0.0.1:18810.
| Метод | Точка срабатывания | Привилегия |
|---|---|---|
| POST создание QinQ с родителем, который не является активным интерфейсом, затем POST редактирование с добавлением участника | interface_qinq2_configure exec ifconfig vlan create ... (interfaces.inc:620) | Целостность (доказано в лаборатории): root-шелл через /bin/sh -c. Лаборатория: добавление участника qinq2 записало свидетельство (member-sink=yes). |
Тот же сохранённый vlanif, POST редактирование с удалением участника | exec("/sbin/ifconfig {$parent}.{$tag} destroy") (interfaces_qinq_edit.php:212) | Целостность (доказано в лаборатории): тот же root exec. У destroy нет ограничения IF_NAMESIZE. |
| Тот же root-шелл | файловая система хоста | Разведка (предположительно): config.xml, ключи, другие арендаторы. Эта страница не выводит результат exec. |
Root-шелл или сломанный ifconfig | устройства vlan | Доступность (предположительно): создание/удаление устройств vlan; плоскость данных задействована. |
Доказано в лаборатории vs предположительно: отклонение VLAN, создание без exec, блокировка IF_NAMESIZE при длине 16 и свидетельство добавления участника qinq2 доказаны в лаборатории. Разведка файловой системы и нарушение плоскости данных предполагаются исходя из root PHP-FPM.
Требуется: сессия WebGUI с page-interfaces-qinq-edit. CSRF-токен. Два POST-запроса (создание, затем редактирование участника). У администратора по умолчанию есть эта страница. Ограниченному пользователю можно выдать только эту страницу.
| Поверхность | Лаборатория |
|---|---|
| Проверка существования родителя VLAN | vlan-rejected=yes |
| QinQ только создание (родитель отсутствует) | сохраняет конфигурацию, create-no-exec=yes |
| Длина имени qinq2 16 | if-namesize-block=yes перед exec |
| Без аутентификации / CSRF без токена | guiconfig + CSRF-magic |
Regex имён GIF/GRE, участники LAGG does_interface_exist + escapeshellarg | другие страницы |
| Удаление из списка QinQ никогда не созданного родителя | does_interface_exist($vlanif) |
| Diagnostics: Command | остаётся закрытой, если не выдана дополнительно |
Никакого Diagnostics: Command. Никакого доступа без аутентификации. Исторический класс — CVE-2023-42326 GIF/GRE, другая страница.
cd lab
./run.sh
Loopback 127.0.0.1:18810. Проект Compose pfsense-qinq-parent-if. Тег образа pfsense-qinq-parent-if:2.9.0-dev. Свидетельство PFSENSE-QINQ-PARENT-IF-WITNESS. Последняя строка:
SUCCESS PFSENSE-QINQ-PARENT-IF vlan-rejected=yes create-no-exec=yes member-sink=yes if-namesize-block=yes PFSENSE-QINQ-PARENT-IF-WITNESS
Редактирование QinQ: отклонять родителя, который не является активным интерфейсом, так же как при редактировании VLAN. Проверка целочисленности тегов участников уже существует; всё равно применять escapeshellarg к сохранённому vlanif перед каждым ifconfig. Ограничивать destroy при удалении участника так же, как interface_qinq2_configure ограничивает IF_NAMESIZE.
9363ac5b8651a1c7a333180425ce7719070f95f9interfaces_qinq_edit.phpinterfaces.inc interface_qinq2_configureinterfaces_vlan_edit.php