
OPNsense 26.7.6 - 高 - リモート - 権限の残存 - 工場出荷時ロックアウト IP
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-lockout-factory-ip
クラス: 権限の残存 到達範囲: リモート
OPNsense core 26.7.6 (a842fe48) - opnsense.org
未認証の WebGUI ログインが、ソケット IP を持たないファクトリの LOG_AUTH 行から lockout_handler を依然として駆動する。GHSA-2v2x は CRLF 分割を塞ぎ、ロックアウト IP の選択を 最後 のトークンに切り替えたため、authgui.inc の末尾の from REMOTE_ADDR が優先される。AuthenticationFactory::authenticate() は依然として生のユーザー名をアドレス接尾辞なしで syslog() に出力する。ロックアウトの False フレーズと IPv4 トークンに一致するユーザー名が、その行の最後の(唯一の)アドレスとなる。デフォルトの 5 回の間隔を空けた試行後: pfctl -t sshlockout -T add および pfctl -k。デフォルト: ロックアウト有効、LAN GUI。
| ID | CVE 未割当 |
| クラス | 権限の残存 |
| 到達範囲 | リモート(未認証の WebGUI ログイン POST) |
| CWE | CWE-117 / CWE-863 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| 製品 | OPNsense core (Deciso B.V.) |
| 影響を受けるバージョン | OPNsense core 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) AuthenticationFactory / lockout_handler |
| 認証 | 未認証。GET / から取得した CSRF クッキー + トークン。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
タグ 26.7.6 を固定した。ラボは固定された lockout_handler に加え、PATH スタブの pfctl、ループバック識別子 127.0.0.1:18800 で構成される。これは CRLF ではない。1 つの PHP syslog レコードは 1 つのハンドラ行のままである。Last-IP は authgui テンプレートにとっては正しいハードニングであり、ファクトリテンプレートにとっては誤ったハードニングであった。
| 手法 | シンク | 権限 |
|---|---|---|
未認証のファクトリ LOG_AUTH ユーザー名にロックアウト False フレーズと IPv4 トークン(6 行の間隔を空けた行) | lockout_handler を固定 -> スタブ pfctl -t sshlockout -T add および pfctl -k | 完全性(ラボ実証済み): テーブル sshlockout とステートキル argv。ラボ: planted=203.0.113.77。 |
| 同じ plant、ライブ pf | filter.lib.inc:293-314 from <sshlockout> to (self) ポート 22/GUI | 可用性(推測): plant されたホストからの新規 TCP 22/GUI をドロップ; pfctl -k はその IP からの既存ステートを切断する。 |
| 同じユーザー名で IPv4 のみ(False フレーズなし) | lockout_handler | ネガティブ(ラボ実証済み): テーブル追加なし。negative-ip-only=no。 |
末尾に from REMOTE_ADDR を持つ authgui 行 | last-IP パーサー | 自身の IP の完全性(ラボ実証済み): authgui の最後のトークンは 198.51.100.10 のまま。 |
| 失敗ログインのレスポンスボディ | なし | 偵察(ラボ実証済みでクローズ): 既存の「Wrong username or password.」。ユーザー列挙なし。 |
ラボ実証済み vs 推測: ファクトリ plant、ユーザー名のみのネガティブ、authgui last-IP はラボ SUCCESS。ライブ pf ブロッキングとライブセッションキルは推測。固定された lockout_handler は変更なしでコピー; syslog-ng と WebGUI POST はスタブ化。
必要条件: 未認証の WebGUI ログイン POST。GET / から取得した CSRF クッキー + トークン。ロックアウト有効(system.no_sshlockout 未設定)。デフォルトインストール。
| 面 | ラボ |
|---|---|
未認証セッション / root / config.xml 書き込み | クローズ |
| 外部 IP を plant する authgui 行 | 最後のトークンは REMOTE_ADDR(authgui-last-ip=198.51.100.10) |
CRLF による余分な readline() | GHSA-2v2x の書き換え; 1 レコードは 1 行のまま |
| 空パスワードログイン | authgui.inc は非空パスワードを要求 |
| authgui 行での CVE-2026-44195 成功キーワードリセット | 失敗ルールが先 |
26.7.6 Omar Habra pfctl -k str(ip) TypeError | すでにこのピンに存在 |
| plant された IP を DNS/ゲートウェイ宛先とする | ルールは from <sshlockout> to (self) ポート 22/GUI のみ |
ログインスキップなし。RCE なし。config.xml の書き換えなし。セッションを生成しない。
cd lab
./run.sh
ループバック 127.0.0.1:18800。Compose プロジェクト opnsense-lockout-factory-ip。イメージタグ opnsense-lockout-factory-ip:26.7.6。ウィットネス OPNSENSE-LOCKOUT-FACTORY-IP-WITNESS。最終行:
SUCCESS opnsense-lockout-factory-ip planted=203.0.113.77 table=sshlockout negative-ip-only=no authgui-last-ip=198.51.100.10 OPNSENSE-LOCKOUT-FACTORY-IP-WITNESS
ファクトリの syslog(LOG_AUTH) テンプレートにソケット IP を追加し、authgui.inc と同じ末尾の from REMOTE_ADDR とする。あるいは、ハンドラ自身のピアから来ていないロックアウト IP を無視する。last-token を「クライアントアドレス」の代替として扱わないこと。
a842fe48c21288d11a422cb944678e8eb308becfAuthenticationFactory.phplockout_handler