
pfSense Plus MIM API toolkit b4acd7ca - 高 - ローカル - 権限残留 - unix sock enroll no JWT
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-unix-sock-noauth
クラス: 権限の残留 到達範囲: ローカル
pfSense Plus MIM API b4acd7ca - Netgate
github.com/Netgate/pfsense-api は、pfSense Plus Nexus Multi-instance Management 向けの公開 OpenAPI と生成された Python です。これは CE REST パッケージではありません。公式の登録サンプルは、Bearer JWT を使用して HTTPS :8443 にログインし、その後 POSIX スクリプトを各ファイアウォールに SSH で送り込みます。そのスクリプトは Authorization なしで /var/run/pfnet-controller.sock と通信します。
curl --unix-socket /var/run/pfnet-controller.sock -H "Content-Type: application/json" -d "{controller JSON}" http://unix/api/mim/controllers
curl --unix-socket /var/run/pfnet-controller.sock http://unix/api/mim/device/identity
非推奨のフォールバック /api/system/controller と /api/system/mim/devid は同一である。Bearer は不要。HTTPS ログインは依然として JWT を発行する。そのトークンはオンデバイスの sock には適用されない。これは :8443 と mim_* グループとは別の信頼境界である。
Nexus MIM シリーズの Part 3。G1 / G2 がボックス上に展開された後、この sock がローカルプレーンとなる。
sock に connect(2) できるローカルプロセスは、JWT なしでコントローラを登録し、デバイスアイデンティティをダンプできる。Plus は実行されていない。実際の sock DAC は不明。
| ID | CVE 未割当 |
| クラス | 権限の残存 |
| 到達範囲 | ローカル (/var/run/pfnet-controller.sock への connect(2)) |
| CWE | CWE-306 |
| CVSS | High: 7.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (sock モードが別のローカル uid の接続を許可する場合)。正直に言えば: DAC 不明、Plus 未実行。 |
| 製品 | Netgate/pfsense-api (Plus Nexus MIM ツールキット) |
| 影響対象 | 公開 main b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25) |
| 認証 | 公式 unix-socket enroll curl にはなし |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:19121 のみ。Unix HTTP モック。Plus イメージなし。 |
アクターは、/var/run/pfnet-controller.sock に connect(2) できる pfSense デバイス上の任意のプロセスである。この例ではリモート TCP ではない (curl --unix-socket のみ)。HTTPS :8443 の JWT と mim_* グループはこの fd には適用されない。
| メソッド | シンク | 権限 |
|---|---|---|
Authorization なしの公式 device_script POST | POST http://unix/api/mim/controllers | Integrity: モックが enroll JSON を受け入れた。ヒットログ authorization_present=false。 |
Authorization なしの公式 device_script GET | GET http://unix/api/mim/device/identity | Recon: モックが PFSENSE-API-UNIX-SOCK-NOAUTH-WITNESS を含む DeviceIdentity 形式の JSON を返した。 |
Authorization: Bearer lab-jwt 付きの同じ GET | 同じ identity パス | ラボ対照: 401、witness はボディに含まれない。存在と不在を区別する。Plus の結果ではない。 |
これらは公式サンプルと mim タグがデバイス上に配置する OpenAPI オペレーションと同じものである。プロトコルとしてのみ実証済みであり、Plus の 200 としてではない。
| メソッド | シンク | 権限 |
|---|---|---|
攻撃者の ControllerIdentity (key、vpn_pubkey、vpn_listenaddr、vpn_netkey、cert) による POST /mim/controllers (フォールバック POST /api/system/controller) | SetController | Integrity: 敵対的コントローラを登録する。仕様: デバイスは「10 秒ごとに接続要求を発行し続ける」(攻撃者への Netgard VPN)。 |
GET /mim/device/identity (フォールバック GET /api/system/mim/devid) | GetDeviceIdentity | Recon: デバイスの Noise/VPN 公開鍵、address、controller_add curl テキスト。 |
GET /mim/controllers | GetControllers | Recon: コントローラ一覧とデバイス情報 (ControllerInfo.noise_secret、鍵)。 |
GET /mim/controllers/id/{key} | GetMIMController | Recon: 1 件のコントローラレコード。 |
DELETE /mim/controllers/id/{key} | DeleteMIMController | Integrity / availability: 実際のコントローラを登録解除する (key hex または base64-URL)。 |
攻撃者の privkey / pubkey による POST /mim/device/pubkey | SetDevicePublicKey (DevicePublicKeyOption に privkey が含まれる) | Integrity: デバイスの ED25519 アイデンティティを置き換える。コントローラのハンドシェイクはその後攻撃者の鍵を信頼する。 |
これ自体がホストの root シェルを付与するものではない。MIM プレーン、すなわちデバイスがコントローラとして信頼する相手、および pubkey POST が受け入れられた場合のデバイス Noise 秘密鍵を付与する。
必要条件: ローカルの connect(2) から /var/run/pfnet-controller.sock への接続。DAC(モード、オーナー、グループ、SO_PEERCRED)は公開クライアントツリーには含まれていない。デーモンが 0600 root でバインドしている場合、これはすでに root 権限のローカル(/var/run を参照できるヘルパー、パッケージ、またはエスケープのための confused deputy)である。ソケットが別の uid から到達可能な場合、スコアリングどおり CVSS 7.8。
:8443 上の /mim/controllers への未認証リモート TCP。このポートは User Manager JWT として文書化されている。この残存物は unix fd である。POST /login は依然として Bearer JWT を発行する。AuthenticatedClient は依然としてそれを CONTROLLER_URL+"/api" に送信する。verify_ssl=True。パスパラメータは ../ をパーセントエンコードする。security: MISSING はスキーマのギャップであり、未認証 HTTPS スキップが証明されたわけではない。同じピン、リモート登録プレーン: pfsense-api-enroll-json-ssh および pfsense-api-enroll-autoadd。シリーズマップ: pfsense-api-nexus-mim。
Netgate/pfsense-api b4acd7ca21dbca739a530403a1f62a7440f7726f をピンし、公式の登録ループを読んだ: login、GET /mim/controller/identity、文字列化、unix-socket POST/GET の SSH exec、POST /mim/devices。HTTPS は AuthenticatedClient(token=...) を使用する。sock の curl は使用しない。
誤った方向: 欠落した securitySchemes を未認証 HTTPS として扱う(login にも欠落している。例は常に Bearer が最初)。sock が world-writable であると仮定する(モードはこのリポジトリにはない)。Plus 200 を主張する。ここで証明された残存物は公開された登録プロトコルである。
お芝居: リバースシェル。オラクルは公式の curl 形状に加え、identity ボディ内の証人、そして Bearer 401 コントロールである。
python3 pfsense-api-unix-sock-noauth-Abraxas-Labs.py
または
cd lab
./run.sh
Loopback のみ: 127.0.0.1:19121。Compose プロジェクト pfsense-api-unix-sock-noauth。/var/run/pfnet-controller.sock で unix HTTP をモック。Witness PFSENSE-API-UNIX-SOCK-NOAUTH-WITNESS。Docker unix-socket モック。Plus イメージなし。
期待される最終行:
SUCCESS PFSENSE-API-UNIX-SOCK-NOAUTH auth-absent=yes identity-witness=yes bearer-401=yes PFSENSE-API-UNIX-SOCK-NOAUTH-WITNESS
/var/run/pfnet-controller.sock でデバイス JWT または SO_PEERCRED を要求します。ソケットを 0600 root でバインドします。認証されていない unix ピアからの POST /mim/controllers、POST /mim/device/pubkey、または identity GET を許可しないでください。
b4acd7ca21dbca739a530403a1f62a7440f7726fexample-add-devices.py device_script (unix curls、Authorization なし)pfapi_openapi.yml /mim/controllers、/mim/device/identity、/mim/device/pubkeyGNU Affero GPL v3.0。LICENSE を参照してください。ループバックラボ専用。保証なし。