
pfSense Plus MIM API toolkit b4acd7ca — High — Remote — IDOR — один JWT контроллера является токеном всего парка устройств
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-fleet-jwt
Класс: IDOR Достижимость: Удалённая
pfSense Plus MIM API (Netgate) пин b4acd7ca - github.com/Netgate/pfsense-api
Один Bearer-токен из POST /login переиспользуется для каждого зарегистрированного device_id. Официальные примеры копируют этот токен в /api/device/pfsense/{device_id}/api для каждого id из GET /mim/devices. Поля LoginResponse — это только token, user, version и alerts. Роли LDAP MIM являются глобальными. Они не привязаны к устройству. Логин контроллера, который может перечислять устройства, обращается к firewall B с токеном, выданным для пользователя, предназначенного для firewall A.
Это одна клиентская тенантность, а не SaaS-пережиток кросс-тенантности. Неаутентифицированные вызовы остаются 401. Plus RBAC не выполнялся. Хаб серии: pfsense-api-nexus-mim (это пережиток 6). Украденный JWT из пережитка 9 (образцы verify_ssl=False) — это и есть fleet-токен.
| ID | CVE пока нет |
| Класс | IDOR |
| Достижимость | Удалённая (аутентифицированный JWT контроллера) |
| CWE | CWE-639 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Продукт | Netgate/pfsense-api (pfSense Plus Nexus Multi-instance Management controller OpenAPI + сгенерированный клиент) |
| Затронуто | пин b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25). Тегов нет. Сервер только для Plus (платный). Не пакет CE REST. |
| Аутентификация | JWT контроллера из POST /login. Угадывание device_id не требуется, если разрешён GET /mim/devices. |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1:19161. Python-мок опубликованного контракта клиента. Без образа Plus. |
Я зафиксировал github.com/Netgate/pfsense-api main b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25, Add Snort-3 API definitions). Это не jaredhendrickson/pfsense-api / pfrest.org.
Логин контроллера, который может перечислять устройства, обращается к каждому зарегистрированному экземпляру с одним и тем же JWT. CSRF здесь ни при чём (Bearer API). PHP / shell / export-key на каждом узле — это предполагаемые права администратора как только прокси принимает fleet-токен. Пережиток — это отсутствующая привязка к устройству, а не Diagnostics: Command.
| Привилегия | Метод / путь | Доказано в лаборатории или выведено |
|---|---|---|
Перечислить все зарегистрированные device_id (имя, адрес, состояние) | GET /mim/devices с login Bearer | Разведка (доказано в лаборатории). Мок вернул и site-a, и site-b. Без аутентификации — 401. |
| Прочитать состояние системы firewall A и firewall B одним токеном | GET /api/device/pfsense/{device_id}/api/system | Разведка (доказано в лаборатории). device-a=200, device-b=200. Свидетельство только на B. |
| Отправить POST на PHP-обёртку диагностики для обоих id | POST /api/device/pfsense/{device_id}/api/diag/cmd/php | Целостность (лаборатория только на моке). Оба 200. Плюс RBAC не выполнялся, поэтому живой ролевой шлюз не доказан. |
Запустить PHP / shell / редактирование файлов на каждом зарегистрированном узле, если логин включает console или system | POST /diag/cmd/php, POST /diag/cmd/shell, GET/POST /diag/editfile, download/upload | Целостность (выведено из OAS + примеров). Предполагаемая административная возможность, как только прокси принимает fleet-токен. Типичный pfSense PHP-FPM работает от root. |
| Экспортировать CA / приватные ключи leaf и PKCS12 на каждом перечисленном экземпляре | GET /system/certificates/{refid}/export-key, GET /system/certauth/{refid}/export-key, GET /system/certificates/{refid}/export-p12 | Разведка (выведено). Тот же JWT, та же схема, что и в leftover 4. Плюс RBAC не выполнялся. |
| Выгрузить аккаунт ACME и выпущенные ключи на каждом перечисленном экземпляре | GET /services/acme и связанные GET аккаунта/сертификатов | Разведка (выведено). Тот же JWT, схема из leftover 5. |
| Изменить алиасы, firewall, интерфейсы, VPN, сервисы на каждом перечисленном экземпляре | тот же префикс для каждого устройства, остальные 700+ операций | Целостность (выведено). Тот же JWT, та же схема, что и у локального экземпляра. |
| Перезагрузить / остановить / восстановить конфигурацию на каждом перечисленном экземпляре | POST /diag/control, POST /diag/backup/restore | Доступность + целостность (выведено). Тот же прокси. Не проверялось. |
| Межклиентский SaaS IDOR | н/д | Закрыто. Один клиентский тенант. Netgate запускает контроллер в этом тенанте. |
| Неаутентифицированный доступ из Интернета к :8443 | GET /mim/devices без Bearer | Закрыто в этой лаборатории. 401. Неверный Bearer тоже 401. |
| Офлайн-устройства | образцы пропускают state != online | Закрыто образцами. Это не граница аутентификации. |
Слепой перебор числовых device_id | GET /api/device/pfsense/1/api/system | Закрыто как требование угадывания. Id — длинные строки (в форме ED25519). Листинг устраняет необходимость угадывать. |
Требуется: логин контроллера, которому разрешён доступ к прокси устройства. Сетевой путь к контроллеру MIM (:8443 в продукте, loopback :19161 в этой лаборатории). Не без аутентификации. Не CSRF.
| Поверхность | Почему |
|---|---|
| Неаутентифицированный листинг / php / shell | Мок 401 без Bearer и с неверным Bearer. Молчание спецификации о securitySchemes — это не серверный 200. |
| Межтенантный SaaS | Один клиентский тенант. Кластеры тенантов всё ещё планировались на маркетинговой странице. |
mim_user / без группы Nexus | Задокументировано как закрытое, если шлюз логина держится. |
Функциональные имена ролей mim_* | Они существуют (view, logs, usermgmt, services, firewall, interfaces, devices, system, superuser). Они глобальные, а не для каждого device_id. Живые проверки Plus не выполнялись (plus-rbac=not-executed). |
| Интерполяция JSON при регистрации по SSH | Leftover 1. Другой пакет. |
AutoAddPolicy при регистрации | Leftover 2. Другой пакет. |
| Unix-сокет устройства без JWT | Leftover 3. Локальный, другой пакет. |
| REST-пакет CE | jaredhendrickson/pfsense-api — это другой сервер. |
| CE WebGUI QinQ / мастер OpenVPN / CARP / limiter / баннер IPsec | Уже отправлено как CE leftovers. Имена полей в этом OAS — те же стоки, а не новые CVE. |
Предполагаемая fleet-консоль admins / mim_superuser | Модель продукта для владельца контроллера. Leftover — это отсутствующий ACL объектов для всех остальных. |
Я зафиксировал b4acd7ca и прочитал официальные примеры против OpenAPI. Каждый образец, который обращается к управляемым firewall, делает это: