
pfSense Plus MIM API toolkit b4acd7ca - Alta - Locale - Privilegio residuo - unix sock enroll no JWT
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-unix-sock-noauth
Classe: Privilegio residuo Portata: Locale
pfSense Plus MIM API b4acd7ca - Netgate
github.com/Netgate/pfsense-api è l'OpenAPI pubblico più il Python generato per pfSense Plus Nexus Multi-instance Management. Non è il pacchetto REST CE. Il campione di enrollment ufficiale effettua il login su HTTPS :8443 con un Bearer JWT, quindi invia via SSH uno script POSIX su ciascun firewall. Quello script comunica con /var/run/pfnet-controller.sock senza alcun Authorization.
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
I fallback deprecati /api/system/controller e /api/system/mim/devid sono identici: nessun Bearer. Il login HTTPS emette comunque un JWT. Quel token non viene applicato al sock sul dispositivo. Questo è un confine di fiducia separato da :8443 più i gruppi mim_*.
Parte 3 della serie Nexus MIM. Dopo che G1 / G2 arrivano sul box, questo sock è il piano locale.
Un processo locale che può fare connect(2) al sock può registrare un controller e estrarre l'identità del dispositivo senza JWT. Inoltre non è stato eseguito. Il DAC reale del sock è sconosciuto.
| ID | nessuna CVE al momento |
| Classe | Privilegio residuo |
| Raggiungibilità | Locale (connect(2) a /var/run/pfnet-controller.sock) |
| CWE | CWE-306 |
| CVSS | Alto: 7.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H se la modalità del sock consente a un altro uid locale di connettersi. Onestà: DAC sconosciuto, Plus non eseguito. |
| Prodotto | Netgate/pfsense-api (toolkit Plus Nexus MIM) |
| Affetto | main pubblico b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25) |
| Auth | nessuna sulle curl ufficiali di enroll via unix-socket |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:19121. Mock HTTP Unix. Nessuna immagine Plus. |
L'attore è qualsiasi processo sul dispositivo pfSense che può fare connect(2) a /var/run/pfnet-controller.sock. Non TCP remoto in questo esempio (solo curl --unix-socket). Il JWT HTTPS :8443 e i gruppi mim_* non si applicano su questo fd.
| Metodo | Sink | Privilegio |
|---|---|---|
POST ufficiale device_script senza Authorization | POST http://unix/api/mim/controllers | Integrità: il mock ha accettato il JSON di enroll. Log di hit authorization_present=false. |
GET ufficiale device_script senza Authorization | GET http://unix/api/mim/device/identity | Recon: il mock ha restituito JSON con forma DeviceIdentity incluso PFSENSE-API-UNIX-SOCK-NOAUTH-WITNESS. |
Stesso GET con Authorization: Bearer lab-jwt | stesso percorso identity | Controllo lab: 401, witness non nel body. Distingue presente vs assente. Non un risultato Plus. |
Queste sono le stesse operazioni OpenAPI che il campione ufficiale e il tag mim mettono sul dispositivo. Provate solo come protocollo, non come Plus 200.
| Metodo | Sink | Privilegio |
|---|---|---|
POST /mim/controllers (fallback POST /api/system/controller) con ControllerIdentity dell'attaccante (key, vpn_pubkey, vpn_listenaddr, vpn_netkey, cert) | SetController | Integrità: registra un controller ostile. Spec: il dispositivo "continuerà a inviare una richiesta di connessione ogni 10 secondi" (VPN Netgard verso l'attaccante). |
GET /mim/device/identity (fallback GET /api/system/mim/devid) | GetDeviceIdentity | Recon: chiavi pubbliche Noise/VPN del dispositivo, address, testo curl controller_add. |
GET /mim/controllers | GetControllers | Recon: elenca i controller più le info del dispositivo (ControllerInfo.noise_secret, chiavi). |
GET /mim/controllers/id/{key} | GetMIMController | Recon: un record controller. |
DELETE /mim/controllers/id/{key} | DeleteMIMController | Integrità / disponibilità: annulla la registrazione del controller reale (key hex o base64-URL). |
POST /mim/device/pubkey con privkey / pubkey dell'attaccante | SetDevicePublicKey (DevicePublicKeyOption include privkey) | Integrità: sostituisce l'identità ED25519 del dispositivo. L'handshake del controller si fida quindi della chiave dell'attaccante. |
Non concede di per sé una shell root sull'host. Concede il piano MIM: di chi il dispositivo si fida come controller, e la chiave privata Noise del dispositivo se il POST pubkey viene onorato.
Richiede: connect(2) locale a /var/run/pfnet-controller.sock. Il DAC (mode, owner, group, SO_PEERCRED) non è nell'albero client pubblico. Se il daemon si lega a 0600 root, questo è già root locale (confused deputy per un helper, pacchetto o escape che può vedere /var/run). Se il sock è raggiungibile da un altro uid, CVSS 7.8 come valutato.
/mim/controllers su Nexus HTTPS :8443. Quella porta è documentata come User Manager JWT. Questo residuo è il unix fd.POST /login emette ancora un Bearer JWT. AuthenticatedClient lo invia ancora a CONTROLLER_URL+"/api".verify_ssl=True. I parametri di percorso codificano in percentuale ../.security: MISSING su tutte le 755 operazioni è una lacuna dello schema, non un salto HTTPS non autenticato provato.Stesso pin, piano di enrollment remoto: pfsense-api-enroll-json-ssh e pfsense-api-enroll-autoadd. Mappa della serie: pfsense-api-nexus-mim.
Ho fissato Netgate/pfsense-api b4acd7ca21dbca739a530403a1f62a7440f7726f e letto il loop di enrollment ufficiale: login, GET /mim/controller/identity, stringify, SSH exec di unix-socket POST/GET, POST /mim/devices. HTTPS usa AuthenticatedClient(token=...). I curl sul sock no.
Vicoli ciechi: trattare securitySchemes mancanti come HTTPS non autenticato (manca anche al login; gli esempi mettono sempre Bearer per primo). Presumere che il sock sia scrivibile da tutti (il mode non è in questo repo). Dichiarare un Plus 200. Il residuo provato qui è il protocollo di enroll pubblicato.