
Безопасно определите, уязвим ли контроллер UniFi Network Application к CVE-2026-22557.
Безопасно определяет, уязвим ли контроллер UniFi Network Application для CVE-2026-22557, не вызывая никаких нарушений. Смотрите полный анализ в блоге Bishop Fox.
CVE-2026-22557 — это неаутентифицированная уязвимость обхода пути в гостевом captive-портале UniFi Network Application, которая позволяет удалённым злоумышленникам читать произвольные файлы от имени пользователя процесса контроллера (CVSS 10.0). Уязвимость затрагивает UniFi Network Application 10.1.85 и более ранние версии в ветке 10.1.x, а также соответствующие ранние выпуски в ветках 10.2.x и 9.0.x. Компания Ubiquiti выпустила исправления в версиях 10.1.89, 10.2.97 и 9.0.118 (SAB-062).
Рендерер страницы ошибки гостевого портала читает параметр запроса page_error и использует его дословно как относительный путь в загрузчике ресурсов портала, без какой-либо проверки. Когда для запрашиваемого сайта установлено portal_customized: true (такая конфигурация возникает у любого брендированного captive-портала, например, в гостиницах, розничных магазинах или кафе), загрузчик разрешает этот путь относительно каталога портала на диске, и путь может выйти за его пределы.
Данный инструмент выполняет неразрушающее тестирование уязвимости следующим образом:
/status и сравнивает её с линиями исправлений SAB-062.page_error на /guest/<site>/wechat/sign на глубине ../ от 1 до 8 с использованием имени файла с двойной ветвью, чтобы определить, срабатывает ли обход вообще.firmware.json), чтобы определить, активна ли ветвь файловой системы кастомизированного портала.Инструмент запрашивает только файл каталога среды выполнения в качестве оракула активности ветви. Он не читает учётные данные, TLS-материалы, состояние базы данных или резервные копии и не выводит содержимое файлов на stdout или диск. Печатается только вердикт.
portal_customized: true на запрашиваемом сайте возвращают файл каталога на откалиброванной глубине, подтверждая VULNERABLE.portal_customized: false на запрашиваемом сайте, запускают обход на этапе калибровки, но не возвращают содержимое диска на этапе подтверждения → PARTIALLY EXPOSED. Двоичный файл приложения по-прежнему уязвим; требуется установка исправления, даже если этот сайт не находится в эксплуатируемом состоянии.NOT VULNERABLE.NOT EXPOSED.git clone https://github.com/BishopFox/CVE-2026-22557-check
cd CVE-2026-22557-check
Требуется Python 3.9 или новее. Инструмент использует только стандартную библиотеку Python, поэтому шаг pip install не нужен.
Протестируйте контроллер UniFi Network Application по адресу <TARGET>. Укажите инструменту любой URL, через который достижим веб-интерфейс контроллера; уязвимый обработчик работает на административном порту (по умолчанию 8443/TCP), а также на выделенных портах гостевого портала (8843, 8880).
python3 cve_2026_22557_check.py <BASE_URL> [--site NAME]
Имя сайта по умолчанию — default. Развёртывания UniFi с несколькими сайтами должны запускать инструмент с --site <name> для каждого сайта. Контроллер становится эксплуатируемым, как только хотя бы один из его сайтов имеет portal_customized: true.
Примеры ниже используют --brief для получения результата одной строкой на хост. Запуск без --brief выводит полный баннер, пошаговый прогресс и блок результата, включающий рекомендуемые действия по исправлению.
Контроллер работает на уязвимой сборке, и предварительное условие кастомизированного портала активно для запрашиваемого сайта, поэтому неаутентифицированный путь чтения доступен.
$ python3 cve_2026_22557_check.py https://192.168.1.100:8443 --brief
[VULNERABLE] https://192.168.1.100:8443 site=default
Контроллер работает на уязвимой сборке, но для запрашиваемого сайта не включено portal_customized: true, поэтому предварительное условие чтения с диска не выполнено для этого сайта. Двоичный файл приложения всё ещё требует исправления; другой сайт на том же контроллере может находиться в эксплуатируемом состоянии.
$ python3 cve_2026_22557_check.py https://192.168.1.100:8443 --brief
[PARTIAL] https://192.168.1.100:8443 site=default
Контроллер работает на исправленной сборке (10.1.89, 10.2.97, 9.0.118 или новее), поэтому обход не срабатывает ни на одной запрашиваемой глубине.
$ python3 cve_2026_22557_check.py https://192.168.1.200:8443 --brief
[NOT VULNERABLE] https://192.168.1.200:8443 site=default
--site NAME UniFi site slug to probe (default: "default")
--max-depth N maximum ../ traversal depth to try (default: 8)
--no-tls-recon skip TLS certificate subject/SAN display
--no-color disable ANSI color output (also honored: NO_COLOR env var)
--timeout N per-request timeout in seconds (default: 20)
--brief print a single-line result, no banner or steps
Коды завершения: 0 VULNERABLE, 1 partially exposed / not vulnerable / not exposed, 2 transport error.
Инструмент может вернуть вердикт VULNERABLE только при выполнении следующих условий:
/guest/* работает на административном порту (8443), а также на выделенных портах гостевого портала (8843, 8880); инструмент проверяет только тот URL, который ему передан.portal_customized: true в своей настройке guest_access, что является предварительным условием для кодового пути чтения с диска. Контроллер с несколькими сайтами является эксплуатируемым, если хотя бы один из его сайтов имеет этот параметр включённым.Если какое-либо условие не выполнено, инструмент переходит к более консервативному вердикту. Результат PARTIALLY EXPOSED всё равно означает, что приложение уязвимо и должно быть исправлено; просто запрошенный сайт не предоставляет пути чтения с диска.
Шаблон уязвимого запроса:
GET /guest/s/<site>/wechat/sign?page_error=<value>