FlawOpen

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

● CVE-2026-76504 · CVSS 9.8[1] · Crítica
Pesquisa · FlawOpen

CVE-2026-76504: desvio de autenticação no Cisco SD-WAN Manager

A CVE-2026-76504 permite que um atacante remoto não autenticado contorne uma regra de autenticação da API do Cisco Catalyst SD-WAN Manager e obtenha acesso à API como administrador. A Cisco confirma exploração ativa; atualize para a versão corrigida da sua ramificação e investigue o gerenciador antes de considerá-lo limpo.[1], [5]

Vetor CVSSCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H[1]
💡 Explicação em Linguagem Simples (ELI5)

Imagine uma porta protegida cujo controle de segurança reconhece apenas uma forma escrita do endereço. O invasor altera a grafia usando codificação de URI, e uma parte do sistema entende que é a mesma porta enquanto a regra de segurança não entende. A Cisco diz que essa divergência permitia ignorar a autenticação e acessar a API como administrador. A correção é tratar o endereço de forma consistente e aplicar a mesma regra de acesso; para operadores, a correção suportada pela Cisco é atualizar o software.[1]

Conceitos Centrais e Termos

Codificação de URI
Forma de representar caracteres em um caminho de URL usando bytes codificados por porcentagem. Todas as camadas precisam decodificar e comparar o caminho de maneira consistente.[1], [7]
Desvio de autenticação
Uma solicitação alcança uma função protegida sem que o sistema confirme a identidade do solicitante conforme exigido.[1]
Regra de sessão da API
Regra do gerenciador que verifica se uma solicitação à API tem uma sessão autenticada válida antes de chegar ao endpoint.[1]
CWE-177
Tratamento inadequado de codificação de URL: processar dados de URL codificados de forma inconsistente pode comprometer uma decisão de segurança. A Cisco atribui essa fraqueza à CVE.[1], [7]

Mapeamentos de frameworks

Análise de Causa Raiz

A Cisco atribui a CVE-2026-76504 ao tratamento inadequado da codificação de URI em solicitações HTTP na autenticação baseada em sessão da API do Catalyst SD-WAN Manager. Uma solicitação criada especialmente pode contornar uma regra de autenticação que restringe um endpoint específico da API e conceder acesso como administrador. A Cisco classifica o problema como CVSS 3.1 9,8 Crítico, informa que o produto é afetado independentemente da configuração e relata que sua equipe PSIRT tomou conhecimento de exploração ativa em setembro de 2026. O advisory mostra uma solicitação codificada a j_security_check como exemplo de IOC e alerta que qualquer caractere codificado na URI pode ser usado; não trate essa amostra como assinatura completa de detecção. A Cisco não publica o código vulnerável nem o diff do patch, portanto o par de código abaixo ilustra um projeto de autorização, não é código Cisco nem reprodução. A Cisco lista versões corrigidas por ramificação e diz que não há contorno que resolva totalmente a falha. Restrições de rede e o escudo Live Protect são mitigações temporárias; o escudo pode afetar logins legítimos e não substitui a atualização.[1], [5]

Versões corrigidas da CVE-2026-76504 por tipo de implantação

Implantação / linhaVersão corrigidaAção necessária
Versões locais anteriores à 20.9Migre para uma linha compatível com versão corrigida publicada.Migre; não permaneça em uma linha antiga sem suporte.
Linha local 20.920.9.10.1Atualize todos os managers para esta versão ou posterior na linha compatível.
Linha local 20.1220.12.8.2Atualize todos os managers para esta versão ou posterior na linha compatível.
Linha local 20.1520.15.6.1Atualize todos os managers para esta versão ou posterior na linha compatível.
Linha local 20.1820.18.4.1Atualize todos os managers para esta versão ou posterior na linha compatível.
Linha local 26.126.1.2.1Atualize todos os managers para esta versão ou posterior na linha compatível.
Linha local 26.226.2.1Atualize todos os managers para esta versão ou posterior na linha compatível.
Cisco SD-WAN Cloud (Cisco Managed)20.15.605 ou posterior; a Cisco informa que o serviço hospedado está corrigido.Confirme que se trata do serviço gerenciado; não é necessária ação do cliente para essa atualização.

Fluxo de Ataque Passo a Paso

Passo 1

Uma solicitação remota chega à API do gerenciador

Não é necessária conta nem interação do usuário. A exposição à internet aumenta o risco; o fornecedor diz que a falha vale independentemente da configuração.[1]

Passo 2

Dados de caminho codificados por URI contornam uma regra

A Cisco aponta tratamento inconsistente da codificação de URI na autenticação de sessão da API. O material público não revela a implementação vulnerável.[1]

Passo 3

A API trata a solicitação como administrador

A exploração bem-sucedida concede privilégios de administrador. A Cisco confirma exploração ativa, mas não publica uma cadeia completa após o acesso.[1], [5]

Passo 4

Atualize e investigue

Colete os arquivos admin-tech, atualize todos os gerenciadores para a versão corrigida adequada e depois peça ao Cisco TAC que examine as evidências. Não espere o TAC para atualizar.[1], [2]

Código-Fonte: Vulnerável vs. Seguro

A Cisco não publica o código vulnerável nem o diff da correção. Este exemplo Python mostra uma regra geral de projeto, não código Cisco: roteamento e autorização precisam usar um único destino de solicitação canônico e validado, e endpoints protegidos devem exigir uma identidade autenticada. Use a semântica de normalização documentada pelo roteador/framework; não adicione decodificação improvisada ou decodifique caminhos duas vezes. A remediação suportada para CVE-2026-76504 é atualizar para a versão corrigida da ramificação indicada pela Cisco.[1], [7]

Trecho de origem: Exemplo ilustrativo em Python de canonicalização de URI e limite de autorização; não é código Cisco

IMPLEMENTAÇÃO VULNERÁVEL
from urllib.parse import unquote, urlsplit


def dispatch(raw_target, session, routes):
    # Uma camada verifica o caminho ainda codificado.
    path_for_auth = urlsplit(raw_target).path
    if path_for_auth.startswith("/api/") and session is None:
        raise PermissionError("authentication required")

    # Uma camada posterior decodifica antes de procurar a rota. As duas decisões podem divergir.
    route_path = unquote(path_for_auth)
    return routes[route_path]()
PATCH SEGURO E 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 Verificação de Segurança para Engenharia

Fontes