
OPNsense 26.7.6 — высокий — удалённый — остаточные привилегии — зеркало пользовательской прошивки sed-пропускает отпечатки pkg
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-firmware-mirror-sed
Класс: Обход подписи Достижимость: Удалённая
Ядро OPNsense 26.7.6 (a842fe48) - opnsense.org
Система: Firmware set отправляет пользовательские mirror / flavour. Ядро FILTER_SANITIZE_URL сохраняет \|#;". opnsense-update -m / -n интерполирует эту строку в sed для OPNsense.conf и может переключить signature_type с "fingerprints" на "none". Затем pkg install от имени root с URL атакующего. Страница настроек предлагает пользовательское зеркало всё ещё подписанных пакетов OPNsense. На ней нет элемента управления «отключить подписи». Привилегия — page-system-firmware-manualupdate, а не page-all.
Sed находится вне закреплённой версии в opnsense-update. Ядро на этой версии — это несанитизированное поле плюс проход -m. Лаборатория повторно запускает этот текст программы s||| с помощью GNU sed.
Этот пакет на GitHub остаётся приватным до скоординированного раскрытия.
| ID | CVE пока нет |
| Класс | Обход подписи |
| Достижимость | Удалённая (аутентифицированный WebGUI / API) |
| CWE | CWE-74 / CWE-347 |
| CVSS | Высокий: 7.2 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| Продукт | OPNsense core |
| Затронуто | 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) Firmware set пользовательское зеркало |
| Аутентификация | Сессия WebGUI или ключ API с page-system-firmware-manualupdate |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Я закрепил тег 26.7.6 peel a842fe48. Лаборатория — это PHP-гаджет из FILTER_SANITIZE_URL плюс sed mod_mirrorurl из opnsense-update, loopback HTTP на 127.0.0.1:18860. PR:H, потому что странице firmware уже разрешено устанавливать подписанные пакеты. Оценка 8.8, если эта страница рассматривается как PR:L.
| Метод | Точка сброса | Привилегия |
|---|---|---|
FILTER_SANITIZE_URL на пользовательском зеркале с |, затем sed в стиле opnsense-update | перезапись OPNsense.conf | Целостность (доказано в лаборатории): signature_type "none". Контрольное зеркало остаётся "fingerprints". Лаборатория: sanitize-keeps-pipe=yes signature_type=none fingerprints-control=yes. |
| Тот же набор, поле plugins | setAction отбрасывает plugins | Отрицательный результат (доказано в лаборатории): plugins отбрасываются до сохранения. |
Затем POST /api/core/firmware/install/<pkg> | pkg install -y от имени root с URL атакующего | Целостность (предположительно): неподписанный пакет от имени root. Страница firmware уже устанавливает подписанные пакеты; этот остаток — пропуск проверки. Неподписанной полезной нагрузки в лаборатории нет. |
Затем POST /api/core/firmware/update или /upgrade | opnsense-update -pt / -u от имени root | Целостность (предположительно): наборы base/kernel с пропущенной проверкой (DO_INSECURE). |
GET /api/core/firmware/info, /running, /upgradestatus | firmware API | Разведка (предположительно): списки пакетов, журнал обновлений, параметры зеркала. Предназначено для этого ACL. |
POST /api/core/firmware/reboot, /poweroff, /remove/<pkg> | действия configd firmware | Доступность (предположительно): reboot/halt/remove. Предназначено для этого ACL, а не для остатка. |
Доказано в лаборатории vs предположительно: sanitize сохраняет | и signature_type none — это SUCCESS в лаборатории. Живой pkg install неподписанного пакета — предположительно. Гаджет, а не полноценная FreeBSD VM OPNsense. Неподписанной полезной нагрузки пакета нет.
Требуется: вошедший в систему пользователь или его Local API key с page-system-firmware-manualupdate и без page-all. CSRF при POST сессии. Не без аутентификации. Не только dashboard.
| Поверхность | Лаборатория |
|---|---|
| Firmware без аутентификации | 401 |
| Только dashboard | 403 |
Контрольное зеркало https://pkg.opnsense.org | signature_type остаётся "fingerprints" |
| Обход пути в имени плагина | filter_pkgname |
| Получение changelog | по-прежнему opnsense-verify |
user-config-readonly при save() | throwReadOnly() |
| Штатные HTTP-зеркала без пропуска проверки | MITM транспорта; fingerprints всё ещё требуются |
| XMLRPC firmware | только строки версий |
Без аутентификации нет. Только dashboard нет. Changelog по-прежнему подписан.
cd lab
./run.sh
Loopback 127.0.0.1:18860. Compose-проект opnsense-firmware-mirror-sed. Свидетель OPNSENSE-FIRMWARE-MIRROR-SED-WITNESS. Последняя строка:
SUCCESS opnsense-firmware-mirror-sed sanitize-keeps-pipe=yes signature_type=none fingerprints-control=yes OPNSENSE-FIRMWARE-MIRROR-SED-WITNESS
Корневой лаунчер: python3 opnsense-firmware-mirror-sed-Abraxas-Labs.py.
Форма атакующего зеркала, использованная в лаборатории (только свидетель, без неподписанного pkg):
https://example.invalid/|;/signature_type/s/"fingerprints"/"none"/;#
Отклонять пользовательское зеркало, которое не является URL. Удалять метасимволы sed (|, ;, #, ") перед opnsense-update -m / -n или передавать URL как файл, чтобы sed никогда не видел его как текст программы. Сохранять signature_type: "fingerprints", если только отдельный, проверенный механизм управления не отключает проверку. Не позволять Firmware set перезаписывать fingerprints в "none".
a842fe48c21288d11a422cb944678e8eb308becfFirmwareController.php setAction FILTER_SANITIZE_URLscripts/firmware/repos/OPNsense.php opnsense-update -sd -mOPNsense.conf.shadow.in штатный signature_type: "fingerprints"opnsense-update mod_mirrorurl (s\|\| в строке url:)