
MISP <= 2.5.27 - Cross-Site Scripting Memorizzato tramite Workflow Engine (doT.js Template Injection).
MISP <= 2.5.27 - Cross-Site Scripting Memorizzata tramite motore Workflow (Iniezione di template doT.js)
Scoperto da Franck FERMAN
Panoramica - Cause profonde - Catena d'attacco - Struttura - Utilizzo - Rimedio - Riferimenti
CVE-2025-67906 (GCVE-1-2025-0031) è una vulnerabilità di Cross-Site Scripting Memorizzata (XSS) in MISP (Malware Information Sharing Platform) versioni fino alla 2.5.27 inclusa.
La vulnerabilità risiede in app/View/Elements/Workflows/executionPath.ctp, il componente vista del percorso di esecuzione del Workflow. Il campo name dei trigger del workflow viene salvato nel database senza sanitizzazione lato server e successivamente renderizzato nel DOM tramite il motore di template doT.js senza escape HTML. Un attaccante autenticato può iniettare HTML/JavaScript arbitrario che viene eseguito nella sessione del browser di qualsiasi utente che visualizzi il workflow compromesso.
Poiché il payload è memorizzato nel database e renderizzato a ogni caricamento di pagina, l'XSS è persistente - sopravvive ai refresh della pagina, colpisce più utenti e persiste fino a quando il workflow non viene esplicitamente cancellato.
Scoperta: Questa vulnerabilità è stata identificata e divulgata responsabilmente da Franck FERMAN.
Esistono diverse valutazioni CVSS per questa vulnerabilità:
| Fonte | Punteggio | Gravità | Vettore |
|---|---|---|---|
| NIST NVD | 9.0 | Critico | CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H |
| GCVE (CIRCL) | 7.1 | Alto | CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:A/VC:H/VI:N/VA:N/SC:H/SI:H/SA:H |
| CNA (MITRE) | 5.4 | Medio | CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N |
La divergenza dei punteggi riflette diverse valutazioni della profondità dell'impatto. Il punteggio NIST NVD (9.0) considera un impatto completo su Riservatezza, Integrità e Disponibilità poiché il payload XSS viene eseguito con i privilegi della sessione della vittima, consentendo l'esfiltrazione di dati a livello amministrativo e la manipolazione del workflow. Il punteggio CNA (5.4) considera solo un impatto limitato su C/I per un XSS generico. Il punteggio GCVE CVSS 4.0 (7.1) introduce modificatori di Requisiti dell'attacco (Privilegio) e Interazione attiva dell'utente.
L'ambito è Cambiato in tutte le valutazioni perché il payload dell'attaccante (iniettato tramite l'API di MISP) viene eseguito in un contesto di sicurezza diverso (la sessione del browser della vittima).
Il motore Workflow di MISP consente agli utenti autenticati di creare e modificare workflow tramite l'API REST. Il modello dati del workflow include un componente trigger con un campo name. Questo campo:
doT.js è un motore di template JavaScript veloce. Utilizza {{= }} per l'interpolazione, che non esegue l'escape HTML di default. L'editor Workflow di MISP usa doT.js per renderizzare i metadati del trigger (incluso il campo name) nel DOM. Quando il campo name contiene HTML come ``, il motore di template lo inserisce come HTML grezzo e il browser esegue il JavaScript incorporato.
La correzione richiede:
{{! }} che fa l'escape HTML del valorePOST /workflows/edit/{id}
{
"Workflow": {
"id": "1",
"data": "{\"1\":{\"data\":{\"name\":\"\"}}}"
}
}
Il valore name all'interno del campo JSON data è il punto di iniezione. L'intero grafo del workflow è serializzato come stringa JSON nel corpo della richiesta.
La vulnerabilità è amplificata dalla scelta architetturale di utilizzare un motore di template lato client (doT.js) per renderizzare l'editor visivo del workflow. L'editor Workflow è un'interfaccia grafica drag-and-drop in cui ogni trigger/azione viene visualizzato come blocco visivo. Il campo name del trigger viene renderizzato come etichetta all'interno di questi blocchi grafici.
doT.js costruisce i componenti visivi generando stringhe HTML dai template e inserendole nel DOM. La sintassi di interpolazione {{= }} produce output senza escape - qualsiasi dato interpolato nel template viene trattato come markup, non come testo. Se lo stesso campo name fosse renderizzato tramite element.textContent (che tratta l'input come testo semplice) o tramite la sintassi di output codificato {{! }} di doT.js, non sarebbe possibile alcun XSS indipendentemente dal contenuto dell'input.
La superficie d'attacco esiste proprio perché:
{{= }}) per motivi di performancename viene interpretata come HTML dal browserQuesto è un pattern di vulnerabilità comune nelle applicazioni web che utilizzano motori di template lato client per costruire interfacce visive interattive: la necessità di un rendering ricco crea un rapporto di fiducia implicito tra il template e le sue fonti di dati, e qualsiasi input utente non sanitizzato che raggiunga il template diventa codice eseguibile.
<script>Un tag <script> grezzo iniettato tramite interpolazione di template tipicamente non viene eseguito in questo contesto. I browser non eseguono elementi <script> inseriti nel DOM dopo il parsing iniziale della pagina (tramite innerHTML o equivalente). Gli attributi di gestione eventi come onerror, onload o onmouseover su elementi HTML bypassano questa restrizione perché attivano JavaScript inline quando il browser elabora gli attributi dell'elemento, indipendentemente da come l'elemento è stato inserito.
Il vettore <img src="https://raw.githubusercontent.com/franckferman/cve-2025-67906/HEAD/x" onerror="..."> è preferito perché:
src="x" garantisce un fallimento immediato del caricamento, attivando onerror senza interazione dell'utentescript-src che bloccano i tag <script> inline, perché l'esecuzione avviene tramite un gestore eventi su un elemento non script