
pfSense Plus MIM API toolkit b4acd7ca - 高 - リモート - IDOR - ACB userkey capability URL
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-acb-userkey
クラス: IDOR 到達範囲: リモート
pfSense Plus MIM API (Netgate/pfsense-api b4acd7ca) - Netgate
GET /services/acb と GET /services/acb/bkp は userkey を制約のないクエリパラメータとして受け取ります。生成された Python クライアントはそのキーをクエリ文字列に配置します。YAML には securitySchemes がありません。Auto Config Backup デバイスキーの所持がチェックです。これはケイパビリティ URL です。
盗まれた、または漏洩した ACB userkey は、そのデバイスのホストされたバックアップを一覧表示し、リビジョン本体を取得します。完全な設定がそれらのブロブの中に存在します。 キーが漏洩した場合、CE ACB キー CVE-2024-57273 / SA-25_03 と同じクラスです。その CVE は SSH バナー導出でした。この残存物は Plus MIM API のクエリパラメータ版の兄弟です。私はバナー導出を再申請しません。
これは pfSense Plus Nexus Multi-instance Management (:8443 上のコントローラ) の公開 OpenAPI + 生成クライアントです。これは CE REST パッケージ (jaredhendrickson/pfsense-api / pfrest.org) ではありません。サーバーは Plus 専用 (有償) です。私は pfSense Plus を実行していません。
| ID | CVE はまだなし |
| クラス | IDOR (ケイパビリティ URL) |
| 到達範囲 | リモート |
| CWE | CWE-639 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N (それらの GET が JWT をデバイスにバインドせずに userkey を尊重する場合) |
| 製品 | Netgate/pfsense-api (pfSense Plus MIM OpenAPI + 生成クライアント) |
| 影響を受ける | pin b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25)。タグなし。 |
| 認証 | 仕様: なし (securitySchemes が存在しない)。userkey がクエリシークレット。Plus JWT/RBAC は実行されていない。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:19171 のみ。Plus イメージなし。 |
シリーズハブ: pfsense-api-nexus-mim (これはパート 7)。
盗まれた、または漏洩した ACB userkey が必要です (仕様: "hexidecimal encoded 32-byte random bytes"、64 hex)。仕様はそのキーを JWT や呼び出し元のデバイスにバインドしていません。G11 クラスの GET /services/acb/config はライブの userkey を返します。G9 サンプルは verify_ssl=False を設定しているため、:8443 の MITM はワイヤー上のキーを見ることができます。これらは漏洩経路です。この残存物は、キーが流出した後にそれが何をもたらすかです。
| Method | Sink | Privilege |
|---|---|---|
GET /services/acb?userkey=<stolen> | GetACBList (pfapi_openapi.yml)。生成された get_acb_list.py の params["userkey"]。 | ラボ実証済み (モック): そのデバイスがホストするバックアップを一覧表示する。証跡は backups[].reason に現れる。 |
GET /services/acb/bkp?userkey=<stolen>&revision= | GetACB -> RetrievedBackup.backup。生成された get_acb.py の params["userkey"] + params["revision"]。 | ラボ実証済み (モック): リビジョンの本体を取得する。証跡は backup に現れる。 |
| 稼働中のコントローラ上で同じバックアップ文字列 | ホストされた ACB blob | 推測: 読み取り可能になれば完全な config.xml (ユーザー、鍵、パッケージ)。モックは平文の証跡 XML を返した。acb.netgate.com とは通信しておらず、稼働中の blob も復号していない。 |
GET /services/acb/config | ACBConfigInfo.userkey、ACBConfig.encryption_password | 仕様上の話であり、このラボの話ではない: 稼働中のケイパビリティシークレットと復号パスワード。G11 の GET 上のシークレットクラス。検証はしていない。 |
| Method | Sink | Privilege |
|---|---|---|
POST /services/acb/restore | RestoreACB ボディ { timestamp } | 隣接する閉じた領域: サンプルは依然として JWT を送信する。この残存物ではない。実行していない。 |
POST /services/acb/config で userkey を置換 | SaveACBConfig | 隣接する閉じた領域: GET ケイパビリティ URL ではない。実行していない。 |
GET list / GET bkp は削除しない。DELETE /services/acb/bkp/{timestamp} は別の操作である。検証はしていない。
誤った userkey と欠落した userkey は証跡を返さなかった (ラボ実証済み)。
ラボ実証済み vs 推測: 盗まれた鍵による list と bkp は証跡を返した。誤った鍵と欠落した鍵は返さなかった。Plus は実行していない。稼働中の config.xml の内容と復号は公開スキーマから推測した (RetrievedBackup.backup は文字列であり、encryption_password は ACBConfig 上にある)。
必要条件: MIM コントローラの ACB GET へのネットワーク経路、および盗まれた/漏洩した userkey。これらの GET が JWT をデバイスにバインドせずにクエリキーを受け入れる場合、CVSS 7.5。正直に言えば、このパックは公開仕様がその契約をモデル化していることをループバック上で証明するものである。
| Surface | Why |
|---|---|
| pfSense Plus コントローラ | 実行していない。このパックに Plus イメージはない。 |
| CE REST パッケージ | 別のサーバー (jaredhendrickson/pfsense-api / pfrest.org)。 |
| SSH バナー ACB 鍵導出 | CVE-2024-57273 / SA-25_03。再報告しないこと。 |
この発見としての POST /services/acb/restore | サンプルは依然として JWT を送信する。 |
省略された OAS security からの未認証 php/shell | ドキュメントの残存物。モックは JWT なしで 200 を返すサーバーの証明ではない。 |
userkey の欠落 | ラボでは 403、証跡なし。 |
誤った userkey | ラボでは list が空 / bkp が 403、証跡なし。 |
生成されたライブラリの verify_ssl | デフォルトは True。G9 はサンプルがこれをオフにしている話であり、パッケージのデフォルトの話ではない。 |
Netgate/pfsense-api の main b4acd7ca (2026-05-25、「Add Snort-3 API definitions」) を固定した。ログイン/JWT、診断、MIM 登録、クライアント TLS、ユーザー/証明書、パッケージ、VPN/ファイアウォール、OpenAPI セキュリティ、デバイス IDOR、git/ファームウェア/フィード、さらに生成されたすべての操作のループバックモックにわたる 12 回の調査。
まずスキップリスト: 既にメール済みの CE WebGUI 残存物 (QinQ 親 if、OpenVPN ウィザード CRLF、CARP VHID、リミッタ番号、IPsec ログインバナー)。診断 PHP/shell は意図された管理者権限として。サードパーティの CE REST パッケージ。CVE-2024-57273 のバナー導出。
GetACBList と GetACB を読みました。userkey はクエリパラメータであり、バインドされたデバイス ID ではありません。生成された Python はそれをクエリ文字列にコピーします。YAML に securitySchemes はありません。ACBConfigInfo.userkey は「16 進数エンコードされた 32 バイトのランダムバイト」です。GET /services/acb/config はそのキーを返します。G9 サンプルは TLS 検証を無効化しているため、MITM がそれを漏洩させる可能性があります。G11 は GET ダンプです。この残存物は、そのダンプが供給するケイパビリティ URL です。
誤った方向性: 欠落した OAS セキュリティを未認証の php/shell として扱うこと。CVE-2024-57273 を再提出すること。稼働中の Plus ダンプを主張すること。劇場: Plus コントローラー。オラクルは公開仕様とループバックモックです。
python3 pfsense-api-acb-userkey-Abraxas-Labs.py
または
cd lab
./run.sh
Loopback のみ: http://127.0.0.1:19171。Compose プロジェクト pfsense-api-acb-userkey。Witness PFSENSE-API-ACB-USERKEY-WITNESS。Docker。Plus イメージなし。
期待される最終行:
SUCCESS pfsense-api-acb-userkey capability-url stolen-key-returns-witness wrong-key-does-not plus-not-executed public-spec-models-acb-userkey-capability-url PFSENSE-API-ACB-USERKEY-WITNESS
Honest: Plus は実行されなかった。盗まれたキーは witness を返した。誤ったキーは返さなかった。公開仕様では ACB の userkey を capability URL としてモデル化している。
ACB の GET で JWT を必須にする。userkey を capability URL として扱わない。list と retrieve を認証済みデバイスのキーにバインドする。外部の呼び出し元から別のデバイスのキーを受け入れない。すでにデバイス所有者であるロール以外への GET config で、ライブの userkey と encryption_password を返すのをやめる。