
Инструмент аудита только для чтения для 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):
Создайте роль администратора. Перейдите в Device > Admin Roles (или Panorama > Admin Roles). Нажмите Add.
audit-config-and-op.Создайте пользователя аудита. Перейдите в Device > Administrators (или Panorama > Administrators). Нажмите Add.
audit-cve-2026-0300.audit-config-and-op.Сгенерируйте ключ API с учётными данными нового пользователя. PAN-OS не предоставляет кнопку «сгенерировать ключ API» в WebUI — поддерживаемый путь — это конечная точка keygen. Используйте тело POST, чтобы учётные данные не попадали в журналы доступа URL:
read -rs AUDIT_PW; echo
export PAN_API_KEY="$(curl -ksX POST "https://fw1.example.com/api/" \
--data-urlencode "type=keygen" \
--data-urlencode "user=audit-cve-2026-0300" \
--data-urlencode "password=$AUDIT_PW" \
| grep -oE '<key>[^<]+' | cut -c6-)"
unset AUDIT_PW
read -rs считывает пароль без вывода его на терминал и без помещения в историю оболочки. Скрипт считывает полученный PAN_API_KEY из окружения и отправляет его через HTTP-заголовок X-PAN-KEY — ни пароль, ни ключ не появляются в журналах доступа URL или в ps auxww во время работы скрипта.
Отключите пользователя по завершении работы аудита. Перейдите в Device > Administrators, найдите audit-cve-2026-0300, нажмите Delete (или отключите пользователя). Выполните Commit. Это аннулирует все ключи, сгенерированные для этого пользователя.
read -rs покрывает пароль. Для ключа в PAN_API_KEY предпочтительнее задавать его интерактивно через приведённый выше фрагмент, а не вставлять из файла. Если необходимо загрузить его из файла, используйте set +o history для сеанса.--insecure в обоих скриптах аудита полностью отключает проверку имени хоста TLS и проверку сертификата. Любой атакующий на пути может выполнить MITM ответа аудита и сообщить portal_enabled=False для скомпрометированного устройства. Скрипт audit_fleet.py требует --accept-mitm-risk вместе с --insecure для массовых сканирований, поскольку радиус поражения подделанного ответа охватывает весь парк.0 — портал не включён ни на одном проверенном vsys2 — vsys не найден (временная или неподдерживаемая конфигурация)3 — портал включён хотя бы на одном vsys (требуется проверка)4 — сбой вызова API (аутентификация, TLS, сеть)Ненулевой код выхода при «портале включён» является намеренным — он позволяет подключить скрипт к конвейерам CI / массового сканирования, которым нужен чёткий сигнал.
Лицензировано на условиях Apache License, Version 2.0. Полные условия см. в LICENSE.
Коммерческое использование разрешено; требуется указание авторства (сохраняйте уведомление об авторских правах и файл лицензии в производных работах).
Copyright 2026 Tailwind Resource Group.