
CVE-2026-9809 is a Stored Cross-Site Scripting (Stored XSS) vulnerability affecting Mautic 7 (versions 7.0.0 through 7.1.1).
CVE-2026-9809 es una vulnerabilidad de Cross-Site Scripting Almacenado (Stored XSS) que afecta a Mautic 7 (versiones 7.0.0 a 7.1.1). La falla existe en el componente Projects, donde los nombres de los proyectos se muestran como etiquetas y popovers al pasar el cursor en páginas administrativas (como campañas, correos electrónicos y formularios) sin una sanitización adecuada de la salida. Un usuario autenticado con permiso para crear o editar proyectos puede almacenar HTML/JavaScript malicioso en el nombre de un proyecto. Cuando un administrador ve posteriormente una entidad asociada a ese proyecto y pasa el cursor sobre su etiqueta, el script malicioso se ejecuta en el navegador del administrador.
| Propiedad | Valor |
|---|---|
| Producto | Mautic |
| Versiones afectadas | 7.0.0 – 7.1.1 |
| Versión corregida | 7.1.2 |
| Componente afectado | Projects (Etiquetas & Popovers) |
La aplicación almacena nombres de proyectos proporcionados por usuarios autenticados. Posteriormente, cuando las etiquetas de proyectos y el contenido de los popovers se renderizan en páginas administrativas, el valor almacenado se inserta en el HTML sin una codificación o sanitización adecuada de la salida.
Conceptualmente:
User creates project
│
▼
Project name stored in database
│
▼
Administrator opens Campaign / Email / Form
│
▼
Project tag & popover rendered
│
▼
Project name inserted into HTML without sanitization
│
▼
Browser executes embedded JavaScript
En lugar de tratar el nombre del proyecto como texto plano, el navegador lo interpreta como HTML, lo que permite que el JavaScript incrustado se ejecute.
Attacker
│
▼
Creates a project with a malicious project name
│
▼
Payload stored in database
│
▼
Administrator views Campaign / Email / Form
│
▼
Administrator hovers over the project tag
│
▼
Popover renders unsanitized project name
│
▼
Browser executes JavaScript
│
▼
Actions performed with administrator's privileges
Supongamos que un usuario autenticado crea un proyecto cuyo nombre contiene HTML en lugar de texto normal.
El proyecto se guarda correctamente porque la aplicación no sanitiza el nombre del proyecto en la entrada.
Posteriormente, un administrador abre una campaña asociada a ese proyecto. Cuando el administrador pasa el cursor sobre la etiqueta del proyecto, la aplicación genera un popover con el nombre almacenado del proyecto. Dado que el contenido se inserta en la página sin una codificación adecuada de la salida, el navegador lo interpreta como HTML en lugar de texto plano, provocando que el JavaScript incrustado se ejecute en la sesión del administrador.
Una explotación exitosa puede permitir a un atacante:
La vulnerabilidad afecta principalmente a la confidencialidad y la integridad.
| Métrica | Puntuación |
|---|---|
| CVSS v3.1 (CNA) | 7.6 (Alta) |
NVD aún no ha publicado su propia evaluación CVSS; la puntuación actual es proporcionada por el CNA de Mautic.
Nota: El proveedor no ha publicado el código fuente vulnerable exacto. Lo siguiente ilustra el patrón de vulnerabilidad.
// Project name retrieved from the server
const projectName = response.project.name;
// Unsafe: inserts user-controlled HTML
popover.innerHTML = `
<span class="project-tag">
${projectName}
</span>
`;
innerHTML hace que el navegador analice el nombre almacenado del proyecto como HTML. Si el nombre del proyecto contiene elementos HTML con manejadores de eventos de JavaScript, el navegador los ejecuta al renderizar el popover.
const tag = document.createElement("span");
tag.className = "project-tag";
// Safe: treat input as plain text
tag.textContent = response.project.name;
popover.replaceChildren(tag);
El uso de textContent garantiza que el nombre del proyecto se trate como texto literal en lugar de HTML. Los caracteres especiales HTML se muestran en lugar de ser interpretados por el navegador, lo que impide la ejecución de scripts incrustados. Cuando se requiere renderizar HTML, los desarrolladores deben sanitizar el contenido no confiable utilizando un sanitizador de HTML bien mantenido antes de la inserción.