
OPNsense 26.7.6 - Alta - Remota - Privilégio remanescente - UidField uid 0
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-uidfield-system-uid0
Classe: Privilégio remanescente Alcance: Remoto
OPNsense core 26.7.6 (a842fe48) - opnsense.org
Delegado page-system-usermanager em duas etapas scope=system e depois uid=0. UidField::setValue atribui automaticamente 2000+ apenas enquanto o escopo não for system. setNodes aplica uid antes de scope, então uma adição não consegue marcar 0. O segundo POST consegue. auth sync user então pw useradd -o -u 0 com home /root e grupo wheel. As chaves autorizadas ficam em /root/.ssh/authorized_keys. O privilégio é System: Access: Management, não page-all.
| ID | sem CVE ainda |
| Classe | Privilégio remanescente |
| Alcance | Remoto (WebGUI autenticado / chave da 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 |
| Produto | OPNsense core (Deciso B.V.) |
| Afetado | OPNsense core 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) UidField / user-manager |
| Autenticação | Sessão WebGUI ou chave da API Local com page-system-usermanager |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1 |
Fixe a tag 26.7.6 "Xenial Xenops". O lab é um gadget PHP do UidField::setValue fixado mais local_user_set, identidade loopback 127.0.0.1:18810. stable/26.7 reverteu a escrita de UID-0 como ea4f01fe em 2026-10-09. Essa reversão não é este pin. Sem GHSA.
| Método | Sink | Privilégio |
|---|---|---|
adição em duas etapas scope=system depois definir uid=0 depois auth sync user | fixar UidField::setValue depois stub pw useradd -o -u 0 (auth.inc:345-397) | Integridade (comprovado em lab): segundo UID Unix 0, home /root, grupo wheel. Lab: after-add=2000 after-set=0 pw-o-u0=yes. |
| mesmo set + authorizedkeys | file_put_contents /root/.ssh/authorized_keys (auth.inc:407-416) | Integridade (comprovado em lab): testemunha em /root/.ssh/authorized_keys. |
SSH com esse nome se o sshd estiver ativo (AllowGroups wheel; PermitRootLogin não se aplica a um nome de usuário não-root) | sshd | Recon + integridade (inferido): login com o novo nome wheel, ler /root. O gadget não iniciou o sshd. |
mesmos POSTs com scope=user uid=0 | UidField atribui automaticamente 2000+ | Negativo (comprovado em lab): uid permanece 2000. scope-user-uid0-ignored=yes. |
set uuid do root padrão uid=80 | pw usermod -u 80 | Integridade + disponibilidade (inferido): mover o root padrão para fora do UID 0. O gadget não fez usermod do root. |
set uuid do root name=hax + scope=user | verificação de renomeação ignorada; auth sync user no novo nome | Integridade (inferido): renomeação de usuário de sistema que a verificação do 26.7.6 deveria impedir. |
Comprovado em lab vs inferido: UID 0 em duas etapas, pw useradd -o -u 0, caminho das chaves e ignorar scope=user são SUCCESS no lab. Aceitação do sshd ao vivo e usermod/renomeação do root padrão são inferidos. Gadget, não uma VM OPNsense completa.
Requer: sessão WebGUI ou chave da API Local com page-system-usermanager. CSRF no caminho da sessão. Não page-all. O config.xml.sample padrão só concede page-all ao grupo admins.
| Superfície | Lab |
|---|---|
POST /api/auth/user/* sem page-system-usermanager | ACL fechada |
user-config-readonly | save() ainda throwReadOnly() |
| Upload de CSV | remove uid/scope |
| CVE-2026-44194 email-as-shell | mwexecf %s + regex de email |
| Página de senha | vinculada à sessão |
page-all fazendo o mesmo POST | recurso do changelog neste pin |
| Não autenticado | fechado |
su do Unix com * em master.passwd | hash da GUI permanece em config.xml a menos que o instalador force |
Sem não autenticado. Sem necessidade de page-all. O 26.7.6 apresentava UID escolhido para usuários de escopo system como um recurso de admin. A caminhada sem correspondência é um user-manager delegado sem page-all.
cd lab
./run.sh
Loopback 127.0.0.1:18810. Projeto Compose opnsense-uidfield-system-uid0. Imagem do pin 26.7.6. Testemunha OPNSENSE-UIDFIELD-SYSTEM-UID0-WITNESS. Última linha:
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
Rejeitar UID 0 (e UIDs de serviço em conflito) a menos que o chamador seja um admin completo. Aplicar scope antes de uid em setNodes, ou recusar um POST que altere ambos. Manter a verificação de renomeação do 26.7.6 no escopo pré-setNodes, não no escopo enviado. ea4f01fe depois reverteu a escrita de UID-0 em stable/26.7; esse commit não é este pin.
a842fe48c21288d11a422cb944678e8eb308becfUidField.phpauth.inc local_user_setea4f01fe em stable/26.7