
OPNsense 26.7.6 — высокий — удалённый — остаточные привилегии — UidField uid 0
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-uidfield-system-uid0
Класс: Остаточные привилегии Доступ: Удалённый
Ядро OPNsense 26.7.6 (a842fe48) - opnsense.org
Делегированная страница page-system-usermanager выполняет два шага: scope=system, затем uid=0. UidField::setValue автоматически назначает 2000+ только пока scope не равен system. setNodes применяет uid до scope, поэтому один add не может проставить 0. Второй POST может. Затем auth sync user выполняет pw useradd -o -u 0 с домашним каталогом /root и группой wheel. Авторизованные ключи попадают в /root/.ssh/authorized_keys. Привилегия — System: Access: Management, а не page-all.
| ID | CVE пока нет |
| Класс | Остаточные привилегии |
| Доступ | Удалённый (аутентифицированный WebGUI / локальный API-ключ) |
| CWE | CWE-269 / CWE-284 |
| CVSS | Высокий: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Продукт | OPNsense core (Deciso B.V.) |
| Затронуто | OPNsense core 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) UidField / user-manager |
| Аутентификация | Сессия WebGUI или локальный API-ключ с page-system-usermanager |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Я зафиксировал тег 26.7.6 "Xenial Xenops". Лаборатория — это PHP-гаджет зафиксированного UidField::setValue плюс local_user_set, идентичность на loopback 127.0.0.1:18810. В stable/26.7 запись UID-0 была отменена коммитом ea4f01fe 2026-10-09. Этот откат — не данная фиксация. GHSA отсутствует.
| Метод | Точка срабатывания | Привилегия |
|---|---|---|
двухшаговое добавление scope=system, затем установка uid=0, затем auth sync user | фиксация UidField::setValue, затем заглушка pw useradd -o -u 0 (auth.inc:345-397) | Целостность (доказано в лаборатории): второй Unix UID 0, домашний каталог /root, группа wheel. Лаборатория: after-add=2000 after-set=0 pw-o-u0=yes. |
| та же установка + authorizedkeys | file_put_contents /root/.ssh/authorized_keys (auth.inc:407-416) | Целостность (доказано в лаборатории): свидетель в /root/.ssh/authorized_keys. |
SSH под этим именем, если sshd включён (AllowGroups wheel; PermitRootLogin не применяется к имени пользователя, отличному от root) | sshd | Разведка + целостность (предположительно): вход под новым именем в группе wheel, чтение /root. Гаджет не запускал sshd. |
те же POST с scope=user uid=0 | UidField автоматически назначает 2000+ | Отрицательный результат (доказано в лаборатории): uid остаётся 2000. scope-user-uid0-ignored=yes. |
set для штатного root uuid uid=80 | pw usermod -u 80 | Целостность + доступность (предположительно): смещение штатного root с UID 0. Гаджет не выполнял usermod для root. |
set для root uuid name=hax + scope=user | проверка переименования пропускается; auth sync user для нового имени | Целостность (предположительно): переименование системного пользователя, которое должна была предотвратить проверка в 26.7.6. |
Доказано в лаборатории vs предположительно: двухшаговый UID 0, pw useradd -o -u 0, путь к ключам и игнорирование scope=user — это SUCCESS в лаборатории. Принятие живым sshd и usermod/переименование штатного root — предположительно. Гаджет, а не полноценная ВМ OPNsense.
Требуется: сессия WebGUI или локальный API-ключ с page-system-usermanager. CSRF на пути сессии. Не page-all. Стандартный config.xml.sample предоставляет page-all только группе admins.
| Поверхность | Лаборатория |
|---|---|
POST /api/auth/user/* без page-system-usermanager | ACL закрыт |
user-config-readonly | save() всё ещё throwReadOnly() |
| Загрузка CSV | удаляет uid/scope |
| CVE-2026-44194 email-as-shell | mwexecf %s + regex для email |
| Страница пароля | привязана к сессии |
page-all, выполняющий тот же POST | функция changelog на данной фиксации |
| Без аутентификации | закрыто |
Unix su с * в master.passwd | хеш GUI остаётся в config.xml, если только установщик не форсирует |
Без аутентификации — нет. page-all не требуется. 26.7.6 представлял выбор UID для пользователей с системным scope как администраторскую функцию. Несопоставленный проход — это делегированный user-manager без page-all.
cd lab
./run.sh
Loopback 127.0.0.1:18810. Проект Compose opnsense-uidfield-system-uid0. Образ из фиксации 26.7.6. Свидетель OPNSENSE-UIDFIELD-SYSTEM-UID0-WITNESS. Последняя строка:
SUCCESS opnsense-uidfield-system-uid0 two-step-uid=0 scope-user-uid0-ignored=yes pw-o-u0=yes keys=/root/.ssh/authorized_keys OPNSENSE-UIDFIELD-SYSTEM-UID0-WITNESS
Отклонять UID 0 (и конфликтующие служебные UID), если вызывающий не является полным администратором. Применять scope до uid в setNodes или отклонять POST, который меняет оба. Сохранять проверку переименования из 26.7.6 на scope до setNodes, а не на переданном. ea4f01fe позже отменил запись UID-0 в stable/26.7; этот коммит — не данная фиксация.
a842fe48c21288d11a422cb944678e8eb308becfUidField.phpauth.inc local_user_setea4f01fe в stable/26.7