漏洞概述 漏洞名称: CWE-346: CORS Origin Validation Bypass via in in 漏洞描述: Jupyter Server 使用 来验证 头与 配置。由于 仅在字符串开头锚定,攻击者可以通过控制域名(如 )绕过验证,匹配到仅信任 的模式。这影响了 CORS、WebSocket、referer 和登录重定向的所有 5 个位置。 影响范围 受影响版本: v1.12.0 至 v2.17.0 严重性: 中等 (6.1) 攻击向量: 网络 攻击复杂度: 低 特权要求: 无 用户交互: 无 影响: 更改 机密性: 低 完整性: 低 可用性: 无 修复方案 建议修复: 在所有 5 个位置用 替换 。 自 Python 3.4 起可用,Jupyter Server 需要 Python 3.8+。 修复代码: POC 代码 步骤 1: 启动 Jupyter Server 并配置 。 步骤 2: 验证合法来源被接受(预期行为)。 步骤 3: 演示绕过 - 攻击者控制的域名扩展模式。 步骤 4: 5 个易受攻击的代码位置。 PoC 攻击 1: 登录重定向到攻击者域名(无需 cookie)。 PoC 攻击 2: 跨源 API 访问和 WebSocket 内核劫持。 环境 jupyter_server: v2.17.0(最新,也验证了 HEAD 主分支的源代码) Python: 3.13 受影响版本: v1.12.0 至 v2.17.0(基于 git 历史引入的提交 3ecb4e01 / PR #603 用于 handlers.py,884b72e7 / PR #1047 用于 websocket.py) 影响 当配置 时,攻击者可以: 登录后重定向到攻击者域名: 在 允许重定向到攻击者域名进行身份验证。无需 cookie 或会话要求 - 直接钓鱼向量。 劫持内核 WebSocket 连接: 在 使用相同的易受攻击检查。在具有跨源 cookie 的部署中,内核 WebSocket 连接允许攻击者在受害者的内核中执行任意代码。 跨源读取 API 响应: 文件内容、内核列表、会话数据。 头设置为攻击者的来源,通过 在 使响应可读。WebSocket 源检查 ( ) 也通过。 绕过 XSS 保护: 在 被击败。先前的建议 (GHSAs-64x5-55w-9974) 通过 referer 验证修复了 XSS,但该修复依赖于 匹配,这本身被 破坏。 范围限制 这需要配置 。默认值为空字符串(易受攻击的代码路径未触及)。然而, 是启用特定跨源访问的文档化方法,用户期望完全字符串匹配。 不一致性说明 代码库在 中正确使用 进行 URL 到资源的匹配,但这从未应用于来源验证。 发生情况 参考 PR #603 https://docs.python.org/3/library/re.html#re.fullmatch https://docs.python.org/3/library/re.html#re.match https://github.com/advisories/GHSA-64x5-55w-9974