
Détecter en toute sécurité si une cible PAN-OS est vulnérable à CVE-2026-0265.
Déterminez en toute sécurité si un portail GlobalProtect de Palo Alto Networks PAN-OS est vulnérable à CVE-2026-0265 sans authentifier aucune session ni modifier aucun état.
CVE-2026-0265 est un contournement d'authentification à distance affectant PAN-OS et Panorama qui se déclenche lorsqu'un profil d'authentification utilise le service d'authentification cloud (CAS). La fonction vulnérable pan_auth_verify dans libpanmp_mp.so délègue la vérification de la signature du jeton Web JSON uniquement sur l'en-tête alg contrôlé par l'attaquant — un JWT falsifié avec alg=HS256 et HMAC-SHA256(cas_public_key_pem, header.payload) comme signature est accepté comme s'il s'agissait d'un véritable jeton CAS signé RS256, permettant à tout attaquant d'usurper l'identité de n'importe quel utilisateur.
Le bogue est accessible via deux surfaces d'attaque — le portail GlobalProtect (/saml/acs.esp, génère une session VPN) et l'interface de gestion (/SAML20/SP/ACS, génère un administrateur PAN-OS complet). Cet outil ne couvre que la surface du portail GlobalProtect.
Une seule requête anonyme GET /global-protect/prelogin.esp révèle tout ce qui est nécessaire pour un verdict faisant autorité :
<cas-auth>yes|no</cas-auth> défini directement par la configuration d'authentification du portail. Une valeur de yes confirme que la précondition de la CVE est remplie pour cet écouteur.<saml-request>. Son décodage donne la chaîne de version faisant autorité du pare-feu, qui est ensuite recoupée avec la matrice de correctifs par base de l'avis du fournisseur pour produire le verdict..saas — Les builds gérées par le cloud PA ne sont pas affectées selon la clarification de Palo Alto (2026-05-21), quel que soit le numéro de build de base sous-jacent.Le script émet le verdict, la version PanOS signalée par le pare-feu (afin qu'un défenseur puisse vérifier l'évaluation par rapport à son inventaire), et le contexte de triage de base (prelogin_status, prelogin_msg, http_status, notes d'erreur). Si votre pipeline nécessite des métadonnées d'appareil plus riches, recoupez l'URL cible avec votre propre inventaire.
git clone https://github.com/BishopFox/CVE-2026-0265-check
cd CVE-2026-0265-check
pip install requests
Nécessite Python 3.9+ et le paquet requests.
Passez une ou plusieurs cibles comme arguments positionnels, via --targets-file, ou sur stdin. Les noms d'hôtes et les chaînes host:port sont automatiquement enveloppés en https://.
python3 CVE-2026-0265-check.py [options] <target> [<target>...]
| Option | Signification |
|---|---|
-f, --targets-file FILE | Lire une cible par ligne à partir de FILE |
-t, --timeout SECONDS | Délai d'attente par requête. Par défaut : 20.0 |
-c, --concurrent N | Maximum de cibles parallèles. Par défaut : 5 |
-b, --brief | Émettre <url>\t<verdict>\t<panos_version> par cible au lieu du JSON complet |
--user-agent UA | Remplacer le User-Agent de la sonde. La valeur par défaut est une chaîne Chrome de type navigateur qui contourne la restriction de version du client GP de gpsvc ; utilisez un UA personnalisé si vous avez besoin de visibilité d'audit dans les logs d'accès et que vous n'avez pas besoin du chemin restreint par version. |
La sortie par défaut est un objet JSON par cible sur stdout (compatible jq).
Le script émet l'une des trois classes de verdict par cible. Les verdicts Déterminé répondent à la question de vulnérabilité de manière autoritaire pour cette cible. Les verdicts Indéterminé indiquent que la sonde n'a pas pu conclure et qu'un suivi de l'opérateur est nécessaire.
| Verdict | Quand |
|---|---|
VULNERABLE | CAS attaché, PanOSversion strictement inférieure au correctif de l'avis pour cette base, pas .saas. |
| Verdict | Quand |
|---|---|
PATCHED | CAS attaché, PanOSversion égale ou supérieure au correctif de l'avis pour cette base. |
NOT-AFFECTED-SAAS | CAS attaché mais PanOSversion a le suffixe .saas (géré par le cloud PA ; non affecté selon PA 2026-05-21). |
NOT-AFFECTED-NO-CAS | Prelogin a retourné succès mais <cas-auth> indique SAML / RADIUS / LDAP / auth locale. La CVE ne s'applique pas à cet écouteur. |
NOT-AFFECTED-NOT-GLOBALPROTECT | La forme de la réponse n'est pas un portail GP (par ex. « GlobalProtect portal does not exist »). Hors scope. |
| Verdict | Quand | Suivi suggéré |
|---|---|---|
UNDETERMINED-VERSION-GATED | gpsvc a retourné « CAS is not supported by the client ». CAS est attaché mais la sonde a été rejetée pour des raisons de User-Agent ; PanOSversion ne peut pas être lue depuis cette réponse. | Réessayer avec --user-agent défini sur une chaîne de client GP réelle. |
UNDETERMINED-MTLS-GATED | « Valid client certificate is required » dans la réponse prelogin. Surface d'authentification cachée derrière une passerelle mTLS. | Confirmer le build via un canal séparé (version autoritaire du client, ou une sonde avec un certificat client valide). |
UNDETERMINED-ERROR | Échec réseau, réponse malformée, PanOSversion non analysable, ou échec de décodage du Token malgré cas-auth=yes. | Réexécuter ; si persistant, la cible n'est probablement pas joignable depuis cette position. |
$ python3 CVE-2026-0265-check.py -b -f targets.txt
https://gp1.customer.example VULNERABLE 11.1.6-h23
https://gp2.customer.example PATCHED 11.1.6-h32
https://vpn.cloud.customer.example NOT-AFFECTED-SAAS 11.2.7-h9.saas
https://mgmt.customer.example NOT-AFFECTED-NO-CAS -
https://www.customer.example NOT-AFFECTED-NOT-GLOBALPROTECT -
https://internal-vpn.customer.example UNDETERMINED-MTLS-GATED -
$ python3 CVE-2026-0265-check.py gp.customer.example | jq .
{
"target": "https://gp.customer.example",
"verdict": "VULNERABLE",
"panos_version": "11.1.6-h23",
"prelogin_status": "Success",
"http_status": 200,
"notes": [
"11.1.6-h23 is below the advisory's patched hotfix for this base."
]
}
gpsvc limite le débit lors de sondages consécutifs — le script réessaie déjà chaque HTTP 503 avec un backoff croissant, mais -c 5 et un -t modéré sont conviviaux pour les grandes flottes :
cat all-targets.txt | python3 CVE-2026-0265-check.py -b -c 5
Le script ne peut produire un verdict déterminé que lorsque :
NOT-AFFECTED-NOT-GLOBALPROTECT ou UNDETERMINED-ERROR).UNDETERMINED-MTLS-GATED) ou par une vérification agressive du User-Agent (sinon UNDETERMINED-VERSION-GATED).Distribué sous une licence MIT.