
Strumento di audit in sola lettura per CVE-2026-0300 (esposizione del portale di autenticazione User-ID di PAN-OS)
Strumenti di audit in sola lettura per CVE-2026-0300 — il buffer overflow non autenticato nel Portale di Autenticazione User-ID di PAN-OS (precedentemente noto come "Captive Portal") sui firewall delle serie PA e VM.
Questo repository accompagna l'advisory di sicurezza di Tailwind Resource Group TRG-SA-2026-003 e fornisce:
audit_portal.py — Livello 1: audit di un singolo firewallaudit_fleet.py — Livello 2: scansione della flotta guidata da Panorama (concorrente)panos_audit.py — libreria condivisa utilizzata da entrambe le CLIGli script sono in sola lettura. Eseguono query di tipo show contro l'API XML di PAN-OS e non modificano mai la configurazione. La chiave API viene inviata tramite l'header HTTP X-PAN-KEY anziché come parametro di query nell'URL, quindi non compare nei log di accesso del piano di gestione PAN, nei log dei proxy con ispezione TLS o negli argomenti di processo dell'auditor.
Il record CVE utilizza il nome moderno della funzionalità "Portale di Autenticazione User-ID". Lo schema XML di PAN-OS, le opzioni CLI e i percorsi URL della documentazione utilizzano ancora il vocabolario legacy captive-portal. Gli operatori che eseguono audit sulle flotte con show config running | match authentication-portal mancheranno silenziosamente ogni configurazione perché quella stringa non appare mai come elemento di configurazione. Questo strumento cerca il nome dell'elemento corretto per lo schema indipendentemente da quando la configurazione è stata creata.
L'analisi completa di Tailwind su questo problema di nomenclatura è in TRG-SA-2026-003, "Captive Portal's legacy footprint."
pip install richiesto--insecure è fornito solo per audit di avvio una tantumexport PAN_API_KEY="<key>"
./audit_portal.py --hostname fw1.example.com
Esempio di output tabellare:
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
Altri formati di output: --output json o --output csv.
Altre opzioni: --vsys <name> per audit di un singolo vsys, --timeout/--retries per upstream lenti, --debug per dettagli di errore verbosi su stderr.
export PAN_API_KEY="<panorama-key>"
./audit_fleet.py --hostname panorama.example.com --workers 16 --output csv > fleet-audit.csv
Ogni riga nel CSV è un dispositivo-vsys con stato del portale, host di reindirizzamento, modalità, binding delle interfacce e una classificazione del rischio. Lo script utilizza il parametro API target=<serial> di Panorama, quindi non si connette mai direttamente ai firewall gestiti — una sola connessione a Panorama esegue la scansione dell'intera flotta.
Opzioni notevoli:
--workers N — thread di audit concorrenti (default 8, max 32). Una flotta di 1000 dispositivi viene completata in minuti anziché nell'ora o più che richiederebbe una scansione seriale.--timeout, --retries — impostazioni per singola chiamata API. Gli errori transitori URLError e HTTP 5xx vengono ritentati con backoff limitato.--exclude-disconnected — di default, i dispositivi disconnessi vengono inclusi con risk=DISCONNECTED così rimangono visibili durante la finestra di patch. Usa questa opzione per escluderli.--min-expected-devices N — avvisa (su stderr) se Panorama restituisce meno dispositivi di N. Utile per rilevare il troncamento della risposta rispetto a una dimensione nota della flotta.--serial-filter '0007*' — filtro glob per seriale per eseguire l'audit di un sottoinsieme.--debug — stampa dettagli di errore verbosi per dispositivo su stderr (include stringhe reason dell'upstream; disattivato di default per evitare di far trapelare hostname nei CSV destinati ai clienti).La colonna risk nell'output è una delle seguenti:
| Etichetta | Significato |
|---|---|
INFO_NOT_CONFIGURED | Nessun blocco <captive-portal> sul dispositivo. Fuori dall'ambito di CVE-2026-0300. |
INFO_DISABLED | Il portale è configurato ma enabled=no. Il percorso di codice vulnerabile non è attivo. |
REVIEW_POLICY_NO_BINDINGS | Portale abilitato, ma nessun binding di interfaccia trovato nella configurazione. Verificare tramite WebUI. |
EXPOSED_LIKELY | Portale abilitato e associato a una zona il cui nome suggerisce esposizione non attendibile (untrust, dmz, guest, external, internet, wan, public). Investigare per primo. |
REVIEW_POLICY | Portale abilitato e associato a zone con nomi interni. Esaminare la security policy per confermare la raggiungibilità. |
EXPOSED_LIKELY è un suggerimento, non un verdetto — i nomi delle zone sono convenzioni dell'operatore, non imposizioni. Lo script non può sostituire un'analisi della security policy; ordina l'output della flotta per indicare dove concentrare l'attenzione per prima.
Fanno:
<captive-portal> per vsys (il nome dell'elemento dello schema è sempre captive-portal, indipendentemente dalla denominazione dell'interfaccia utente o dalla versione PAN-OS).EXPOSED_LIKELY emergono per prime nell'output della flotta.X-PAN-KEY così rimane fuori dai log di accesso URL e dagli argomenti di processo.Non fanno:
La chiave API PAN-OS eredita il ruolo e le autorizzazioni dell'utente che la genera.
Avvertenza importante: non esiste una concessione XML API in sola lettura in PAN-OS.
Le autorizzazioni del Ruolo Amministratore sulla scheda XML API sono binarie Abilita/Disabilita per categoria — Configurazione, Richieste Operative, Commit, Export, Import, Report, Log, Agente User-ID. Abilitare Configurazione per XML API consente sia
showche azioniset/edit/delete/move/rename/clone. Abilitare Richieste Operative consente operazioni<request>arbitrarie inclusi<request><restart>. Le schede Web UI e REST API offrono l'opzione Sola Lettura; la scheda XML API no.Un "utente audit" creato abilitando queste categorie XML API detiene piena autorità di scrittura XML API sul dispositivo. Tratta la chiave risultante come una credenziale privilegiata: limita la sua durata alla finestra di audit, conservala in un gestore di segreti e disabilita l'utente quando il lavoro è completato.
Riferimento PAN canonico: Get Your API Key (PAN-OS XML API).
Sul firewall (o su Panorama, se stai usando audit_fleet.py):
Crea il Ruolo Amministratore. Vai su Device > Admin Roles (o Panorama > Admin Roles). Clicca Add.
audit-config-and-op.Crea l'utente audit. Vai su Device > Administrators (o Panorama > Administrators). Clicca Add.
audit-cve-2026-0300.audit-config-and-op.Genera la chiave API con le credenziali del nuovo utente. PAN-OS non espone un pulsante "genera chiave API" nella WebUI — l'endpoint keygen è il percorso supportato. Usa un corpo POST così le credenziali non vengono registrate nei log di accesso 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 legge la password senza mostrarla sul terminale e senza inserirla nella cronologia della shell. Lo script legge la PAN_API_KEY risultante dall'ambiente e la invia tramite l'header HTTP X-PAN-KEY — né la password né la chiave compaiono nei log di accesso URL o in ps auxww mentre lo script è in esecuzione.
Disabilita l'utente quando il lavoro di audit è completato. Vai su Device > Administrators, individua audit-cve-2026-0300, clicca Delete (o disabilita l'utente). Esegui il commit. Questo invalida tutte le chiavi generate per quell'utente.
read -rs copre la password. Per la chiave in PAN_API_KEY, preferisci impostarla in modo interattivo tramite lo snippet sopra piuttosto che incollarla da un file. Se devi caricarla da un file, usa set +o history per la sessione.--insecure in entrambi gli script di audit disabilita completamente il controllo del nome host TLS e la validazione del certificato. Qualsiasi attaccante sul percorso può fare MITM della risposta di audit e riportare portal_enabled=False per un dispositivo compromesso. Lo script audit_fleet.py richiede --accept-mitm-risk insieme a --insecure per le scansioni di flotta perché il raggio d'esplosione di una risposta avvelenata è a livello di flotta.0 — nessun portale abilitato su alcun vsys sottoposto ad audit2 — nessun vsys trovato (configurazione transitoria o non supportata)3 — portale abilitato su almeno un vsys (revisione richiesta)4 — chiamata API fallita (autenticazione, TLS, rete)L'uscita non zero su "portale abilitato" è intenzionale — ti consente di collegare lo script a pipeline CI / scansione flotta che necessitano di un segnale pulito.
Concesso in licenza sotto Apache License, Versione 2.0. Vedi LICENSE per i termini completi.
L'uso commerciale è consentito; è richiesta l'attribuzione (conserva l'avviso di copyright e il file di licenza nelle opere derivate).
Copyright 2026 Tailwind Resource Group.