
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 est une vulnérabilité de type Cross-Site Scripting stocké (Stored XSS) affectant Mautic 7 (versions 7.0.0 à 7.1.1). Le défaut se situe dans le composant Projects, où les noms de projets sont affichés sous forme d'étiquettes et de popovers au survol sur les pages administratives (telles que les campagnes, les e-mails et les formulaires) sans assainissement adéquat de la sortie. Un utilisateur authentifié disposant de la permission de créer ou de modifier des projets peut stocker du HTML/JavaScript malveillant dans un nom de projet. Lorsqu'un administrateur visualise ultérieurement une entité associée à ce projet et survole son étiquette, le script malveillant s'exécute dans le navigateur de l'administrateur.
| Propriété | Valeur |
|---|---|
| Produit | Mautic |
| Versions affectées | 7.0.0 – 7.1.1 |
| Version corrigée | 7.1.2 |
| Composant affecté | Projects (Étiquettes & popovers) |
L'application stocke les noms de projets fournis par les utilisateurs authentifiés. Ensuite, lorsque les étiquettes de projet et le contenu des popovers sont rendus sur les pages administratives, la valeur stockée est insérée dans le HTML sans encodage de sortie ni assainissement appropriés.
Conceptuellement :
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
Au lieu de traiter le nom du projet comme du texte brut, le navigateur l'interprète comme du HTML, ce qui permet au JavaScript intégré de s'exécuter.
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
Supposons qu'un utilisateur authentifié crée un projet dont le nom contient du HTML au lieu d'un texte ordinaire.
Le projet est enregistré avec succès car l'application n'assainit pas le nom du projet à l'entrée.
Plus tard, un administrateur ouvre une campagne associée à ce projet. Lorsque l'administrateur survole l'étiquette du projet, l'application génère un popover à partir du nom de projet stocké. Comme le contenu est inséré dans la page sans encodage de sortie approprié, le navigateur l'interprète comme du HTML plutôt que comme du texte brut, ce qui entraîne l'exécution du JavaScript intégré dans la session de l'administrateur.
L'exploitation réussie peut permettre à un attaquant de :
La vulnérabilité affecte principalement la confidentialité et l'intégrité.
| Métrique | Score |
|---|---|
| CVSS v3.1 (CNA) | 7.6 (Élevé) |
Le NVD n'a pas encore publié sa propre évaluation CVSS ; le score actuel est fourni par le CNA de Mautic.
Remarque : L'éditeur n'a pas publié le code source vulnérable exact. Ce qui suit illustre le schéma de la vulnérabilité.
// 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 amène le navigateur à analyser le nom de projet stocké comme du HTML. Si le nom de projet contient des éléments HTML avec des gestionnaires d'événements JavaScript, le navigateur les exécute lors du rendu du popover.
const tag = document.createElement("span");
tag.className = "project-tag";
// Safe: treat input as plain text
tag.textContent = response.project.name;
popover.replaceChildren(tag);
L'utilisation de textContent garantit que le nom du projet est traité comme du texte littéral au lieu de HTML. Les caractères spéciaux HTML sont affichés plutôt qu'interprétés par le navigateur, ce qui empêche l'exécution de scripts intégrés. Lorsqu'un rendu HTML est nécessaire, les développeurs doivent assainir le contenu non fiable à l'aide d'un assainisseur HTML bien maintenu avant l'insertion.