
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):
Crie a Função de Administrador. Navegue até Device > Admin Roles (ou Panorama > Admin Roles). Clique em Add.
audit-config-and-op.Crie o usuário de auditoria. Navegue até Device > Administrators (ou Panorama > Administrators). Clique em Add.
audit-cve-2026-0300.audit-config-and-op.Gere a chave da API com as credenciais do novo usuário. O PAN-OS não expõe um botão "gerar chave de API" na WebUI — o endpoint keygen é o caminho suportado. Use um corpo POST para que as credenciais não sejam registradas nos logs de acesso de 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 lê a senha sem ecoá-la no terminal e sem colocá-la no histórico do shell. O script lê o PAN_API_KEY resultante do ambiente e o envia pelo cabeçalho HTTP X-PAN-KEY — nem a senha nem a chave aparecem nos logs de acesso de URL ou em ps auxww enquanto o script é executado.
Desabilite o usuário quando o trabalho de auditoria for concluído. Navegue até Device > Administrators, localize audit-cve-2026-0300, clique em Delete (ou desabilite o usuário). Faça commit. Isso invalida quaisquer chaves geradas para esse usuário.
read -rs cobre a senha. Para a chave em PAN_API_KEY, prefira defini-la interativamente pelo trecho acima em vez de colá-la de um arquivo. Se precisar carregá-la de um arquivo, use set +o history para a sessão.--insecure em ambos os scripts de auditoria desabilita completamente a verificação do nome de host TLS e a validação do certificado. Qualquer atacante no caminho pode fazer MITM na resposta da auditoria e relatar portal_enabled=False para um dispositivo comprometido. O script audit_fleet.py exige --accept-mitm-risk junto com --insecure para varreduras de frota porque o raio de explosão de uma resposta envenenada é de toda a frota.0 — nenhum portal habilitado em nenhum vsys auditado2 — nenhum vsys encontrado (configuração transitória ou não suportada)3 — portal habilitado em pelo menos um vsys (revisão necessária)4 — falha na chamada de API (autenticação, TLS, rede)A saída não zero em "portal habilitado" é intencional — permite conectar o script a pipelines de CI/varredura de frota que precisam de um sinal limpo.
Licenciado sob a Apache License, Versão 2.0. Consulte LICENSE para os termos completos.
Uso comercial é permitido; atribuição é exigida (retenha o aviso de direitos autorais e o arquivo de licença em trabalhos derivados).
Copyright 2026 Tailwind Resource Group.