flawopen.com/Teardowns/cve-2026-76504-cisco-sdwan-api-authentication-bypass
CVE-2026-76504:Cisco SD-WAN Manager 身份验证绕过
CVE-2026-76504 允许未认证的远程攻击者绕过 Cisco Catalyst SD-WAN Manager 中的 API 身份验证规则,并以管理员权限访问 API。Cisco 已确认该漏洞遭到主动利用;请升级到对应分支的修复版本,并在确认设备安全前调查管理器是否已被入侵。[1], [5]
想象一扇受保护的门,安检只识别地址的一种书写方式。攻击者通过 URI 编码改写地址,一部分系统仍把它识别为同一扇门,而安全规则却没有识别出来。Cisco 表示,这种差异使请求可以跳过身份验证并以管理员身份访问 API。修复必须统一处理地址并执行相同的访问规则;对运维人员而言,Cisco 支持的修复方式是升级软件。[1]
核心概念与专有名词
框架映射
根本原因剖析 (Root Cause)
Cisco 将 CVE-2026-76504 归因于 Catalyst SD-WAN Manager API 会话身份验证中对 HTTP 请求 URI 编码处理不当。特制请求可绕过用于限制特定 API 端点的身份验证规则,并以管理员身份获得访问权限。Cisco 给出的评分为 CVSS 3.1 9.8(严重),称产品不论系统配置如何都会受影响,并表示 PSIRT 于 2026 年 9 月获悉该漏洞正在遭到主动利用。公告将 URI 编码的 j_security_check 请求列为 IOC 示例,并明确警告任何一个 URI 编码字符都可能被利用;不要把该示例当作完整检测特征。Cisco 没有公开易受攻击的源代码或补丁差异,因此下方代码对仅用于说明授权设计,不是 Cisco 代码或漏洞复现。Cisco 按软件分支列出了修复版本,并说明没有能够彻底解决该漏洞的临时方案。网络访问限制和 Live Protect 防护盾均为临时缓解措施;防护盾可能影响正常登录,不能替代升级。[1], [5]
CVE-2026-76504 按部署方式划分的修复版本
| 部署方式 / 版本线 | 修复版本 | 所需操作 |
|---|---|---|
| 早于 20.9 的本地部署版本 | 迁移到已发布修复版本的受支持版本线。 | 执行迁移;不要继续使用不受支持的旧版本线。 |
| 本地部署 20.9 版本线 | 20.9.10.1 | 将每个 Manager 升级到此版本或该受支持版本线中的更高版本。 |
| 本地部署 20.12 版本线 | 20.12.8.2 | 将每个 Manager 升级到此版本或该受支持版本线中的更高版本。 |
| 本地部署 20.15 版本线 | 20.15.6.1 | 将每个 Manager 升级到此版本或该受支持版本线中的更高版本。 |
| 本地部署 20.18 版本线 | 20.18.4.1 | 将每个 Manager 升级到此版本或该受支持版本线中的更高版本。 |
| 本地部署 26.1 版本线 | 26.1.2.1 | 将每个 Manager 升级到此版本或该受支持版本线中的更高版本。 |
| 本地部署 26.2 版本线 | 26.2.1 | 将每个 Manager 升级到此版本或该受支持版本线中的更高版本。 |
| Cisco SD-WAN Cloud (Cisco Managed) | 20.15.605 或更高版本;Cisco 表示托管服务已修复。 | 确认使用的是托管服务;此托管更新无需客户执行操作。 |
攻击执行流程分解
源代码对比:漏洞与安全实现
Cisco 未公开易受攻击的源代码或补丁差异。此 Python 示例说明的是通用设计规则,并非 Cisco 代码:路由和授权必须使用同一个经过验证的规范化请求目标,受保护端点必须要求经过身份验证的主体。遵循路由器/framework 文档规定的规范化语义;不要添加临时解码逻辑或对路径重复解码。CVE-2026-76504 的受支持修复方式是升级到 Cisco 为相应分支指定的修复版本。[1], [7]
源码摘录: URI 规范化与授权边界的 Python 示例;并非 Cisco 源码
from urllib.parse import unquote, urlsplit
def dispatch(raw_target, session, routes):
# 一层检查尚未解码的路径。
path_for_auth = urlsplit(raw_target).path
if path_for_auth.startswith("/api/") and session is None:
raise PermissionError("authentication required")
# 后续层会在查找路由前解码。两处判断可能不一致。
route_path = unquote(path_for_auth)
return routes[route_path]()
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()
工程与系统安全加固清单
- ✓盘点所有 Catalyst SD-WAN Manager,包括集群成员和灾难恢复站点;记录具体软件分支和构建版本。[1], [2]
- ✓将每台本地管理器升级到 Cisco 为其当前主版本列出的首个修复版本;未经 TAC 明确指导,不要升级到更高的主版本。20.9 之前的版本必须按照 Cisco 的兼容性指导迁移到受支持的修复分支。[1], [2]
- ✓升级前,从每台管理器、集群成员和 DR 站点收集启用了 Log 和 Tech 的 admin-tech 文件;不要等待 IOC 检查结果再打补丁。[2]
- ✓创建 Cisco TAC Severity 3 支持案例,在标题中注明
CVE-2026-76504,并提交收集的文件进行 IOC 检查;若发现入侵迹象,遵循 TAC 的修复建议。[1], [2] - ✓检查
serviceproxy-access.log和vmanage-server.log中来自未知或未授权地址的j_security_check请求,以及viptela-reserved-账户的异常活动;%6a只是示例,并非完整特征。[1] - ✓在所有管理器升级前,仅允许可信主机访问管理接口,并在过滤设备后保护控制组件;这只能暂时降低暴露面,不能修复漏洞。[1]
- ✓评估 Live Protect 防护盾对正常登录的影响后,仅将其作为临时部分防护;仍须安排软件升级。[1]
- ✓对于 Cisco SD-WAN Cloud (Cisco Managed),确认服务报告的版本为 20.15.605 或更高;Cisco 表示托管升级无需客户操作。[1], [2]
参考来源
- Cisco Security Advisory — CVE-2026-76504
- Cisco remediation workflow for the September 2026 SD-WAN advisory
- Cyber Security Agency of Singapore active-exploitation advisory
- Canadian Centre for Cyber Security advisory AV26-978
- CISA Known Exploited Vulnerabilities Catalog — CVE-2026-76504
- NVD record — CVE-2026-76504
- MITRE CWE-177 — Improper Handling of URL Encoding