
pfSense CE 2.9.0-DEVELOPMENT - 高 - リモート - RCE - limiter number dnctl
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-limiter-number
Class: RCE Reach: Remote
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
Traffic Shaper Limiters は編集時に隠しフィールド number を出力する。Create はその番号を dnpipe_find_nextnumber() で上書きする。Edit は上書きしない。validate_input は number を一切チェックしない。GetNumber() は引用符なしで dnctl pipe|sched|queue delete に連結される。PHP の mwexec は /bin/sh -c である。権限は page-firewall-trafficshaper-limiter であり、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) limiter number |
| Auth | page-firewall-trafficshaper-limiter を持つ WebGUI セッション |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 のみ |
公開 master 9363ac5 を固定した。ラボは固定された ReadConfig / SetNumber / delete_queue の PHP ガジェットである。ループバック 127.0.0.1:18840。
| Method | Sink | Privilege |
|---|---|---|
limiter を作成し、攻撃者の number を付けて save を POST し、その limiter を削除する | mwexec("/sbin/dnctl pipe delete " . $this->GetNumber()) (shaper.inc:3820) | Integrity (ラボ実証済み): root シェル。ラボ: edit-delete が witness を書き込んだ (edit-delete-exec=yes)。Create の上書きと apply-file 経路は何も書き込まなかった。 |
| 同じ root シェル | ホストファイルシステム | Recon (推測): config.xml、鍵。 |
root シェル、または攻撃者の番号による dnctl | dummynet | Availability (推測): limiter / dummynet の妨害。 |
ラボ実証済み vs 推測: create の上書き (witness なし)、apply-file 経路 (ファイルに対する dnctl、witness なし)、edit-delete exec (witness あり) はラボ実証済みである。ファイルシステム偵察は root PHP-FPM からの推測である。
必要条件: page-firewall-trafficshaper-limiter を持つ WebGUI セッション。POST save に対する CSRF。Delete は GET action=delete。
| Surface | Lab |
|---|---|
| Create 経路 | dnpipe_find_nextnumber() が上書き、create-overwrites=yes |
| Apply 経路 | /tmp/rules.limiter に対する dnctl、ファイル名はユーザー制御不可、apply-file=yes |
| Limiter 名の文字集合 | ^[a-zA-Z0-9_-]+$ |
| 未認証 | 閉じている |
| Diagnostics: Command | 別途付与されない限り閉じたまま |
/tmp/rules.limiter への AQM パラメータは追加の dummynet 言語であり、この残存物ではない。
cd lab
./run.sh
ループバック 127.0.0.1:18840。Compose プロジェクト pfsense-limiter-number。イメージタグ pfsense-limiter-number:2.9.0-dev。Witness PFSENSE-LIMITER-NUMBER-WITNESS。最終行:
SUCCESS PFSENSE-LIMITER-NUMBER create-overwrites=yes apply-file=yes edit-delete-exec=yes PFSENSE-LIMITER-NUMBER-WITNESS
すべての dnctl の前に GetNumber() を int キャストする。編集時の POST number を無視するか、稼働中の dummynet id に対して範囲チェックする。Create はすでに上書きしている。Edit も同じようにする。
9363ac5b8651a1c7a333180425ce7719070f95f9shaper.inc delete_queue / GetNumberfirewall_shaper_vinterface.php