FlawOpen

flawopen.com/Teardowns/cve-2026-76504-cisco-sdwan-api-authentication-bypass

● CVE-2026-76504 · CVSS 9.8[1] · Crítica
Investigación · FlawOpen

CVE-2026-76504: omisión de autenticación en Cisco SD-WAN Manager

CVE-2026-76504 permite que un atacante remoto sin autenticar eluda una regla de autenticación de la API de Cisco Catalyst SD-WAN Manager y obtenga acceso de administrador. Cisco confirma explotación activa; actualiza a la versión corregida de tu rama e investiga el gestor antes de darlo por limpio.[1], [5]

Vector CVSSCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H[1]
💡 Explicación en Lenguaje Sencillo (ELI5)

Imagina una puerta protegida cuyo control de seguridad reconoce una sola forma escrita de su dirección. El atacante cambia la escritura mediante codificación URI, y una parte del sistema entiende que es la misma puerta mientras que la regla de seguridad no. Cisco afirma que esta discrepancia permitía saltarse la autenticación y acceder a la API como administrador. La corrección consiste en tratar la dirección de forma coherente y aplicar la misma regla de acceso; para los operadores, la solución admitida por Cisco es actualizar el software.[1]

Conceptos Clave y Términos

Codificación URI
Forma de representar caracteres de una ruta URL mediante bytes codificados con porcentaje. Todas las capas deben decodificar y comparar la ruta de manera coherente.[1], [7]
Omisión de autenticación
Una solicitud llega a una función protegida sin que el sistema establezca la identidad del solicitante como se exige.[1]
Regla de sesión de API
Regla del gestor que comprueba si una solicitud de API tiene una sesión autenticada válida antes de llegar al endpoint.[1]
CWE-177
Tratamiento incorrecto de la codificación de URL: procesar de forma incoherente los datos de URL codificados puede invalidar una decisión de seguridad. Cisco asigna esta debilidad al CVE.[1], [7]

Mapeos de marcos

Análisis de Causa Raíz

Cisco atribuye CVE-2026-76504 al tratamiento incorrecto de la codificación URI en solicitudes HTTP dentro de la autenticación de sesión de la API de Catalyst SD-WAN Manager. Una solicitud manipulada puede eludir una regla que restringe un endpoint concreto de la API y obtener acceso como administrador. Cisco le asigna CVSS 3.1 9,8 Crítico, indica que el producto está afectado independientemente de la configuración y afirma que PSIRT conoció explotación activa en septiembre de 2026. El advisory muestra una solicitud URI codificada a j_security_check como ejemplo de IOC y advierte expresamente que puede usarse cualquier carácter codificado; no conviertas esa muestra en una firma de detección completa. Cisco no publica el código vulnerable ni el diff del parche, por lo que el par de código siguiente es un diseño ilustrativo de autorización, no código de Cisco ni una reproducción. Cisco enumera versiones corregidas por rama y dice que no hay una solución temporal que remedie por completo el fallo. Las restricciones de red y el escudo Live Protect son mitigaciones temporales; el escudo puede afectar inicios de sesión legítimos y no sustituye la actualización.[1], [5]

Versiones corregidas de CVE-2026-76504 por tipo de despliegue

Despliegue / ramaVersión corregidaAcción requerida
Versiones locales anteriores a 20.9Migra a una rama compatible con una versión corregida publicada.Migra; no permanezcas en una rama antigua sin soporte.
Rama local 20.920.9.10.1Actualiza todos los managers a esta versión o una posterior de la rama compatible.
Rama local 20.1220.12.8.2Actualiza todos los managers a esta versión o una posterior de la rama compatible.
Rama local 20.1520.15.6.1Actualiza todos los managers a esta versión o una posterior de la rama compatible.
Rama local 20.1820.18.4.1Actualiza todos los managers a esta versión o una posterior de la rama compatible.
Rama local 26.126.1.2.1Actualiza todos los managers a esta versión o una posterior de la rama compatible.
Rama local 26.226.2.1Actualiza todos los managers a esta versión o una posterior de la rama compatible.
Cisco SD-WAN Cloud (Cisco Managed)20.15.605 o posterior; Cisco indica que el servicio alojado ya está corregido.Confirma que se trata del servicio gestionado; sus clientes no deben realizar ninguna acción para este despliegue.

Flujo de Ataque Paso a Paso

Paso 1

Una solicitud remota llega a la API del gestor

No se necesita cuenta ni interacción del usuario. La exposición a Internet aumenta el riesgo; Cisco indica que el fallo afecta independientemente de la configuración.[1]

Paso 2

La ruta codificada elude una regla de autenticación

Cisco identifica un tratamiento incoherente de la codificación URI en la autenticación de sesión de la API. La información pública no revela la implementación vulnerable.[1]

Paso 3

La API trata la solicitud como administrador

La explotación exitosa concede privilegios de administrador. Cisco confirma explotación activa, pero no publica una cadena completa posterior al acceso.[1], [5]

Paso 4

Actualiza e investiga

Recopila los archivos admin-tech, actualiza todos los gestores a la versión corregida correspondiente y luego pide a Cisco TAC que examine las pruebas. No esperes a TAC para actualizar.[1], [2]

Código Fuente: Vulnerable vs. Seguro

Cisco no publica el código vulnerable ni el diff de la corrección. Este ejemplo Python muestra una regla general de diseño, no código de Cisco: el enrutamiento y la autorización deben usar un único destino de solicitud canónico y validado, y los endpoints protegidos deben exigir una identidad autenticada. Usa la semántica de normalización documentada por el router/framework; no añadas decodificación improvisada ni decodifiques rutas dos veces. La remediación admitida para CVE-2026-76504 es actualizar a la versión corregida de la rama indicada por Cisco.[1], [7]

Fragmento de origen: Ejemplo ilustrativo en Python de canonicalización URI y límite de autorización; no es código de Cisco

IMPLEMENTACIÓN VULNERABLE
from urllib.parse import unquote, urlsplit


def dispatch(raw_target, session, routes):
    # Una capa comprueba la ruta que aún está codificada.
    path_for_auth = urlsplit(raw_target).path
    if path_for_auth.startswith("/api/") and session is None:
        raise PermissionError("authentication required")

    # Una capa posterior decodifica antes de buscar la ruta. Las dos decisiones pueden no coincidir.
    route_path = unquote(path_for_auth)
    return routes[route_path]()
PARCHE SEGURO Y ROBUSTO
import re
from urllib.parse import unquote, urlsplit


def canonical_path(raw_target):
    raw_path = urlsplit(raw_target).path
    if re.search(r"%(?![0-9A-Fa-f]{2})", raw_path):
        raise ValueError("malformed URI encoding")

    path = unquote(raw_path, errors="strict")
    if "%" in path or "\\" in path:
        raise ValueError("ambiguous path encoding")
    if any(part in {".", ".."} for part in path.split("/")):
        raise ValueError("path traversal segment")
    return path


def dispatch(raw_target, session, routes):
    path = canonical_path(raw_target)  # Decode and validate exactly once.
    route = routes.get(path)
    if route is None:
        raise LookupError("route not found")

    requires_authentication, handler = route
    if requires_authentication and session is None:
        raise PermissionError("authentication required")
    return handler()

Lista de Verificación de Seguridad para Ingeniería

Fuentes