
OPNsense 26.7.6 - Alta - Remota - Privilegio residuo - UidField uid 0
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-uidfield-system-uid0
Classe: Privilegio residuo Raggiungibilità: Remota
OPNsense core 26.7.6 (a842fe48) - opnsense.org
page-system-usermanager delegato in due passaggi scope=system poi uid=0. UidField::setValue assegna automaticamente 2000+ solo quando lo scope non è system. setNodes applica uid prima di scope, quindi un singolo add non può impostare 0. Il secondo POST può farlo. auth sync user esegue poi pw useradd -o -u 0 con home /root e gruppo wheel. Le chiavi autorizzate finiscono in /root/.ssh/authorized_keys. Il privilegio è System: Access: Management, non page-all.
| ID | nessuna CVE al momento |
| Classe | Privilegio residuo |
| Raggiungibilità | Remota (WebGUI autenticata / chiave API locale) |
| 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 |
| Prodotto | OPNsense core (Deciso B.V.) |
| Affetto | OPNsense core 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) UidField / user-manager |
| Auth | Sessione WebGUI o chiave API locale con page-system-usermanager |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Ho fissato il tag 26.7.6 "Xenial Xenops". Il lab è un gadget PHP del UidField::setValue fissato più local_user_set, identità di loopback 127.0.0.1:18810. stable/26.7 ha revertito la scrittura UID-0 come ea4f01fe il 2026-10-09. Quel revert non è questo pin. Nessuna GHSA.
| Metodo | Sink | Privilegio |
|---|---|---|
add in due passaggi scope=system poi set uid=0 poi auth sync user | pin UidField::setValue poi stub pw useradd -o -u 0 (auth.inc:345-397) | Integrità (dimostrato in lab): secondo UID Unix 0, home /root, gruppo wheel. Lab: after-add=2000 after-set=0 pw-o-u0=yes. |
| stesso set + authorizedkeys | file_put_contents /root/.ssh/authorized_keys (auth.inc:407-416) | Integrità (dimostrato in lab): witness in /root/.ssh/authorized_keys. |
SSH con quel nome se sshd è attivo (AllowGroups wheel; PermitRootLogin non si applica a un username non-root) | sshd | Recon + integrità (inferito): login con il nuovo nome wheel, lettura di /root. Il gadget non ha avviato sshd. |
stessi POST con scope=user uid=0 | UidField assegna automaticamente 2000+ | Negativo (dimostrato in lab): uid resta 2000. scope-user-uid0-ignored=yes. |
set uuid stock root uid=80 | pw usermod -u 80 | Integrità + disponibilità (inferito): sposta il root stock fuori dall'UID 0. Il gadget non ha eseguito usermod su root. |
set uuid root name=hax + scope=user | controllo di rename saltato; auth sync user sul nuovo nome | Integrità (inferito): rename di utente di sistema che il controllo di 26.7.6 doveva impedire. |
Dimostrato in lab vs inferito: UID 0 in due passaggi, pw useradd -o -u 0, percorso delle chiavi e ignorare scope=user sono SUCCESSO in lab. L'accettazione da parte di sshd live e usermod/rename del root stock sono inferiti. Gadget, non una VM OPNsense completa.
Richiede: sessione WebGUI o chiave API locale con page-system-usermanager. CSRF sul percorso di sessione. Non page-all. Il config.xml.sample predefinito concede page-all solo al gruppo admins.
| Superficie | Lab |
|---|---|
POST /api/auth/user/* senza page-system-usermanager | ACL chiusa |
user-config-readonly | save() esegue comunque throwReadOnly() |
| Upload CSV | rimuove uid/scope |
| CVE-2026-44194 email-as-shell | mwexecf %s + regex email |
| Pagina password | legata alla sessione |
page-all che esegue lo stesso POST | feature del changelog su questo pin |
| Non autenticato | chiuso |
su Unix con * in master.passwd | l'hash della GUI resta in config.xml a meno che l'installer non forzi |
Nessuna via non autenticata. Nessun page-all richiesto. 26.7.6 presentava la scelta dell'UID per utenti con scope system come una feature admin. Il percorso non coperto è un user-manager delegato senza page-all.
cd lab
./run.sh
Loopback 127.0.0.1:18810. Progetto Compose opnsense-uidfield-system-uid0. Immagine dal pin 26.7.6. Witness OPNSENSE-UIDFIELD-SYSTEM-UID0-WITNESS. Ultima riga:
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
Rifiutare UID 0 (e UID di servizio in collisione) a meno che il chiamante non sia un admin completo. Applicare scope prima di uid in setNodes, oppure rifiutare un POST che modifica entrambi. Mantenere il controllo di rename di 26.7.6 sullo scope pre-setNodes, non su quello inviato. ea4f01fe ha poi revertito la scrittura UID-0 su stable/26.7; quel commit non è questo pin.
a842fe48c21288d11a422cb944678e8eb308becfUidField.phpauth.inc local_user_setea4f01fe su stable/26.7