
OPNsense 26.7.6 - Alta - Remota - Privilegio residual - UidField uid 0
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-uidfield-system-uid0
Clase: Privilegio residual Alcance: Remoto
OPNsense core 26.7.6 (a842fe48) - opnsense.org
Delegado page-system-usermanager en dos pasos scope=system y luego uid=0. UidField::setValue autoasigna 2000+ solo mientras el scope no es system. setNodes aplica uid antes que scope, por lo que un solo add no puede estampar 0. El segundo POST sí puede. auth sync user luego pw useradd -o -u 0 con home /root y grupo wheel. Las claves autorizadas terminan en /root/.ssh/authorized_keys. El privilegio es System: Access: Management, no page-all.
| ID | sin CVE aún |
| Clase | Privilegio residual |
| Alcance | Remoto (WebGUI autenticada / clave de API local) |
| CWE | CWE-269 / CWE-284 |
| CVSS | Alto: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Producto | OPNsense core (Deciso B.V.) |
| Afectado | OPNsense core 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) UidField / user-manager |
| Autenticación | Sesión WebGUI o clave de API local con page-system-usermanager |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1 |
Fijé el tag 26.7.6 "Xenial Xenops". El laboratorio es un gadget PHP del UidField::setValue fijado más local_user_set, identidad de loopback 127.0.0.1:18810. stable/26.7 revirtió la escritura de UID-0 como ea4f01fe el 2026-10-09. Esa reversión no es este pin. Sin GHSA.
| Método | Sink | Privilegio |
|---|---|---|
add en dos pasos scope=system luego set uid=0 luego auth sync user | pin UidField::setValue luego stub pw useradd -o -u 0 (auth.inc:345-397) | Integridad (probado en laboratorio): segundo UID 0 de Unix, home /root, grupo wheel. Laboratorio: after-add=2000 after-set=0 pw-o-u0=yes. |
| mismo set + authorizedkeys | file_put_contents /root/.ssh/authorized_keys (auth.inc:407-416) | Integridad (probado en laboratorio): testigo en /root/.ssh/authorized_keys. |
SSH como ese nombre si sshd está activo (AllowGroups wheel; PermitRootLogin no aplica a un nombre de usuario no root) | sshd | Reconocimiento + integridad (inferido): login como el nuevo nombre wheel, leer /root. El gadget no inició sshd. |
mismos POSTs con scope=user uid=0 | autoasignación 2000+ de UidField | Negativo (probado en laboratorio): el uid permanece en 2000. scope-user-uid0-ignored=yes. |
set uuid stock de root uid=80 | pw usermod -u 80 | Integridad + disponibilidad (inferido): mover el root stock fuera del UID 0. El gadget no hizo usermod de root. |
set uuid de root name=hax + scope=user | chequeo de renombrado omitido; auth sync user sobre el nuevo nombre | Integridad (inferido): renombrado de usuario de sistema que el chequeo de 26.7.6 debía detener. |
Probado en laboratorio vs inferido: UID 0 en dos pasos, pw useradd -o -u 0, ruta de claves, e ignorar scope=user son ÉXITO en laboratorio. La aceptación de sshd en vivo y el usermod/renombrado del root stock son inferidos. Gadget, no una VM OPNsense completa.
Requiere: sesión WebGUI o clave de API local con page-system-usermanager. CSRF en la ruta de sesión. No page-all. El config.xml.sample por defecto solo otorga page-all al grupo admins.
| Superficie | Laboratorio |
|---|---|
POST /api/auth/user/* sin page-system-usermanager | ACL cerrada |
user-config-readonly | save() sigue con throwReadOnly() |
| Carga de CSV | elimina uid/scope |
| CVE-2026-44194 email-as-shell | mwexecf %s + regex de email |
| Página de contraseña | ligada a sesión |
page-all haciendo el mismo POST | funcionalidad del changelog en este pin |
| Sin autenticación | cerrado |
su de Unix con * en master.passwd | el hash de la GUI permanece en config.xml salvo que el instalador fuerce |
Sin no autenticado. No se requiere page-all. 26.7.6 presentaba el UID elegido para usuarios de scope system como una funcionalidad de admin. El recorrido no coincidente es un user-manager delegado sin page-all.
cd lab
./run.sh
Loopback 127.0.0.1:18810. Proyecto Compose opnsense-uidfield-system-uid0. Imagen del pin 26.7.6. Testigo OPNSENSE-UIDFIELD-SYSTEM-UID0-WITNESS. Última línea:
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
Rechazar UID 0 (y UIDs de servicio en colisión) a menos que el llamador sea un admin completo. Aplicar scope antes que uid en setNodes, o rechazar un POST que cambie ambos. Mantener el chequeo de renombrado de 26.7.6 sobre el scope pre-setNodes, no el enviado. ea4f01fe luego revirtió la escritura de UID-0 en stable/26.7; ese commit no es este pin.
a842fe48c21288d11a422cb944678e8eb308becfUidField.phpauth.inc local_user_setea4f01fe en stable/26.7