Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacy© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
opnsense-uidfield-system-uid0 — OPNsense 26.7.6 - High - Remote - Privilege leftover - UidField uid 0 | Kitploit
Tools/GitHubGitHub/abraxas/opnsense-uidfield-system-uid0
Authentication & AuthorizationPrivilege EscalationVulnerability AnalysisExploitationSecurity VirtualizationWeb SecurityPenetration TestingLabs & Practice

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share
GitHubabraxas/opnsense-uidfield-system-uid0

opnsense-uidfield-system-uid0

OPNsense 26.7.6 - High - Remote - Privilege leftover - UidField uid 0

View Repository
2 days agoNot yet reviewed

Abraxas Labs - opnsense-uidfield-system-uid0

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  opnsense-uidfield-system-uid0

opnsense-uidfield-system-uid0

Class: Privilege leftover Reach: Remote

OPNsense core 26.7.6 (a842fe48) - opnsense.org

Delegated page-system-usermanager two-steps scope=system then uid=0. UidField::setValue auto-assigns 2000+ only while scope is not system. setNodes applies uid before scope, so one add cannot stamp 0. The second POST can. auth sync user then pw useradd -o -u 0 with home /root and group wheel. Authorized keys land in /root/.ssh/authorized_keys. Privilege is System: Access: Management, not page-all.

IDno CVE yet
ClassPrivilege leftover
ReachRemote (authenticated WebGUI / Local API key)
CWECWE-269 / CWE-284
CVSSHigh: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
ProductOPNsense core (Deciso B.V.)
AffectedOPNsense core 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) UidField / user-manager
AuthWebGUI session or Local API key with page-system-usermanager
LicenseGNU Affero GPL v3.0
Lab127.0.0.1 only

I pinned tag 26.7.6 "Xenial Xenops". The lab is a PHP gadget of the pinned UidField::setValue plus local_user_set, loopback identity 127.0.0.1:18810. stable/26.7 reverted the UID-0 write as ea4f01fe on 2026-10-09. That revert is not this pin. No GHSA.

What an attacker can do

MethodSinkPrivilege
two-step add scope=system then set uid=0 then auth sync userpin UidField::setValue then stub pw useradd -o -u 0 (auth.inc:345-397)Integrity (lab-proven): second Unix UID 0, home /root, group wheel. Lab: after-add=2000 after-set=0 pw-o-u0=yes.
same set + authorizedkeysfile_put_contents /root/.ssh/authorized_keys (auth.inc:407-416)Integrity (lab-proven): witness in /root/.ssh/authorized_keys.
SSH as that name if sshd is on (AllowGroups wheel; PermitRootLogin does not apply to a non-root username)sshdRecon + integrity (inferred): login as the new wheel name, read /root. Gadget did not start sshd.
same POSTs with scope=user uid=0UidField auto-assign 2000+Negative (lab-proven): uid stays 2000. scope-user-uid0-ignored=yes.
set stock root uuid uid=80pw usermod -u 80Integrity + availability (inferred): move stock root off UID 0. Gadget did not usermod root.
set root uuid name=hax + scope=userrename check skipped; auth sync user on the new nameIntegrity (inferred): system user rename the 26.7.6 check was meant to stop.

Lab-proven vs inferred: two-step UID 0, pw useradd -o -u 0, keys path, and scope=user ignore are lab SUCCESS. Live sshd accept and stock-root usermod/rename are inferred. Gadget, not a full OPNsense VM.

Requires: WebGUI session or Local API key with page-system-usermanager. CSRF on the session path. Not page-all. Default config.xml.sample only grants page-all to group admins.

Adjacent surface that stays closed

SurfaceLab
POST /api/auth/user/* without page-system-usermanagerACL closed
user-config-readonlysave() still throwReadOnly()
CSV uploadstrips uid/scope
CVE-2026-44194 email-as-shellmwexecf %s + email regex
Password pagesession-bound
page-all doing the same POSTchangelog feature on this pin
Unauthclosed
Unix su with * in master.passwdGUI hash stays in config.xml unless installer force

No unauth. No page-all required. 26.7.6 presented chosen UID for system-scope users as an admin feature. The unmatched walk is a delegated user-manager without page-all.

Lab

cd lab
./run.sh

Loopback 127.0.0.1:18810. Compose project opnsense-uidfield-system-uid0. Image from pin 26.7.6. Witness OPNSENSE-UIDFIELD-SYSTEM-UID0-WITNESS. Last line:

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

The fix

Reject UID 0 (and colliding service UIDs) unless the caller is a full admin. Apply scope before uid in setNodes, or refuse a POST that flips both. Keep the 26.7.6 rename check on the pre-setNodes scope, not the posted one. ea4f01fe later reverted the UID-0 write on stable/26.7; that commit is not this pin.

References

  • github.com/opnsense/core a842fe48c21288d11a422cb944678e8eb308becf
  • UidField.php
  • auth.inc local_user_set
  • Named page (not this leftover): CVE-2026-44194 / GHSA-f59w email-as-shell
  • Later revert (not this pin): ea4f01fe on stable/26.7
  • CWE-269 / CWE-284
Download Tool