
OPNsense 26.7.6 - 높음 - 원격 - 권한 잔여 - UidField uid 0
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-uidfield-system-uid0
분류: 권한 잔존 도달 범위: 원격
OPNsense core 26.7.6 (a842fe48) - opnsense.org
위임된 page-system-usermanager가 scope=system을 먼저, 그다음 uid=0을 두 단계로 처리합니다. UidField::setValue는 scope가 system이 아닐 때만 2000+를 자동 할당합니다. setNodes는 scope보다 uid를 먼저 적용하므로 한 번의 add로는 0을 찍을 수 없습니다. 두 번째 POST는 가능합니다. 그다음 auth sync user가 홈 /root, 그룹 wheel로 pw useradd -o -u 0을 실행합니다. authorized keys는 /root/.ssh/authorized_keys에 들어갑니다. 권한은 System: Access: Management이며, page-all이 아닙니다.
| ID | 아직 CVE 없음 |
| 분류 | 권한 잔존 |
| 도달 범위 | 원격 (인증된 WebGUI / Local API key) |
| CWE | CWE-269 / CWE-284 |
| CVSS | High: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 제품 | OPNsense core (Deciso B.V.) |
| 영향받음 | OPNsense core 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) UidField / user-manager |
| 인증 | page-system-usermanager가 있는 WebGUI 세션 또는 Local API key |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용 |
저는 태그 26.7.6 "Xenial Xenops"를 고정했습니다. 랩은 고정된 UidField::setValue와 local_user_set의 PHP 가젯이며, 루프백 아이덴티티는 127.0.0.1:18810입니다. stable/26.7은 2026-10-09에 ea4f01fe로 UID-0 쓰기를 되돌렸습니다. 그 되돌림은 이 핀이 아닙니다. GHSA는 없습니다.
| 방법 | 싱크 | 권한 |
|---|---|---|
두 단계 add scope=system 후 uid=0 설정 후 auth sync user | 핀 UidField::setValue 후 스텁 pw useradd -o -u 0 (auth.inc:345-397) | 무결성 (랩 입증): 두 번째 Unix UID 0, 홈 /root, 그룹 wheel. 랩: after-add=2000 after-set=0 pw-o-u0=yes. |
| 동일한 set + authorizedkeys | file_put_contents /root/.ssh/authorized_keys (auth.inc:407-416) | 무결성 (랩 입증): /root/.ssh/authorized_keys에 witness. |
sshd가 켜져 있다면 해당 이름으로 SSH (AllowGroups wheel; PermitRootLogin은 비-root 사용자 이름에는 적용되지 않음) | sshd | 정찰 + 무결성 (추정): 새 wheel 이름으로 로그인, /root 읽기. 가젯은 sshd를 시작하지 않았음. |
동일한 POST를 scope=user uid=0으로 | UidField가 2000+ 자동 할당 | 부정 (랩 입증): uid는 2000으로 유지. scope-user-uid0-ignored=yes. |
set 기본 root uuid uid=80 | pw usermod -u 80 | 무결성 + 가용성 (추정): 기본 root를 UID 0에서 이동. 가젯은 root를 usermod하지 않았음. |
set root uuid name=hax + scope=user | 이름 변경 검사 건너뜀; 새 이름에 auth sync user | 무결성 (추정): 26.7.6 검사가 막으려던 시스템 사용자 이름 변경. |
랩 입증 vs 추정: 두 단계 UID 0, pw useradd -o -u 0, keys 경로, scope=user 무시는 랩 SUCCESS입니다. 라이브 sshd 수락과 기본 root usermod/rename은 추정입니다. 전체 OPNsense VM이 아닌 가젯입니다.
요구 사항: page-system-usermanager가 있는 WebGUI 세션 또는 Local API key. 세션 경로에서는 CSRF. page-all이 아닙니다. 기본 config.xml.sample은 그룹 admins에만 page-all을 부여합니다.
| 표면 | 랩 |
|---|---|
page-system-usermanager 없는 POST /api/auth/user/* | ACL 닫힘 |
user-config-readonly | save()는 여전히 throwReadOnly() |
| CSV 업로드 | uid/scope 제거 |
| CVE-2026-44194 email-as-shell | mwexecf %s + email regex |
| 비밀번호 페이지 | 세션 바인딩 |
동일한 POST를 하는 page-all | 이 핀의 변경 로그 기능 |
| 비인증 | 닫힘 |
master.passwd에 *가 있는 Unix su | 설치 프로그램이 강제하지 않는 한 GUI 해시는 config.xml에 유지 |
비인증 없음. page-all 필요 없음. 26.7.6은 system-scope 사용자에 대해 선택된 UID를 관리자 기능으로 제시했습니다. 일치하지 않는 경로는 page-all 없는 위임된 user-manager입니다.
cd lab
./run.sh
루프백 127.0.0.1:18810. Compose 프로젝트 opnsense-uidfield-system-uid0. 핀 26.7.6의 이미지. Witness OPNSENSE-UIDFIELD-SYSTEM-UID0-WITNESS. 마지막 줄:
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(및 충돌하는 서비스 UID)을 거부하십시오. setNodes에서 uid보다 scope를 먼저 적용하거나, 둘 다 뒤집는 POST를 거부하십시오. 26.7.6 이름 변경 검사를 게시된 scope가 아닌 setNodes 이전 scope에 유지하십시오. ea4f01fe는 나중에 stable/26.7에서 UID-0 쓰기를 되돌렸습니다; 그 커밋은 이 핀이 아닙니다.
a842fe48c21288d11a422cb944678e8eb308becfUidField.phpauth.inc local_user_setstable/26.7의 ea4f01fe