
pfSense CE 2.9.0-DEVELOPMENT - 高 - リモート - RCE - QinQ parent-if ifconfig
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-qinq-parent-if
Class: RCE Reach: Remote
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
QinQ 編集は、does_interface_exist チェックなしで親インターフェース名を保存します。VLAN 編集はすでに、ライブ iface でない親を拒否します。Form_Select は POST を再検証しません。interface_qinq_configure が早期リターンしても、write_config を作成します。その後、メンバーの追加/削除が、保存された vlanif をエスケープされていない ifconfig に補間します。PHP の exec は /bin/sh -c です。WebGUI PHP-FPM は root です。権限は page-interfaces-qinq-edit であり、Diagnostics: Command ではありません。
| ID | CVE 未割当 |
| Class | RCE |
| Reach | Remote (認証済み 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 |
| Product | pfSense CE |
| Affected | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) QinQ 編集 |
| Auth | page-interfaces-qinq-edit を持つ WebGUI セッション |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 のみ |
公開 master 9363ac5 を固定しました。ラボは、固定された vlan_interface / interface_qinq_configure / メンバー exec 行の PHP ガジェットで、127.0.0.1:18810 上のループバック HTTP です。
| Method | Sink | Privilege |
|---|---|---|
| ライブ iface でない親を指定して QinQ 作成を POST し、その後メンバーを追加する編集を POST | interface_qinq2_configure exec ifconfig vlan create ... (interfaces.inc:620) | Integrity (lab-proven): /bin/sh -c 経由の root シェル。ラボ: メンバー追加 qinq2 が witness を書き込みました (member-sink=yes)。 |
同じ保存された vlanif で、メンバーを削除する編集を POST | exec("/sbin/ifconfig {$parent}.{$tag} destroy") (interfaces_qinq_edit.php:212) | Integrity (lab-proven): 同じ root exec。Destroy には IF_NAMESIZE の上限がありません。 |
| 同じ root シェル | ホストファイルシステム | Recon (inferred): config.xml、鍵、他のテナント。このページは exec の出力を表示しません。 |
root シェルまたは壊れた ifconfig | vlan デバイス | Availability (inferred): vlan デバイスの作成/破棄。データプレーンが影響を受けます。 |
Lab-proven vs inferred: VLAN 拒否、作成のみで exec なし、長さ 16 での IF_NAMESIZE ブロック、メンバー追加 qinq2 の witness は lab-proven です。ファイルシステム偵察とデータプレーン妨害は、root PHP-FPM から inferred です。
Requires: page-interfaces-qinq-edit を持つ WebGUI セッション。CSRF トークン。2 回の POST (作成、その後メンバー編集)。デフォルトの admin はこのページを持ちます。制限付きユーザーにはこのページのみを付与できます。
| Surface | Lab |
|---|---|
| VLAN 親存在チェック | vlan-rejected=yes |
| QinQ 作成のみ (親が存在しない) | 設定を保存、create-no-exec=yes |
| qinq2 名の長さ 16 | exec 前に if-namesize-block=yes |
| 未認証 / トークンなしの CSRF | guiconfig + CSRF-magic |
GIF/GRE 名 regex、LAGG メンバー does_interface_exist + escapeshellarg | 他のページ |
| 一度も作成されていない親の QinQ リスト削除 | does_interface_exist($vlanif) |
| Diagnostics: Command | 同時に付与されない限り閉じたまま |
Diagnostics: Command なし。未認証なし。歴史的なクラスは CVE-2023-42326 GIF/GRE で、別のページです。
cd lab
./run.sh
ループバック 127.0.0.1:18810。Compose プロジェクト pfsense-qinq-parent-if。イメージタグ pfsense-qinq-parent-if:2.9.0-dev。Witness PFSENSE-QINQ-PARENT-IF-WITNESS。最終行:
SUCCESS PFSENSE-QINQ-PARENT-IF vlan-rejected=yes create-no-exec=yes member-sink=yes if-namesize-block=yes PFSENSE-QINQ-PARENT-IF-WITNESS
QinQ 編集: VLAN 編集と同様に、ライブインターフェースでない親を拒否します。メンバータグの整数チェックはすでに存在しますが、すべての ifconfig の前に保存された vlanif を escapeshellarg します。メンバー削除の destroy は、interface_qinq2_configure が IF_NAMESIZE を上限とするのと同じ方法で上限を設けます。
9363ac5b8651a1c7a333180425ce7719070f95f9interfaces_qinq_edit.phpinterfaces.inc interface_qinq2_configureinterfaces_vlan_edit.php