
PoC per CVE-2026-56423: controllo degli accessi compromesso in deleteSelection di MISP (CWE-862, un contributore cancella definitivamente i Report di Eventi/Gruppi di Condivisione di altre organizzazioni, CVSS 8.8)
deleteSelection in MISPProof of concept per una falla di autorizzazione mancante nei flussi di eliminazione bulk di MISP per Event Reports e Sharing Groups. I gestori deleteSelection autorizzano ogni elemento selezionato con un callback che ignora l'elemento e restituisce il permesso di ruolo globale del chiamante (perm_add / perm_sharing_group) invece di un controllo di proprietà per oggetto. Un contributore a bassi privilegi (il ruolo predefinito "User") può quindi inviare ID/UUID di report appartenenti a qualsiasi organizzazione e eliminarli definitivamente a livello di istanza, anche se l'azione delete per oggetto correttamente protetta nega la stessa richiesta.
| CVE | CVE-2026-56423 |
| Prodotto | MISP (Malware Information Sharing Platform) core |
| Versione affetta | MISP CE/EE ≤ 2.5.41 |
| Corretta in | 2.5.42 |
| Classe | CWE-862 — Autorizzazione mancante (controllo di accesso a livello di oggetto compromesso) |
| CVSS 3.1 | 8.8 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H) |
| Autenticazione | Autenticato, bassi privilegi (qualsiasi ruolo con perm_add, ad es. "User") |
| Pubblicata | 2026-06-22 |
| Stato | CONFERMATO — un contributore elimina il report di un'altra org su 2.5.40; negato su 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']; // ignora $itemId → booleano ruolo globale
},
]);
}
CRUDComponent::deleteSelection chiama questo checkModifyCallback per ogni id selezionato ed elimina l'oggetto ogni volta che restituisce true:
$canModify = call_user_func($options['checkModifyCallback'], $itemId, $item);
if (!$canModify) { $fails[] = $cid; continue; }
if ($Model->delete($itemId)) { $successes[] = $cid; }
Poiché il callback restituisce $this->userRole['perm_add'] — un booleano globale che è true per il ruolo predefinito "User" — la proprietà del report di destinazione non viene mai controllata. A differenza dell'azione delete($id) per oggetto singolo, che chiama correttamente EventReport::fetchIfAuthorized($this->Auth->user(), $id, 'delete') e nega i report esterni.
SharingGroupsController::deleteSelection ha lo stesso difetto usando perm_sharing_group.
La correzione in 2.5.42 (commit ada02fa, f99b3f1) sostituisce il callback con un EventReport::fetchIfAuthorized($user, $itemId, 'delete') per elemento.
Vedere ANALYSIS.md per la procedura completa.
perm_add — il ruolo predefinito User, concesso ai contributori ordinari in istanze multi-organizzazione.MISP.enable_themes = true. L'azione deleteSelection è limitata nell'ACL da AND(theming_enabled, perm_add), dove theming_enabled corrisponde all'impostazione MISP.enable_themes. Questa impostazione è disattivata per impostazione predefinita ma è un flag di funzionalità UI normale abilitato su molte istanze (alimenta l'interfaccia v2 index/list). Se disabilitata, l'azione restituisce HTTP 403 prima che venga eseguito il callback difettoso.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
| Richiesta (contributore a bassi privilegi, report esterno) | v2.5.40 | v2.5.42 |
|---|---|---|
delete/{id} correttamente protetto | 404 negato | 404 negato |
deleteSelection dello stesso report | 200 — eliminato definitivamente | 403 — "Impossibile eliminare"; report intatto |
La stessa richiesta passa da successo a negazione attraverso la correzione, e l'delete per oggetto correttamente protetto è negato in entrambi — dimostrando che il bug è l'autorizzazione per oggetto mancante in deleteSelection, non un account mal configurato. Trascrizione completa in EVIDENCE.txt.
Qualsiasi utente a bassi privilegi su un'istanza MISP condivisa può eliminare irrevocabilmente Event Reports — narrazioni analitiche allegate agli eventi di threat-intel — e Sharing Groups appartenenti ad altre organizzazioni, a livello di istanza. Questo è un compromesso di integrità/disponibilità cross-tenant di una piattaforma di threat-intelligence su cui fanno affidamento CERT, ISAC e SOC.
EventReport::fetchIfAuthorized($user, $itemId, 'delete') per ogni elemento selezionato; lo stesso schema viene applicato a Sharing Groups.Controllare i log di MISP per richieste EventReports/deleteSelection (e SharingGroups/deleteSelection) in cui l'organizzazione dell'utente agente differisce dall'organizzazione proprietaria dell'oggetto eliminato.
Ricerca e PoC di Caio Fabrício (@BiiTts).
MIT — vedere LICENSE.