Securify-AI/CVE-2026-39275
GitHub: Securify-AI/CVE-2026-39275
该仓库记录了 Cockpit CMS 中一个高危存储型 XSS 漏洞(CVE-2026-39275),该漏洞可导致会话劫持和完整的账户接管。
Stars: 1 | Forks: 0
# CVE-2026-39275 - Cockpit CMS 中导致账户接管的存储型 XSS
[](https://www.cve.org/CVERecord?id=CVE-2026-39275)
[](https://cwe.mitre.org/data/definitions/79.html)
[](#)
[](#)
| | |
|---|---|
| **CVE ID** | CVE-2026-39275 |
| **漏洞** | 存储型跨站脚本攻击 (XSS) → 账户接管 |
| **CWE** | CWE-79 |
| **受影响版本** | Cockpit CMS `<= 2.13.5` |
| **已修复** | [`d70dc50`](https://github.com/Cockpit-HQ/Cockpit/commit/d70dc5059732fc97bd65aa3583cd0f88631a3c78) |
| **CVSS 3.1** | 8.4 (`AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N`) |
| **报告者** | Rohith - SecurifyAI 安全顾问 |
## 概述
内容集合列表视图中的一个存储型 XSS 漏洞允许任何具有内容写入权限的用户(通过 API key 或经过身份验证的编辑器会话)注入任意 JavaScript 代码,这些代码会在任何查看受影响集合项目列表的管理员或编辑器的浏览器中执行。
Cockpit 的会话 token 完全可以被 JavaScript 访问 —— session cookie 在设置时没有添加 `HttpOnly` 标志,并且 CSRF JWT 暴露在全局 `App.csrf` 变量和 `` 标签的 `data-csrf` 属性中。这使得注入的脚本能够读取这两个 token 并在外部重放它们,从而绕过 CSRF 保护,实现完全的会话劫持和账户接管。
## 根本原因
字段 `render()` 的输出在未进行输出编码的情况下直接传递给了 Vue 的 `v-html` 指令。
| 文件 | 行号 | 作用 |
|------|---------|------|
| `modules/App/assets/vue-components/fields/field-tags.js` | 25 - 34 | 标签渲染器 - 无编码 |
| `modules/App/assets/vue-components/fields/field-select.js` | 26 | 选择渲染器 - 无编码 |
| `modules/Content/views/collection/items.php` | 149 | `v-html` 接收端 |
## 概念验证
### 1. 注入 payload(低权限写入 API key)
```
curl -X POST "http://localhost:8080/api/content/item/posts" \
-H "Content-Type: application/json" \
-H "api-key: USR-" \
-d '{
"data": {
"title": "Innocent Looking Post",
"tags": [
"
",
"
"
],
"body": "Just a regular post.",
"_state": 1
}
}'
```
### 2. 触发执行
管理员或编辑器导航到 `/content/collection/items/posts`。标签渲染器返回存储的字符串,`v-html` 将其解析为真实的 `
` 元素,无效的 `src` 加载失败,随后触发 `onerror` 处理程序。
### 3. 窃取 token
现在这两个 token 都是可读的 —— 通过 `document.cookie` 读取 session cookie,通过 `App.csrf` / `document.documentElement.getAttribute('data-csrf')` 读取 CSRF JWT。一个武器化的 payload 会将两者窃取并外发:
```
```
### 4. 会话重放
攻击者重放窃取的 cookie 和 CSRF token,获得完全经过身份验证的管理员访问权限 —— 然后可以创建管理员账户、更改凭据或修改内容。
## 影响
低权限编辑器(或任何拥有内容写入 API key 的用户)可以提升为完全的管理员权限。该 payload 会被存储,并在每个查看列表的管理员/编辑器面前触发,使其成为一种持久性的、多受害者的入侵。
## 修复建议
**主要修复** - 在到达 `v-html` 之前,使用现有的 `App.utils.stripTags()` 辅助函数对渲染输出进行清理。
`field-tags.js`:
```
value = App.utils.stripTags(value); // sanitize before v-html
```
`field-select.js`:
```
return App.utils.stripTags(value); // sanitize before v-html
```
**纵深防御** - 加固 session cookie:
```
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', 1); // over HTTPS
ini_set('session.cookie_samesite', 'Strict');
```
仅仅设置 `HttpOnly` 是不够的 —— XSS 仍然可以在受害者的已验证浏览器上下文中操作 —— 因此输出编码才是最关键的修复。
## 披露时间线
| 日期 | 事件 |
|------|-------|
| 2026-03-29 | 向 Cockpit CMS 维护者报告漏洞 |
| 2026-03-29 | 维护者发布修复程序 |
| 2026-04-04 | 申请 CVE |
| 2026-06-23 | 分配 CVE-2026-39275 |
| `<发布日期>` | 公开披露 |
本资料基于协调披露原则,仅供教育和防御目的发布。请仅对您拥有或明确获得授权测试的系统使用。
### 4. 会话重放
攻击者重放窃取的 cookie 和 CSRF token,获得完全经过身份验证的管理员访问权限 —— 然后可以创建管理员账户、更改凭据或修改内容。
## 影响
低权限编辑器(或任何拥有内容写入 API key 的用户)可以提升为完全的管理员权限。该 payload 会被存储,并在每个查看列表的管理员/编辑器面前触发,使其成为一种持久性的、多受害者的入侵。
## 修复建议
**主要修复** - 在到达 `v-html` 之前,使用现有的 `App.utils.stripTags()` 辅助函数对渲染输出进行清理。
`field-tags.js`:
```
value = App.utils.stripTags(value); // sanitize before v-html
```
`field-select.js`:
```
return App.utils.stripTags(value); // sanitize before v-html
```
**纵深防御** - 加固 session cookie:
```
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', 1); // over HTTPS
ini_set('session.cookie_samesite', 'Strict');
```
仅仅设置 `HttpOnly` 是不够的 —— XSS 仍然可以在受害者的已验证浏览器上下文中操作 —— 因此输出编码才是最关键的修复。
## 披露时间线
| 日期 | 事件 |
|------|-------|
| 2026-03-29 | 向 Cockpit CMS 维护者报告漏洞 |
| 2026-03-29 | 维护者发布修复程序 |
| 2026-04-04 | 申请 CVE |
| 2026-06-23 | 分配 CVE-2026-39275 |
| `<发布日期>` | 公开披露 |
本资料基于协调披露原则,仅供教育和防御目的发布。请仅对您拥有或明确获得授权测试的系统使用。标签:Cockpit CMS, Web安全, XSS, 数据可视化, 漏洞情报, 漏洞披露, 蓝队分析