
pfSense Plus MIM API toolkit b4acd7ca — высокий — локальный — остаточные привилегии — unix sock enroll без 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 — это публичный OpenAPI плюс сгенерированный Python для pfSense Plus Nexus Multi-instance Management. Это не пакет CE REST. Официальный пример enroll выполняет вход по HTTPS :8443 с Bearer JWT, а затем по SSH запускает POSIX-скрипт на каждом межсетевом экране. Этот скрипт обращается к /var/run/pfnet-controller.sock без 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
Устаревшие резервные эндпоинты /api/system/controller и /api/system/mim/devid одинаковы: без Bearer. HTTPS-вход всё ещё выдаёт JWT. Этот токен не применяется к локальному сокету на устройстве. Это отдельная граница доверия от :8443 плюс групп mim_*.
Часть 3 серии Nexus MIM. После того как G1 / G2 оказываются на устройстве, этот сокет становится локальной плоскостью.
Локальный процесс, способный выполнить connect(2) к сокету, может зарегистрировать контроллер и выгрузить идентичность устройства без JWT. Plus не выполнялся. Реальный DAC сокета неизвестен.
| ID | CVE пока нет |
| Класс | Остаточные привилегии |
| Достижимость | Локальная (connect(2) к /var/run/pfnet-controller.sock) |
| CWE | CWE-306 |
| CVSS | Высокий: 7.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H, если режим сокета позволяет подключиться другому локальному uid. Честно: DAC неизвестен, Plus не выполнялся. |
| Продукт | Netgate/pfsense-api (набор инструментов Plus Nexus MIM) |
| Затронуто | публичная ветка main b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25) |
| Аутентификация | отсутствует на официальных curl-запросах регистрации через unix-сокет |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1:19121. Unix HTTP-мок. Без образа Plus. |
Актором является любой процесс на устройстве pfSense, способный выполнить connect(2) к /var/run/pfnet-controller.sock. В этом примере это не удалённый TCP (только curl --unix-socket). JWT HTTPS :8443 и группы mim_* не применяются к этому fd.
| Метод | Приёмник | Привилегия |
|---|---|---|
Официальный POST device_script без Authorization | POST http://unix/api/mim/controllers | Целостность: мок принял JSON регистрации. В логе попадания authorization_present=false. |
Официальный GET device_script без Authorization | GET http://unix/api/mim/device/identity | Разведка: мок вернул JSON в форме DeviceIdentity, включая PFSENSE-API-UNIX-SOCK-NOAUTH-WITNESS. |
Тот же GET с Authorization: Bearer lab-jwt | тот же путь идентичности | Контроль в лаборатории: 401, свидетельство отсутствует в теле. Различает присутствие и отсутствие. Не результат Plus. |
Это те же операции OpenAPI, которые официальный пример и тег mim размещают на устройстве. Доказано только как протокол, а не как ответ 200 от Plus.
| Метод | Приёмник | Привилегия |
|---|---|---|
POST /mim/controllers (резервный POST /api/system/controller) с атакующим ControllerIdentity (key, vpn_pubkey, vpn_listenaddr, vpn_netkey, cert) | SetController | Целостность: зарегистрировать враждебный контроллер. Спецификация: устройство «будет продолжать отправлять запрос на подключение каждые 10 секунд» (Netgard VPN к атакующему). |
GET /mim/device/identity (резервный GET /api/system/mim/devid) | GetDeviceIdentity | Разведка: публичные ключи Noise/VPN устройства, address, текст curl controller_add. |
GET /mim/controllers | GetControllers | Разведка: список контроллеров плюс информация об устройстве (ControllerInfo.noise_secret, ключи). |
GET /mim/controllers/id/{key} | GetMIMController | Разведка: одна запись контроллера. |
DELETE /mim/controllers/id/{key} | DeleteMIMController | Целостность / доступность: отменить регистрацию реального контроллера (ключ в hex или base64-URL). |
POST /mim/device/pubkey с атакующими privkey / pubkey | SetDevicePublicKey (DevicePublicKeyOption включает privkey) | Целостность: заменить идентичность ED25519 устройства. Рукопожатие с контроллером затем доверяет ключу атакующего. |
Сам по себе не даёт root-оболочку на хосте. Даёт плоскость MIM: кому устройство доверяет как контроллеру, и приватный ключ Noise устройства, если POST pubkey будет принят.
Требуется: локальный connect(2) к /var/run/pfnet-controller.sock. DAC (режим, владелец, группа, SO_PEERCRED) отсутствует в публичном клиентском дереве. Если демон привязывается к 0600 root, это уже локальный root (confused deputy для helper, пакета или escape, который может видеть /var/run). Если сокет доступен другому uid, CVSS 7.8 по оценке.
/mim/controllers на Nexus HTTPS :8443. Этот порт документирован как User Manager JWT. Этот остаток — unix fd.POST /login по-прежнему выдаёт Bearer JWT. AuthenticatedClient по-прежнему отправляет его на CONTROLLER_URL+"/api".verify_ssl=True. Параметры пути percent-кодируют ../.security: MISSING на всех 755 операциях — это пробел в схеме, а не доказанный неаутентифицированный обход HTTPS.Тот же пин, плоскость удалённой регистрации: pfsense-api-enroll-json-ssh и pfsense-api-enroll-autoadd. Карта серии: pfsense-api-nexus-mim.
Я зафиксировал Netgate/pfsense-api b4acd7ca21dbca739a530403a1f62a7440f7726f и прочитал официальный цикл регистрации: login, GET /mim/controller/identity, stringify, SSH exec unix-socket POST/GET, POST /mim/devices. HTTPS использует AuthenticatedClient(token=...). Sock curls — нет.
Неверные повороты: трактовка отсутствующих securitySchemes как неаутентифицированного HTTPS (login тоже их не имеет; примеры всегда Bearer первым). Предположение, что сокет доступен на запись всем (режим отсутствует в этом репозитории). Утверждение о Plus 200. Остаток, доказанный здесь, — это опубликованный протокол регистрации.