
pfSense Plus MIM API toolkit b4acd7ca - Hoch - Remote - IDOR - ein Controller-JWT ist ein Flotten-Token
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-fleet-jwt
Klasse: IDOR Reichweite: Remote
pfSense Plus MIM API (Netgate) Pin b4acd7ca - github.com/Netgate/pfsense-api
Ein POST /login Bearer wird für jede registrierte device_id wiederverwendet. Offizielle Beispiele kopieren dieses Token auf /api/device/pfsense/{device_id}/api für jede id aus GET /mim/devices. Die Felder von LoginResponse sind nur token, user, version und alerts. LDAP-MIM-Rollen sind global. Sie sind nicht an ein Gerät gebunden. Ein Controller-Login, der Geräte auflisten kann, kommuniziert mit Firewall B mit einem Token, das für einen Benutzer ausgestellt wurde, der für Firewall A vorgesehen war.
Dies ist eine einzelne Kundenmandantenschaft, kein SaaS-übergreifender Mandantenrest. Nicht authentifizierte Aufrufe bleiben 401. Plus RBAC wurde nicht ausgeführt. Serien-Hub: pfsense-api-nexus-mim (dies ist Rest 6). Das gestohlene JWT aus Rest 9 (verify_ssl=False-Beispiele) ist dieses Flotten-Token.
| ID | noch keine CVE |
| Klasse | IDOR |
| Reichweite | Remote (authentifiziertes Controller-JWT) |
| CWE | CWE-639 |
| CVSS | Hoch: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Produkt | Netgate/pfsense-api (pfSense Plus Nexus Multi-instance Management Controller OpenAPI + generierter Client) |
| Betroffen | Pin b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25). Keine Tags. Server ist nur Plus (kostenpflichtig). Nicht das CE REST-Paket. |
| Auth | Controller-JWT aus POST /login. Das Erraten von device_id ist nicht erforderlich, wenn GET /mim/devices erlaubt ist. |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:19161. Python-Mock des veröffentlichten Client-Vertrags. Kein Plus-Image. |
Ich habe github.com/Netgate/pfsense-api main b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25, Add Snort-3 API definitions) gepinnt. Dies ist nicht jaredhendrickson/pfsense-api / pfrest.org.
Ein Controller-Login, der Geräte auflisten kann, kommuniziert mit jeder registrierten Instanz mit demselben JWT. CSRF ist nicht im Spiel (Bearer API). PHP / Shell / Export-Key auf jeder Box ist beabsichtigte Admin-Befugnis sobald der Proxy das Flotten-Token akzeptiert. Der Rest ist die fehlende gerätebezogene Bindung, nicht Diagnostics: Command.
| Berechtigung | Methode / Pfad | Im Labor bewiesen oder abgeleitet |
|---|---|---|
Jede registrierte device_id auflisten (Name, Adresse, Status) | GET /mim/devices mit dem Login-Bearer | Recon (im Labor bewiesen). Mock gab sowohl site-a als auch site-b zurück. Unauth ist 401. |
| Systemstatus von Firewall A und Firewall B mit einem Token lesen | GET /api/device/pfsense/{device_id}/api/system | Recon (im Labor bewiesen). device-a=200, device-b=200. Witness nur auf B. |
| Den Diagnostics-PHP-Wrapper auf beiden IDs per POST senden | POST /api/device/pfsense/{device_id}/api/diag/cmd/php | Integrität (Labor nur auf Mock). Beide 200. Zudem wurde RBAC nicht ausgeführt, sodass ein Live-Rollen-Gate unbewiesen ist. |
PHP / Shell / Dateibearbeitung auf jeder registrierten Box ausführen, wenn der Login Konsole oder system enthält | POST /diag/cmd/php, POST /diag/cmd/shell, GET/POST /diag/editfile, Download/Upload | Integrität (abgeleitet aus OAS + Beispielen). Beabsichtigte Admin-Befugnis, sobald der Proxy das Fleet-Token akzeptiert. Typisches pfSense PHP-FPM läuft als root. |
| CA-/Leaf-Private-Keys und PKCS12 auf jeder gelisteten Instanz exportieren | GET /system/certificates/{refid}/export-key, GET /system/certauth/{refid}/export-key, GET /system/certificates/{refid}/export-p12 | Recon (abgeleitet). Gleiches JWT, gleiches Schema wie Leftover 4. Zudem RBAC nicht ausgeführt. |
| ACME-Konto und ausgestellte Keys auf jeder gelisteten Instanz dumpen | GET /services/acme und zugehörige Konto-/Zertifikat-GETs | Recon (abgeleitet). Gleiches JWT, Leftover-5-Schema. |
| Aliase, Firewall, Interfaces, VPN, Dienste auf jeder gelisteten Instanz ändern | gleiches Per-Device-Präfix, restliche 700+ Operationen | Integrität (abgeleitet). Gleiches JWT, gleiches Schema wie die lokale Instanz. |
| Reboot / Halt / Config-Restore auf jeder gelisteten Instanz | POST /diag/control, POST /diag/backup/restore | Verfügbarkeit + Integrität (abgeleitet). Gleicher Proxy. Nicht ausgeführt. |
| Cross-Customer-SaaS-IDOR | n/a | Geschlossen. Eine Kunden-Tenancy. Netgate betreibt den Controller in dieser Tenancy. |
| Unauthentifiziertes Internet-zu-:8443 | GET /mim/devices ohne Bearer | In diesem Labor geschlossen. 401. Falscher Bearer ist ebenfalls 401. |
| Offline-Geräte | Beispiele überspringen state != online | Durch Beispiele geschlossen. Keine Auth-Grenze. |
Blinder numerischer Walk von device_id | GET /api/device/pfsense/1/api/system | Als Rate-Anforderung geschlossen. IDs sind lange Strings (ED25519-förmig). Das Listing entfernt das Raten. |
Erfordert: einen Controller-Login, der auf den Device-Proxy zugelassen ist. Netzwerkpfad zum MIM-Controller (:8443 im Produkt, Loopback :19161 in diesem Labor). Nicht unauth. Nicht CSRF.
| Angriffsfläche | Warum |
|---|---|
| Unauth-Listing / php / shell | Mock 401 ohne Bearer und mit falschem Bearer. Spec-Schweigen zu securitySchemes ist kein Server-200. |
| SaaS Cross-Tenant | Eine Kunden-Tenancy. Tenancy-Cluster waren auf der Marketingseite dennoch geplant. |
mim_user / keine Nexus-Gruppe | Dokumentiert als geschlossen, wenn das Login-Gate hält. |
Funktionale mim_*-Rollennamen | Sie existieren (view, logs, usermgmt, services, firewall, interfaces, devices, system, superuser). Sie sind global, nicht pro device_id. Live-Plus-Prüfungen wurden nicht ausgeführt (plus-rbac=not-executed). |
| Enrollment-SSH-JSON-Interpolation | Leftover 1. Anderes Pack. |
Enrollment-AutoAddPolicy | Leftover 2. Anderes Pack. |
| Device-Unix-Socket ohne JWT | Leftover 3. Lokal, anderes Pack. |
| CE-REST-Paket | jaredhendrickson/pfsense-api ist ein anderer Server. |
| CE-WebGUI-QinQ / OpenVPN-Wizard / CARP / Limiter / IPsec-Banner | Bereits als CE-Leftovers gemeldet. Feldnamen in dieser OAS sind dieselben Sinks, keine neuen CVEs. |
Beabsichtigte admins / mim_superuser-Fleet-Konsole | Produktmodell für den Controller-Eigentümer. Der Leftover ist die fehlende Objekt-ACL für alle anderen. |
Ich habe b4acd7ca gepinnt und die offiziellen Beispiele gegen die OpenAPI gelesen. Jedes Beispiel, das mit verwalteten Firewalls spricht, macht Folgendes: