
Ferramenta de auditoria somente leitura para CVE-2026-0300 (exposição do Portal de Autenticação User-ID do PAN-OS)
Ferramentas de auditoria somente leitura para CVE-2026-0300 — o estouro de buffer não autenticado no Portal de Autenticação User-ID do PAN-OS (anteriormente conhecido como "Captive Portal") em firewalls das séries PA e VM.
Este repositório acompanha o advisory de segurança da Tailwind Resource Group TRG-SA-2026-003 e fornece:
audit_portal.py — Nível 1: auditoria de firewall únicoaudit_fleet.py — Nível 2: varredura de frota orientada por Panorama (concorrente)panos_audit.py — biblioteca compartilhada usada por ambos os CLIsOs scripts são somente leitura. Eles emitem consultas do tipo show contra a API XML do PAN-OS e nunca modificam a configuração. A chave da API é enviada pelo cabeçalho HTTP X-PAN-KEY em vez de um parâmetro de consulta na URL, portanto não aparece nos logs de acesso do plano de gerenciamento do PAN, nos logs de proxy com inspeção TLS ou nos argumentos de processo do auditor.
O registro da CVE usa o nome moderno do recurso "Portal de Autenticação User-ID". O esquema XML do PAN-OS, os parâmetros de CLI e os caminhos de URL da documentação ainda usam o vocabulário legado captive-portal. Operadores que auditam frotas com show config running | match authentication-portal perderão silenciosamente todas as configurações porque essa string nunca aparece como elemento de configuração. Esta ferramenta pesquisa o nome de elemento correto no esquema, independentemente de quando a configuração foi criada.
A análise completa da Tailwind sobre essa pegadinha de nomenclatura está no TRG-SA-2026-003, "Captive Portal's legacy footprint" (A pegada legada do Captive Portal).
pip install--insecure é fornecido apenas para auditorias pontuais de implantação inicialexport PAN_API_KEY="<chave>"
./audit_portal.py --hostname fw1.example.com
Exemplo de saída em tabela:
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
Outros formatos de saída: --output json ou --output csv.
Outras opções: --vsys <nome> para auditoria de vsys único, --timeout/--retries para upstreams lentos, --debug para detalhes de erro detalhados em stderr.
export PAN_API_KEY="<chave-panorama>"
./audit_fleet.py --hostname panorama.example.com --workers 16 --output csv > fleet-audit.csv
Cada linha no CSV é um dispositivo-vsys com status do portal, host de redirecionamento, modo, vínculos de interface e uma classificação de risco. O script usa o parâmetro de API target=<serial> do Panorama, portanto nunca se conecta diretamente aos firewalls gerenciados — uma conexão ao Panorama varre toda a frota.
Opções notáveis:
--workers N — threads de auditoria concorrentes (padrão 8, máximo 32). Uma frota de 1000 dispositivos é concluída em minutos, em vez da mais de uma hora que uma varredura serial levaria.--timeout, --retries — configurações por chamada de API. URLError transitórios e HTTP 5xx são repetidos com backoff limitado.--exclude-disconnected — por padrão, dispositivos desconectados são incluídos com risk=DISCONNECTED para que permaneçam visíveis durante a janela de patch. Use esta opção para removê-los.--min-expected-devices N — avisa (stderr) se o Panorama retornar menos dispositivos que N. Útil para detectar truncamento de resposta em relação a um tamanho de frota conhecido.--serial-filter '0007*' — filtra por glob de serial para auditar um subconjunto.--debug — imprime detalhes de erro detalhados por dispositivo em stderr (inclui strings reason do upstream; desativado por padrão para evitar vazar nomes de host em CSVs voltados ao cliente).A coluna risk na saída é uma das seguintes:
| Rótulo | Significado |
|---|---|
INFO_NOT_CONFIGURED | Nenhum bloco <captive-portal> no dispositivo. Fora do escopo da CVE-2026-0300. |
INFO_DISABLED | O portal está configurado, mas enabled=no. O caminho de código vulnerável não está ativo. |
REVIEW_POLICY_NO_BINDINGS | Portal habilitado, mas nenhum vínculo de interface encontrado na configuração. Verifique via WebUI. |
EXPOSED_LIKELY | Portal habilitado e vinculado a uma zona cujo nome sugere exposição não confiável (untrust, dmz, guest, external, internet, wan, public). Investigue primeiro. |
REVIEW_POLICY | Portal habilitado e vinculado a zonas com nomes internos. Percorra a política de segurança para confirmar a alcançabilidade. |
EXPOSED_LIKELY é uma dica, não um veredito — nomes de zona são convenções do operador, não imposição. O script não pode substituir uma análise de política de segurança; ele ordena a saída da frota para onde a atenção deve se concentrar primeiro.
Fazem:
<captive-portal> por vsys (o nome do elemento no esquema é sempre captive-portal, independentemente da nomenclatura da interface ou da versão do PAN-OS).EXPOSED_LIKELY apareçam primeiro na saída da frota.X-PAN-KEY para que ela fique fora dos logs de acesso de URL e dos argumentos de processo.Não fazem:
A chave de API do PAN-OS herda a função e as permissões do usuário que a gera.
Aviso importante: não existe concessão de API XML somente leitura no PAN-OS.
As permissões de Função de Administrador na aba XML API são binárias Habilitar/Desabilitar por categoria — Configuração, Solicitações Operacionais, Commit, Exportação, Importação, Relatório, Log, Agente User-ID. Habilitar Configuração para XML API permite ações
showeset/edit/delete/move/rename/clone. Habilitar Solicitações Operacionais permite operações<request>arbitrárias, incluindo<request><restart>. As abas Web UI e REST API oferecem Somente Leitura como opção; a aba XML API não oferece.Um "usuário de auditoria" criado habilitando essas categorias de XML API detém autoridade total de escrita na XML API no dispositivo. Trate a chave resultante como uma credencial privilegiada: limite sua vida útil à janela de auditoria, armazene-a em um gerenciador de segredos e desabilite o usuário quando o trabalho for concluído.
Referência canônica do PAN: Get Your API Key (PAN-OS XML API).
No firewall (ou Panorama, se você estiver usando audit_fleet.py):