romain-deperne/CVE-2026-40864

GitHub: romain-deperne/CVE-2026-40864

该项目披露并复现了 JupyterHub 因错误信任 `Sec-Fetch-Mode: no-cors` 而导致 XSRF 防护被跨域表单 POST 绕过的漏洞(CVE-2026-40864),附带概念验证代码及修复与缓解指引。

Stars: 0 | Forks: 0

# CVE-2026-40864 — 通过跨域表单 POST 绕过 JupyterHub XSRF (`Sec-Fetch-Mode: no-cors`) **严重程度**:中等 **CWE**:CWE-352 — 跨站请求伪造 (XSRF) **受影响版本**:`jupyterhub` 4.1.0 ≤ version < 5.4.5(已在 **5.4.5** 中修复) **安全公告**:[GHSA-m68r-v472-jgq9](https://github.com/advisories/GHSA-m68r-v472-jgq9) **NVD**:https://nvd.nist.gov/vuln/detail/CVE-2026-40864 **致谢**:Romain Deperne ## TL;DR JupyterHub 的 XSRF 防护(在 4.1.0 中经过重新设计)使用 `Sec-Fetch-Mode` 请求头来判断请求是否同源。它将 `Sec-Fetch-Mode: no-cors` 视为同源请求——但是 `no-cors` 恰恰是浏览器在发送**跨域“简单”表单提交**时所使用的模式。因此,发往 Hub 表单端点(`/hub/spawn`、`/hub/accept-share`)的跨域 HTML 表单 POST 请求完全绕过了 XSRF 检查。 JSON API 不受此影响(它要求使用非简单内容类型,这会强制触发 CORS preflight)。只有 HTML 表单端点会以这种方式被访问到。 ## 发现过程 XSRF 逻辑会直接短路判定为“受信任”,前提是请求包含一组旨在匹配同源导航的 `Sec-Fetch-*` 状态。`Sec-Fetch-Mode: no-cors` 被包含在这个受信任的集合中。但是 `no-cors` 是浏览器为发送到不同源的普通 `
` 分配的模式——这正是 token 本应阻止的经典 CSRF 攻击向量。因此,任何接受简单表单主体且仅依赖此 XSRF 防护的状态变更端点,都可以在跨域情况下被伪造。 映射到真实的端点就是:`/hub/spawn`(启动受害者服务器)和 `/hub/accept-share`(让受害者接受攻击者服务器的共享)都是此防护机制背后的表单 POST 请求。 ## 影响 - **`/hub/spawn`** — 攻击者页面可以在未经同意的情况下生成受害者的单用户服务器(导致资源消耗/意外状态;攻击者无法获取该服务器的访问权限)。 - **`/hub/accept-share`** — 当攻击者是获准共享自己服务器的 JupyterHub 用户时,他们可以强制受害者*接受共享*,从而让受害者获得对**攻击者**服务器的访问权限(这是进一步进行社会工程学/数据投放攻击的铺垫步骤)。 ## 根本原因 将 `Sec-Fetch-Mode` 作为来源判定依据是不可靠的:`no-cors` 并不意味着同源。5.4.5 中的修复已停止将 `no-cors` 视为同源。无法立即升级的运维人员可以在反向代理处直接丢弃携带 `Sec-Fetch-Mode: no-cors` 的请求。 ## 概念验证 `poc/csrf_spawn.html` — 将其托管在任何攻击者的源上,并让已登录的 JupyterHub 用户打开它。自动提交的表单会向 `/hub/spawn` 发出跨域 POST 请求(浏览器发送 `Sec-Fetch-Mode: no-cors`);存在漏洞的版本会在没有有效 `_xsrf` token 的情况下接受该请求,并启动受害者的服务器。将 `action` 指向 `/hub/accept-share` 即为接受共享的利用变体。 ``` 1. Edit TARGET-JUPYTERHUB in poc/csrf_spawn.html 2. Serve the file from an attacker origin (any static host) 3. Open it in a browser already authenticated to the target Hub 4. Observe the victim's server spawn with no XSRF token supplied ``` ## 漏洞披露时间线 - 通过 GitHub Security Advisory 进行私下报告 - 已在 JupyterHub **5.4.5** 中修复 - 安全公告 **GHSA-m68r-v472-jgq9** 已发布;已分配 CVE-2026-40864 *已负责任地披露。PoC 在修复版本发布后予以公开。*
标签:JupyterHub, XSRF绕过, 后端开发, 多模态安全, 数据可视化, 漏洞分析, 跨站请求伪造, 路径探测, 逆向工具