
OPNsense 26.7.6 - 高 - リモート - 設定行インジェクション - tunables ローダー
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-tunables-loader
解説記事: https://abraxaslabs.tech/research/opnsense-tunables-loader
分類: 設定行インジェクション 到達範囲: リモート
OPNsense コア 26.7.6 (a842fe48) - opnsense.org
System: Advanced: Tunables は依然として name/value を /boot/loader.conf に補間します。GHSA-fq94 の残存する類似箇所です。Tunables.xml の tunable / value は素の TextField(改行許可)です。system_login_configure() は {$param}="{$value}" を書き込みます。Tunables の再設定は login も再起動します。ライブの sysctl(8) は shell_safe と OID フィルタを経由するため、この経路はシェルインジェクションではありません。残存する問題は、次回起動時に追加のローダーディレクティブが挿入されることです。必要な権限は page-system-advanced-sysctl であり、page-all ではありません。
この GitHub パックは調整済み開示まで非公開のままです。
| ID | CVE 未割当 |
| 分類 | 設定行インジェクション |
| 到達範囲 | リモート(認証済み WebGUI / API) |
| CWE | CWE-93 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 製品 | OPNsense core |
| 影響対象 | 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) System: Advanced: Tunables |
| 認証 | page-system-advanced-sysctl を持つ WebGUI セッションまたは API キー |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | compose exec gadget (hunt slot 18850) |
タグ 26.7.6 の peel a842fe48 を固定しました。ラボは固定した system_login_configure() の補間を再現する PHP ガジェットです。Compose プロジェクトは opnsense-tunables-loader です。18800-18860 ガジェットファミリー内の hunt slot 18850 を使用しており、この compose ファイルは公開 HTTP バインドではなく docker compose exec php を使用します。
| 手法 | シンク | 権限 |
|---|---|---|
Tunables 値の CR/LF (hw.usb.no_boot_wait に "\n# witness を付加) | /boot/loader.conf 内で system_login_configure() の追加行を固定 | 完全性(ラボ実証済み): 閉じた代入の後に、独立した行として追加の # OPNSENSE-TUNABLES-LOADER-WITNESS が挿入される。ラボ: newline-extra-line=yes。 |
クリーンな値 1 | 同じ書き込み処理 | ネガティブ(ラボ実証済み): 単一の代入行のみで、witness はなし。ラボ: clean-value-single-line=yes。 |
| 次回起動時に同じ追加ローダー行 | ローダーの init_path / module_path / *_load / vfs.root.mountfrom / コンソール | 完全性(推測): 次回起動時のローダーが攻撃者のキーを尊重する。このガジェットでは再起動は未実施。 |
不正なローダー行 / 誤った vfs.root.mountfrom | /boot/loader.conf | 可用性(推測): 起動失敗または誤ったルート。 |
POST /api/core/tunables/searchItem | tunables API | 偵察(推測): tunables の一覧取得(現在値/デフォルト値/型を含む)。この ACL 向けに意図された動作。 |
有効な OID に対するライブの sysctl -w | set_sysctl + OID フィルタ | ページ本来の機能。追加のローダー行が残存する問題。 |
ラボ実証済み vs 推測: 改行による追加ローダー行とクリーンな値での単一行はラボで SUCCESS。次回起動時のローダー適用は推測です。ガジェットであり、完全な OPNsense FreeBSD VM ではありません。
必要条件: サインイン済みユーザー、またはそのユーザーの Local API キーが page-system-advanced-sysctl を持ち、page-all を持たないこと。POST /api/core/tunables/*。セッション POST では CSRF。再設定は login を再起動し、rc.reload_all と起動時にも system_login_configure が呼び出されます。
| サーフェス | ラボ |
|---|---|
| ライブ sysctl シェルインジェクション | shell_safe と OID フィルター |
| クリーンな値 | 単一の代入行 |
| 未認証 | 401 |
page-system-advanced-sysctl を持たないユーザー | 403 |
user-config-readonly | save() が例外をスロー |
実際の OID を設定する page-all チューナブル管理者 | 意図どおり |
| GHSA-fq94 でパッチ済みの GUI テキストフィールド | 異なるシンク。このフィールドは対象外 |
未認証なし。ライブ sysctl シェルなし。Diagnostics: Command なし。
cd lab
./run.sh
Compose プロジェクト opnsense-tunables-loader。Witness OPNSENSE-TUNABLES-LOADER-WITNESS。最終行:
SUCCESS opnsense-tunables-loader newline-extra-line=yes clean-value-single-line=yes OPNSENSE-TUNABLES-LOADER-WITNESS
ルートランチャー: python3 opnsense-tunables-loader-Abraxas-Labs.py。
tunables の名前と値から CR/LF および " を除去する。GHSA-fq94 と同じ分類である。名前は裸の TextField ではなく OID マスクとして型付けする。代入を閉じることができないヘルパーでクォートする。既知のローダーキーでない限り、tunable を /boot/loader.conf に書き込まない。
a842fe48c21288d11a422cb944678e8eb308becfsystem.inc system_login_configure の loader.conf 補間Tunables.xml 裸の TextField の name/value