
Инструмент аудита только для чтения для CVE-2026-0300 (экспонирование портала аутентификации User-ID в PAN-OS)
Инструментарий аудита только для чтения для CVE-2026-0300 — неаутентифицированное переполнение буфера в портале аутентификации User-ID PAN-OS (ранее известном как «Captive Portal») на межсетевых экранах серий PA и VM.
Этот репозиторий сопровождает бюллетень безопасности Tailwind Resource Group TRG-SA-2026-003 и предоставляет:
audit_portal.py — уровень 1: аудит одного межсетевого экранаaudit_fleet.py — уровень 2: массовое сканирование парка через Panorama (параллельно)panos_audit.py — общая библиотека, используемая обоими CLIСкрипты работают только на чтение. Они выполняют запросы вида show к XML API PAN-OS и никогда не изменяют конфигурацию. Ключ API передаётся через HTTP-заголовок X-PAN-KEY, а не как параметр URL-запроса, поэтому он не появляется в журналах доступа плоскости управления PAN, журналах прокси с TLS-инспекцией или в аргументах процесса аудитора.
В записи CVE используется современное название функции «User-ID Authentication Portal». Схема XML PAN-OS, параметры CLI и пути URL документации по-прежнему используют устаревшую лексику captive-portal. Операторы, проверяющие парки с помощью show config running | match authentication-portal, молча пропустят всю конфигурацию, поскольку эта строка никогда не появляется как элемент конфигурации. Этот инструментарий ищет имя элемента, соответствующее схеме, независимо от того, когда была создана конфигурация.
Полный анализ Tailwind этой особенности именования приведён в TRG-SA-2026-003, «Устаревший след Captive Portal».
pip install не требуется--insecure предусмотрен только для разовых аудитов при первоначальном развёртыванииexport PAN_API_KEY="<key>"
./audit_portal.py --hostname fw1.example.com
Пример табличного вывода:
vsys: vsys1
configured: True
enabled: True
redirect_host: auth-portal.internal.example.com
mode: redirect
bound: ethernet1/3(internal-trust), ethernet1/4(guest)
tls_verified: True
risk: EXPOSED_LIKELY
Другие форматы вывода: --output json или --output csv.
Другие флаги: --vsys <name> для аудита одного vsys, --timeout/--retries для медленных вышестоящих систем, --debug для подробных сведений об ошибках в stderr.
export PAN_API_KEY="<panorama-key>"
./audit_fleet.py --hostname panorama.example.com --workers 16 --output csv > fleet-audit.csv
Каждая строка в CSV — это одно устройство-vsys со статусом портала, хостом перенаправления, режимом, привязками интерфейсов и классификацией риска. Скрипт использует параметр API Panorama target=<serial>, поэтому он никогда не подключается к управляемым межсетевым экранам напрямую — одно подключение к Panorama сканирует весь парк.
Примечательные флаги:
--workers N — параллельные потоки аудита (по умолчанию 8, максимум 32). Парк из 1000 устройств обрабатывается за минуты, а не за час и более, как при последовательном сканировании.--timeout, --retries — настройки на каждый вызов API. Временные URLError и HTTP 5xx повторяются с ограниченной экспоненциальной задержкой.--exclude-disconnected — по умолчанию отключённые устройства включаются с risk=DISCONNECTED, чтобы они оставались видимыми в период установки исправлений. Используйте этот флаг, чтобы исключить их.--min-expected-devices N — предупреждение (stderr), если Panorama возвращает меньше устройств, чем N. Полезно для обнаружения усечения ответа при известном размере парка.--serial-filter '0007*' — фильтрация по серийному номеру с подстановочными знаками для аудита подмножества.--debug — вывод подробных сведений об ошибках по каждому устройству в stderr (включая строки reason от вышестоящей системы; по умолчанию выключено, чтобы не раскрывать имена хостов в CSV для клиентов).Столбец risk в выводе принимает одно из следующих значений:
| Метка | Значение |
|---|---|
INFO_NOT_CONFIGURED | Блок <captive-portal> на устройстве отсутствует. Вне области действия CVE-2026-0300. |
INFO_DISABLED | Портал настроен, но enabled=no. Уязвимый путь кода неактивен. |
REVIEW_POLICY_NO_BINDINGS | Портал включён, но привязки интерфейсов в конфигурации не найдены. Проверьте через WebUI. |
EXPOSED_LIKELY | Портал включён и привязан к зоне, имя которой указывает на недоверенную доступность (untrust, dmz, guest, external, internet, wan, public). Исследуйте в первую очередь. |
REVIEW_POLICY | Портал включён и привязан к зонам с внутренними именами. Проверьте политику безопасности, чтобы подтвердить достижимость. |
EXPOSED_LIKELY — это подсказка, а не вердикт — имена зон являются соглашениями оператора, а не принудительным механизмом. Скрипт не может заменить анализ политики безопасности; он сортирует вывод парка так, чтобы внимание сначала направлялось туда, где оно необходимо.
Делают:
<captive-portal> для каждого vsys (имя элемента схемы всегда captive-portal, независимо от названия в интерфейсе или версии PAN-OS).EXPOSED_LIKELY появлялись первыми в выводе парка.X-PAN-KEY, чтобы он не попадал в журналы доступа URL и аргументы процесса.Не делают:
Ключ API PAN-OS наследует роль и разрешения пользователя, который его генерирует.
Важное предостережение: в PAN-OS не существует разрешения XML API только для чтения.
Разрешения роли администратора на вкладке XML API являются бинарными «Включено/Выключено» для каждой категории — Configuration, Operational Requests, Commit, Export, Import, Report, Log, User-ID Agent. Включение Configuration для XML API разрешает как
show, так иset/edit/delete/move/rename/clone. Включение Operational Requests разрешает произвольные операции<request>, включая<request><restart>. Вкладки Web UI и REST API предлагают вариант «Только чтение»; вкладка XML API — нет.«Пользователь аудита», созданный включением этих категорий XML API, обладает полными правами записи XML API на устройстве. Относитесь к полученному ключу как к привилегированному учётному данным: ограничьте срок его действия окном аудита, храните в менеджере секретов и отключите пользователя по завершении работы.
Каноническая справка PAN: Get Your API Key (PAN-OS XML API).
На межсетевом экране (или Panorama, если вы используете audit_fleet.py):