
MISP <= 2.5.27 - Stored Cross-Site Scripting a través del Workflow Engine (Inyección de Plantilla doT.js).
MISP <= 2.5.27 - Cross-Site Scripting Almacenado a través del Motor de Workflow (inyección de plantilla doT.js)
Descubierto por Franck FERMAN
Resumen - Causa Raíz - Cadena de Ataque - Estructura - Uso - Remediación - Referencias
CVE-2025-67906 (GCVE-1-2025-0031) es una vulnerabilidad de Cross-Site Scripting Almacenado (XSS) en MISP (Plataforma de Intercambio de Información de Malware) versiones hasta la 2.5.27 inclusive.
La vulnerabilidad reside en app/View/Elements/Workflows/executionPath.ctp, el componente de vista de la ruta de ejecución del Workflow. El campo name de los desencadenantes del workflow se persiste en la base de datos sin saneamiento en el lado del servidor y posteriormente se renderiza en el DOM a través del motor de plantillas doT.js sin escape HTML. Un atacante autenticado puede inyectar HTML/JavaScript arbitrario que se ejecuta en la sesión del navegador de cualquier usuario que visualice el workflow comprometido.
Debido a que la carga útil se almacena en la base de datos y se renderiza en cada carga de página, el XSS es persistente: sobrevive a las recargas de página, afecta a múltiples usuarios y persiste hasta que el workflow se elimina explícitamente.
Descubrimiento: Esta vulnerabilidad fue identificada y divulgada de manera responsable por Franck FERMAN.
Existen múltiples evaluaciones CVSS para esta vulnerabilidad:
| Fuente | Puntuación | Severidad | Vector |
|---|---|---|---|
| NIST NVD | 9.0 | Crítico | 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 divergencia de puntuaciones refleja diferentes evaluaciones de la profundidad del impacto. La puntuación de NIST NVD (9.0) considera un impacto total en Confidencialidad, Integridad y Disponibilidad, dado que la carga útil XSS se ejecuta con los privilegios de sesión de la víctima, permitiendo la exfiltración de datos a nivel de administrador y la manipulación del workflow. La puntuación CNA (5.4) considera solo un impacto limitado en C/I para un XSS genérico. La puntuación GCVE CVSS 4.0 (7.1) introduce modificadores de Requisitos de Ataque (Privilegio) e Interacción Activa del Usuario.
El Alcance es Cambiado en todas las evaluaciones porque la carga útil del atacante (inyectada a través de la API de MISP) se ejecuta en un contexto de seguridad diferente (la sesión del navegador de la víctima).
El Motor de Workflow de MISP permite a los usuarios autenticados crear y editar workflows a través de la API REST. El modelo de datos del workflow incluye un componente trigger con un campo name. Este campo:
doT.js es un motor de plantillas JavaScript rápido. Utiliza {{= }} para interpolación, que no escapa el HTML por defecto. El Editor de Workflow de MISP utiliza doT.js para renderizar metadatos del trigger (incluyendo el campo name) en el DOM. Cuando el campo name contiene HTML como ``, el motor de plantillas lo inserta como HTML sin procesar, y el navegador ejecuta el JavaScript incrustado.
La corrección requiere:
{{! }} que escapa HTMLPOST /workflows/edit/{id}
{
"Workflow": {
"id": "1",
"data": "{\"1\":{\"data\":{\"name\":\"\"}}}"
}
}
El valor name dentro del campo JSON data es el punto de inyección. Todo el grafo del workflow se serializa como una cadena JSON dentro del cuerpo de la solicitud.
La vulnerabilidad se amplifica por la elección arquitectónica de utilizar un motor de plantillas del lado del cliente (doT.js) para renderizar el editor visual de workflows. El Editor de Workflow es una interfaz gráfica de arrastrar y soltar donde cada trigger/acción se muestra como un bloque visual. El campo name del trigger se renderiza como una etiqueta dentro de estos bloques gráficos.
doT.js construye los componentes visuales generando cadenas HTML a partir de plantillas e insertándolas en el DOM. La sintaxis de interpolación {{= }} produce salida sin escapar - cualquier dato interpolado en la plantilla se trata como marcado, no como texto. Si el mismo campo name se renderizara mediante element.textContent (que trata la entrada como texto plano) o mediante la sintaxis de salida codificada {{! }} de doT.js, no sería posible ningún XSS independientemente del contenido de la entrada.
La superficie de ataque existe precisamente porque:
{{= }}) por rendimientoname se interpreta como HTML por el navegadorEste es un patrón de vulnerabilidad común en aplicaciones web que utilizan motores de plantillas del lado del cliente para construir interfaces visuales interactivas: la necesidad de renderizado enriquecido crea una relación de confianza implícita entre la plantilla y sus fuentes de datos, y cualquier entrada de usuario sin saneamiento que llegue a la plantilla se convierte en código ejecutable.
<script>Una etiqueta <script> sin procesar inyectada mediante interpolación de plantillas normalmente no se ejecutará en este contexto. Los navegadores no ejecutan elementos <script> que se insertan en el DOM después del análisis inicial de la página (mediante innerHTML o equivalente). Los atributos de manejadores de eventos como onerror, onload o onmouseover en elementos HTML evitan esta restricción porque ejecutan JavaScript en línea cuando el navegador procesa los atributos del elemento, independientemente de cómo se insertó el elemento.