
pfSense CE 2.9.0-DEVELOPMENT - 高 - リモート - RCE - timezone php.ini prepend
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-timezone-phpini
Class: RCE Reach: Remote
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
system.php は $_POST['timezone'] を system_get_timezone_list() に対する in_array なしで書き込む。is_timezone() は末尾のスラッシュのみを拒否する。system_timezone_configure は /var/db/zoneinfo を書き込む。rc.php_ini_setup は date.timezone="${TIMEZONE}" を php.ini に補間する。引用符と改行により auto_prepend_file が追加される。
| ID | CVE 未割当 |
| Class | RCE |
| Reach | Remote (特記なき限り認証済み WebGUI) |
| CWE | CWE-94 |
| 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) |
| Auth | page-system-generalsetup を持つ WebGUI セッション |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 のみ |
公開 master 9363ac5 を固定した。ラボは固定したシンクの PHP ガジェットで、127.0.0.1:18940 上のループバック HTTP である。
シリーズ解説: https://abraxaslabs.tech/research/pfsense-ce-leftovers
| Method | Sink | Privilege |
|---|---|---|
| POST system.php timezone | rc.php_ini_setup date.timezone="${TIMEZONE}" | Integrity: ラボ実証済み: 生成された php.ini が auto_prepend_file を受け入れ、php -c と php-fpm 相当のスクリプトが prepend を実行し witness を書き込んだ。 |
| 同じ残存箇所 | 同じシンク | Recon: 推測: prepend は php.ini 再構築 / php-fpm 再起動後に root PHP として実行される。 |
| 同じ残存箇所 | 同じシンク | Availability: 推測: 壊れた php.ini は修復されるまで GUI を停止させ得る。 |
必要条件: page-system-generalsetup。特記なき限り POST に CSRF-magic。WebGUI PHP-FPM は root。
必要条件: page-system-generalsetup。特記なき限り POST に CSRF-magic。WebGUI PHP-FPM は root。特記なき限り POST に CSRF-magic。WebGUI PHP-FPM は root。
Form_Select は UI のみ。hostname/domain には独自の文字セットチェックがある。未認証は該当なし。
そのページも許可されていない限り Diagnostics: Command はない。
cd lab
./run.sh
ループバック 127.0.0.1:18940。Compose プロジェクト pfsense-timezone-phpini。Witness PFSENSE-TIMEZONE-PHPINI-WITNESS。ループバックのみ: 127.0.0.1:18940。Compose プロジェクト pfsense-timezone-phpini。Witness PFSENSE-TIMEZONE-PHPINI-WITNESS。固定した行の PHP ガジェット。スタックは実行後に破棄される。
最終行:
SUCCESS PFSENSE-TIMEZONE-PHPINI control-clean=yes trigger-prepend=yes is-timezone-accepts=yes not-allowlisted=yes PFSENSE-TIMEZONE-PHPINI-WITNESS
timezone を system_get_timezone_list() に対して in_array する。rc.php_ini_setup の補間を引用符エスケープする。
9363ac5b8651a1c7a333180425ce7719070f95f9