
Detectar de forma segura si un objetivo PAN-OS es vulnerable a CVE-2026-0265.
Determine de manera segura si un portal GlobalProtect de Palo Alto Networks PAN-OS es vulnerable a CVE-2026-0265 sin autenticar ninguna sesión ni modificar ningún estado.
CVE-2026-0265 es una omisión de autenticación remota que afecta a PAN-OS y Panorama, y se activa cuando un perfil de autenticación utiliza Cloud Authentication Service (CAS). La función vulnerable pan_auth_verify en libpanmp_mp.so envía la verificación de la firma del JSON Web Token basándose únicamente en el encabezado alg controlado por el atacante; se acepta un JWT falsificado con alg=HS256 y HMAC-SHA256(cas_public_key_pem, header.payload) como su firma, como si fuera un token CAS real firmado con RS256, lo que permite que cualquier atacante suplante a cualquier usuario.
El error se puede alcanzar a través de dos superficies de ataque: el portal GlobalProtect (/saml/acs.esp, genera una sesión VPN) y la interfaz de administración (/SAML20/SP/ACS, otorga privilegios de administrador PAN-OS). Esta herramienta solo cubre la superficie del portal GlobalProtect.
Una única solicitud anónima GET /global-protect/prelogin.esp revela todo lo necesario para un veredicto autorizado:
<cas-auth>yes|no</cas-auth> establecido directamente por la configuración de autenticación del portal. Un valor de yes confirma que la condición previa de CVE se cumple para este oyente.<saml-request>. Decodificarlo produce la cadena de versión autorizada del firewall, que luego se cruza con la matriz de parches y hotfixes por base del aviso del proveedor para producir el veredicto..saas — Las versiones administradas en la nube de PA no se ven afectadas según la aclaración de Palo Alto (2026-05-21), independientemente del número de versión base subyacente.El script emite el veredicto, la versión de PanOS reportada por el firewall (para que un defensor pueda verificar la evaluación contra su inventario) y contexto básico de triaje (prelogin_status, prelogin_msg, http_status, notas de error). Si su canalización necesita metadatos más ricos del dispositivo, compare la URL de destino con su propio inventario.
git clone https://github.com/BishopFox/CVE-2026-0265-check
cd CVE-2026-0265-check
pip install requests
Requiere Python 3.9+ y el paquete requests.
Pase uno o más objetivos como argumentos posicionales, mediante --targets-file o por stdin. Los nombres de host y las cadenas host:port se envuelven automáticamente a https://.
python3 CVE-2026-0265-check.py [options] <target> [<target>...]
| Flag | Significado |
|---|---|
-f, --targets-file FILE | Lee un objetivo por línea desde FILE |
-t, --timeout SECONDS | Tiempo de espera por solicitud. Por defecto: 20.0 |
-c, --concurrent N | Máximo de objetivos en paralelo. Por defecto: 5 |
-b, --brief | Emite <url>\t<verdict>\t<panos_version> por objetivo en lugar de JSON completo |
--user-agent UA | Sobrescribe el User-Agent de la sonda. El valor por defecto es una cadena de Chrome similar a un navegador que evita la compuerta de versión de cliente GP de gpsvc; use un UA personalizado si necesita visibilidad en los registros de acceso y no necesita la ruta restringida por versión. |
La salida por defecto es un objeto JSON por objetivo en stdout (compatible con jq).
El script emite una de tres clases de veredicto por objetivo. Los veredictos Determinados responden a la pregunta de vulnerabilidad de forma autorizada para ese objetivo. Los veredictos Indeterminados indican que la sonda no pudo llegar a una conclusión y se requiere seguimiento por parte del operador.
| Verdict | Cuándo |
|---|---|
VULNERABLE | CAS adjunto, PanOSversion estrictamente por debajo del hotfix parcheado del aviso para esta base, no .saas. |
| Verdict | Cuándo |
|---|---|
PATCHED | CAS adjunto, PanOSversion igual o superior al hotfix parcheado del aviso para esta base. |
NOT-AFFECTED-SAAS | CAS adjunto pero PanOSversion tiene el sufijo .saas (gestionado en la nube de PA; no afectado según PA 2026-05-21). |
NOT-AFFECTED-NO-CAS | Prelogin devuelto con éxito pero <cas-auth> indica autenticación SAML / RADIUS / LDAP / local. CVE no aplica a este oyente. |
NOT-AFFECTED-NOT-GLOBALPROTECT | La forma de la respuesta no es un portal GP (p. ej., "GlobalProtect portal does not exist"). Fuera del alcance. |
| Verdict | Cuándo | Seguimiento sugerido |
|---|---|---|
UNDETERMINED-VERSION-GATED | gpsvc devolvió "CAS is not supported by the client". CAS está adjunto pero la sonda fue rechazada por razones de User-Agent; PanOSversion no se puede leer de esta respuesta. | Reintentar con --user-agent configurado como una cadena real de cliente GP. |
UNDETERMINED-MTLS-GATED | "Valid client certificate is required" en la respuesta de prelogin. Superficie de autenticación oculta detrás de una compuerta mTLS. | Confirmar la versión a través de un canal separado (versión autorizada del cliente, o una sonda con un certificado de cliente válido). |
UNDETERMINED-ERROR | Fallo de red, respuesta malformada, PanOSversion no analizable, o fallo en la decodificación de Token a pesar de cas-auth=yes. | Reejecutar; si persiste, es probable que el objetivo no sea alcanzable desde esta posición. |
$ 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 limita la velocidad bajo sondeos consecutivos — el script ya reintenta cada HTTP 503 con retroceso creciente, pero -c 5 y un -t moderado es amigable con flotas grandes:
cat all-targets.txt | python3 CVE-2026-0265-check.py -b -c 5
El script puede producir un veredicto determinado solo cuando:
NOT-AFFECTED-NOT-GLOBALPROTECT o UNDETERMINED-ERROR).UNDETERMINED-MTLS-GATED) ni por una verificación agresiva de User-Agent (de lo contrario, UNDETERMINED-VERSION-GATED).Distribuido bajo una licencia MIT.