OPNsense 26.7.6 — высокий уровень — удалённо — инъекция строк конфигурации — загрузчик tunables
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-tunables-loader
Класс: Инъекция строки конфигурации Достижимость: Удалённая
Ядро OPNsense 26.7.6 (a842fe48) - opnsense.org
System: Advanced: Tunables по-прежнему интерполирует имя/значение в /boot/loader.conf. Оставшийся родственник GHSA-fq94. Tunables.xml tunable / value — это простые TextField (переводы строк включены). system_login_configure() записывает {$param}="{$value}". Переконфигурация Tunables также перезапускает login. Живой sysctl(8) проходит через shell_safe плюс фильтр OID, так что этот переход не является shell-инъекцией. Остаток — это дополнительные директивы loader при следующей загрузке. Привилегия — page-system-advanced-sysctl, а не page-all.
Этот пакет на GitHub остаётся приватным до скоординированного раскрытия.
| ID | CVE пока нет |
| Класс | Инъекция строки конфигурации |
| Достижимость | Удалённая (аутентифицированный WebGUI / API) |
| CWE | CWE-93 |
| CVSS | Высокий: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Продукт | OPNsense core |
| Затронуто | 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) System: Advanced: Tunables |
| Аутентификация | Сессия WebGUI или ключ API с page-system-advanced-sysctl |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | compose exec gadget (hunt slot 18850) |
Я зафиксировал тег 26.7.6 peel a842fe48. Лаборатория — это PHP-гаджет зафиксированной интерполяции system_login_configure(). Compose-проект opnsense-tunables-loader. Hunt slot 18850 в семействе гаджетов 18800-18860; этот compose-файл использует docker compose exec php, а не опубликованный HTTP-биндинг.
| Метод | Sink | Привилегия |
|---|---|---|
Значение Tunables с CR/LF (hw.usb.no_boot_wait плюс "\n# witness) | закрепить в system_login_configure() дополнительную строку в /boot/loader.conf | Целостность (доказано в лаборатории): дополнительный # OPNSENSE-TUNABLES-LOADER-WITNESS на отдельной строке после закрытого присваивания. Лаборатория: newline-extra-line=yes. |
Чистое значение 1 | тот же writer | Отрицательный результат (доказано в лаборатории): одна строка присваивания, без witness. Лаборатория: clean-value-single-line=yes. |
| Те же дополнительные строки loader при следующей загрузке | loader init_path / module_path / *_load / vfs.root.mountfrom / console | Целостность (предположительно): loader при следующей загрузке учитывает ключи атакующего. Перезагрузка в этом гаджете не выполнялась. |
Мусорные строки loader / неверный vfs.root.mountfrom | /boot/loader.conf | Доступность (предположительно): сбой загрузки или неверный root. |
POST /api/core/tunables/searchItem | API tunables | Разведка (предположительно): список tunables, включая current/default/type. Предназначено для этого ACL. |
Живой sysctl -w валидного OID | set_sysctl + фильтр OID | Предназначенная задача страницы. Дополнительные строки loader — это остаток. |
Доказано в лаборатории vs предположительно: дополнительная строка loader через перевод строки и однострочное чистое значение — УСПЕХ в лаборатории. Применение loader при следующей загрузке — предположительно. Гаджет, а не полноценная FreeBSD VM OPNsense.
Требуется: вошедший в систему пользователь или его Local API key с page-system-advanced-sysctl и без page-all. POST /api/core/tunables/*. CSRF при POST через сессию. Переконфигурация перезапускает login; rc.reload_all и загрузка также вызывают system_login_configure.
| Поверхность | Лаборатория |
|---|---|
| Shell-инъекция в живом sysctl | shell_safe плюс фильтр OID |
| Чистое значение | одна строка присваивания |
| Без аутентификации | 401 |
Пользователь без page-system-advanced-sysctl | 403 |
user-config-readonly | save() выбрасывает исключение |
Администратор tunables с page-all, задающий реальный OID | предназначено |
| Исправленные текстовые поля GUI из GHSA-fq94 | другие sink; это поле не было названо |
Без аутентификации — нет. Живого shell sysctl — нет. Diagnostics: Command — нет.
cd lab
./run.sh
Compose-проект opnsense-tunables-loader. Witness OPNSENSE-TUNABLES-LOADER-WITNESS. Последняя строка:
SUCCESS opnsense-tunables-loader newline-extra-line=yes clean-value-single-line=yes OPNSENSE-TUNABLES-LOADER-WITNESS
Корневой лаунчер: python3 opnsense-tunables-loader-Abraxas-Labs.py.
Удаляйте CR/LF и " из имени и значения tunables, тот же класс, что и GHSA-fq94. Типизируйте имя как маску OID, а не как простой TextField. Заключайте в кавычки с помощью помощника, который не может закрыть присваивание. Не записывайте tunable в /boot/loader.conf, если это не известный ключ loader.
a842fe48c21288d11a422cb944678e8eb308becfsystem.inc интерполяция loader.conf в system_login_configureTunables.xml простые TextField для имени/значения