
OPNsense 26.7.6 – Hoch – Remote – Privilegien-Rest – UidField uid 0
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-uidfield-system-uid0
Klasse: Privilegien-Überrest Reichweite: Remote
OPNsense core 26.7.6 (a842fe48) - opnsense.org
Delegiertes page-system-usermanager in zwei Schritten scope=system, dann uid=0. UidField::setValue weist automatisch 2000+ zu, nur solange der Scope nicht system ist. setNodes wendet uid vor scope an, sodass ein einzelnes Hinzufügen keine 0 setzen kann. Der zweite POST kann es. auth sync user führt dann pw useradd -o -u 0 mit Home /root und Gruppe wheel aus. Authorized Keys landen in /root/.ssh/authorized_keys. Das Privileg ist System: Access: Management, nicht page-all.
| ID | noch keine CVE |
| Klasse | Privilegien-Überrest |
| Reichweite | Remote (authentifizierte WebGUI / lokaler API-Schlüssel) |
| CWE | CWE-269 / CWE-284 |
| CVSS | Hoch: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Produkt | OPNsense core (Deciso B.V.) |
| Betroffen | OPNsense core 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) UidField / user-manager |
| Auth | WebGUI-Sitzung oder lokaler API-Schlüssel mit page-system-usermanager |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Ich habe den Tag 26.7.6 "Xenial Xenops" gepinnt. Das Lab ist ein PHP-Gadget des gepinnten UidField::setValue plus local_user_set, Loopback-Identität 127.0.0.1:18810. stable/26.7 hat den UID-0-Schreibvorgang als ea4f01fe am 2026-10-09 zurückgenommen. Dieser Revert ist nicht dieser Pin. Keine GHSA.
| Methode | Sink | Privileg |
|---|---|---|
zweistufiges Hinzufügen scope=system, dann uid=0 setzen, dann auth sync user | Pin UidField::setValue, dann Stub pw useradd -o -u 0 (auth.inc:345-397) | Integrität (im Lab bewiesen): zweite Unix-UID 0, Home /root, Gruppe wheel. Lab: after-add=2000 after-set=0 pw-o-u0=yes. |
| gleiches Set + authorizedkeys | file_put_contents /root/.ssh/authorized_keys (auth.inc:407-416) | Integrität (im Lab bewiesen): Zeuge in /root/.ssh/authorized_keys. |
SSH als dieser Name, falls sshd läuft (AllowGroups wheel; PermitRootLogin gilt nicht für einen Nicht-root-Benutzernamen) | sshd | Recon + Integrität (abgeleitet): Login als der neue wheel-Name, /root lesen. Gadget hat sshd nicht gestartet. |
gleiche POSTs mit scope=user uid=0 | UidField automatische Zuweisung 2000+ | Negativ (im Lab bewiesen): uid bleibt 2000. scope-user-uid0-ignored=yes. |
set der Stock-root-UUID uid=80 | pw usermod -u 80 | Integrität + Verfügbarkeit (abgeleitet): Stock-root von UID 0 wegbewegen. Gadget hat root nicht per usermod geändert. |
set der root-UUID name=hax + scope=user | Umbenennungsprüfung übersprungen; auth sync user auf den neuen Namen | Integrität (abgeleitet): Systembenutzer-Umbenennung, die die 26.7.6-Prüfung verhindern sollte. |
Im Lab bewiesen vs. abgeleitet: zweistufige UID 0, pw useradd -o -u 0, Keys-Pfad und scope=user-Ignorieren sind im Lab SUCCESS. Live-sshd-Akzeptanz und Stock-root-usermod/Umbenennung sind abgeleitet. Gadget, keine vollständige OPNsense-VM.
Erfordert: WebGUI-Sitzung oder lokalen API-Schlüssel mit page-system-usermanager. CSRF auf dem Sitzungspfad. Nicht page-all. Standard-config.xml.sample gewährt page-all nur der Gruppe admins.
| Oberfläche | Lab |
|---|---|
POST /api/auth/user/* ohne page-system-usermanager | ACL geschlossen |
user-config-readonly | save() weiterhin throwReadOnly() |
| CSV-Upload | entfernt uid/scope |
| CVE-2026-44194 email-as-shell | mwexecf %s + E-Mail-Regex |
| Passwortseite | sitzungsgebunden |
page-all mit demselben POST | Changelog-Feature auf diesem Pin |
| Unauth | geschlossen |
Unix su mit * in master.passwd | GUI-Hash bleibt in config.xml, außer der Installer erzwingt es |
Kein Unauth. Kein page-all erforderlich. 26.7.6 präsentierte gewählte UID für System-Scope-Benutzer als Admin-Feature. Der unerreichte Walk ist ein delegierter user-manager ohne page-all.
cd lab
./run.sh
Loopback 127.0.0.1:18810. Compose-Projekt opnsense-uidfield-system-uid0. Image vom Pin 26.7.6. Zeuge OPNSENSE-UIDFIELD-SYSTEM-UID0-WITNESS. Letzte Zeile:
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 (und kollidierende Service-UIDs) ablehnen, es sei denn, der Aufrufer ist ein vollständiger Admin. scope vor uid in setNodes anwenden oder einen POST ablehnen, der beides umschaltet. Die 26.7.6-Umbenennungsprüfung auf dem Pre-setNodes-Scope belassen, nicht auf dem geposteten. ea4f01fe hat später den UID-0-Schreibvorgang auf stable/26.7 zurückgenommen; dieser Commit ist nicht dieser Pin.
a842fe48c21288d11a422cb944678e8eb308becfUidField.phpauth.inc local_user_setea4f01fe auf stable/26.7