
pfSense CE 2.9.0-DEVELOPMENT - 高 - リモート - RCE - CARP VHID の残存
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-carp-vhid
解説記事: https://abraxaslabs.tech/research/pfsense-carp-vhid
クラス: RCE 到達範囲: リモート
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
仮想 IP の編集では、POST から受け取った CARP VHID を 1〜255 の範囲チェックなしで保存します。Form_Select の選択肢は HTML 上の制約にすぎません。CARP の適用処理では VHID を escapeshellarg で処理します。一方、スタックされた IP エイリアスの適用処理では vhid {$carpvip['vhid']} を escapeshellarg の外側で補間します。CARP ステータスでは、同じ保存済み VHID をダブルクォートで囲んだ grep パイプラインに補間します。セミコロンはクォートされたままですが、コマンド置換は /bin/sh -c 配下で依然として実行されます。必要な権限は VIP の編集と適用であり、Diagnostics: Command ではありません。
| ID | CVE 未割当 |
| クラス | RCE |
| 到達範囲 | リモート(認証済み WebGUI) |
| CWE | CWE-78 |
| CVSS | High: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 製品 | pfSense CE |
| 影響を受けるバージョン | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) CARP VHID |
| 認証 | VIP の編集と適用が可能な WebGUI セッション(ステータス/ウィジェットは後段のトリガー) |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
公開 master の 9363ac5 を固定して検証しました。ラボは、固定した interface_carp_configure、スタックされた ipalias の mwexec、ステータスの exec を組み合わせた PHP ガジェットです。ループバック 127.0.0.1:18830 を使用します。
| 手法 | シンク | 権限 |
|---|---|---|
整数でない VHID を持つ carp VIP を POST し、その _vip{uniqid} 親に対してスタックされた IP エイリアスを適用する | mwexec ifconfig ... alias {$gateway} {$vhid} (interfaces.inc:3238) | 完全性(ラボで実証): root シェル。ラボでは ipalias-unescaped が証跡を書き込みました。同じ VHID の CARP 適用では何も書き込まれませんでした(carp-escaped=yes)。 |
同じ保存済み VHID を使用し、status_carp.php を GET するか carp_status.widget.php をレンダリングする | exec grep パイプライン (pfsense-utils.inc:794) | 完全性(ラボで実証): ダブルクォート内のコマンド置換が実行され、証跡を書き込みました(status-sink=yes、status-subst=yes)。セミコロンはクォートされたままでした。ウィジェットのトリガーは別の GUI セッションでも可能です。 |
| 同じ root シェル | ホストのファイルシステム | 偵察(推定): config.xml、鍵。 |
root シェル、または壊れた ifconfig | CARP / エイリアスデバイス | 可用性(推定): インターフェース / CARP / フィルタの妨害。 |
ラボで実証済み vs 推定: carp-escaped、ipalias-unescaped の証跡、ステータスのコマンド置換の証跡はラボで実証済みです。ファイルシステムの偵察とフィルタの妨害は、root 権限の PHP-FPM から推定したものです。
必要な権限: page-firewall-virtualipaddress-edit(保存)と page-firewall-virtualipaddresses(適用)。ステータスシンク: page-status-carp、または CARP ウィジェットを含む任意のダッシュボード。POST に対する CSRF。
| 領域 | ラボ |
|---|---|
| CARP 適用そのもの | VHID に対する escapeshellarg、carp-escaped=yes |
| CARP パスワード / advbase / advskew / サブネット | is_ipaddr / エスケープ済み |
| 未認証 | 閉じている |
| HA 認証情報なしでの同一オブジェクトの xmlrpc 適用 | SA-26_22 スキップリスト |
| Diagnostics: Command | 別途付与されない限り閉じたまま |
cd lab
./run.sh
ループバック 127.0.0.1:18830。Compose プロジェクト pfsense-carp-vhid。イメージタグ pfsense-carp-vhid:2.9.0-dev。ウィットネス PFSENSE-CARP-VHID-WITNESS。最終行:
SUCCESS PFSENSE-CARP-VHID carp-escaped=yes ipalias-unescaped=yes status-sink=yes PFSENSE-CARP-VHID-WITNESS
保存時に VHID を 1〜255 の整数範囲に制限する。スタックされた IP Alias の適用時とステータス grep 時に、CARP の適用がすでに行っているのと同じ方法で VHID を escapeshellarg する。
9363ac5b8651a1c7a333180425ce7719070f95f9firewall_virtual_ip.inc saveVIPinterfaces.inc スタックされた ipalias の mwexecpfsense-utils.inc CARP ステータス grep