
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 という2段階を実行する。UidField::setValue はスコープが system でない間だけ 2000+ を自動割り当てする。setNodes は scope より先に uid を適用するため、1回の追加では 0 を刻めない。2回目の 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 / ローカル API キー) |
| 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 セッションまたはローカル API キー |
| ライセンス | 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 書き込みを revert した。その revert はこの固定とは異なる。GHSA はない。
| 手法 | シンク | 権限 |
|---|---|---|
2段階追加 scope=system の後に uid=0 を設定し、その後 auth sync user | 固定された UidField::setValue の後にスタブ pw useradd -o -u 0 (auth.inc:345-397) | 完全性 (ラボ実証): 2つ目の Unix UID 0、ホーム /root、グループ wheel。ラボ: after-add=2000 after-set=0 pw-o-u0=yes。 |
| 同じ設定 + authorizedkeys | file_put_contents /root/.ssh/authorized_keys (auth.inc:407-416) | 完全性 (ラボ実証): /root/.ssh/authorized_keys に証跡。 |
sshd が有効ならその名前で SSH (AllowGroups wheel、PermitRootLogin は非 root ユーザー名には適用されない) | sshd | 偵察 + 完全性 (推測): 新しい wheel 名でログインし、/root を読む。ガジェットは sshd を起動しなかった。 |
同じ POST を scope=user uid=0 で実行 | UidField が 2000+ を自動割り当て | 否定 (ラボ実証): uid は 2000 のまま。scope-user-uid0-ignored=yes。 |
既存の root uuid uid=80 を set | pw usermod -u 80 | 完全性 + 可用性 (推測): 既存の root を UID 0 から移動。ガジェットは root を usermod しなかった。 |
root uuid を name=hax + scope=user で set | 名前変更チェックがスキップされ、新しい名前で auth sync user | 完全性 (推測): 26.7.6 のチェックが阻止しようとしていたシステムユーザー名変更。 |
ラボ実証 vs 推測: 2段階 UID 0、pw useradd -o -u 0、keys パス、scope=user 無視はラボ SUCCESS。ライブ sshd の受け入れと既存 root の usermod/名前変更は推測。完全な OPNsense VM ではなくガジェット。
必要条件: page-system-usermanager を持つ WebGUI セッションまたはローカル API キー。セッションパス上の 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 正規表現 |
| パスワードページ | セッションにバインド |
同じ POST を行う page-all | この固定では changelog 機能 |
| 未認証 | クローズ |
master.passwd に * がある Unix su | インストーラが強制しない限り GUI ハッシュは config.xml に留まる |
未認証なし。page-all は不要。26.7.6 はシステムスコープユーザーに選択した UID を提示することを管理者機能として提供していた。一致しないウォークは page-all を持たない委譲された user-manager である。
cd lab
./run.sh
ループバック 127.0.0.1:18810。Compose プロジェクト opnsense-uidfield-system-uid0。イメージは固定 26.7.6 から。証跡 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 の名前変更チェックを、投稿されたスコープではなく setNodes 前 のスコープで維持する。ea4f01fe は後に stable/26.7 で UID-0 書き込みを revert したが、そのコミットはこの固定ではない。
a842fe48c21288d11a422cb944678e8eb308becfUidField.phpauth.inc local_user_setstable/26.7 の ea4f01fe