
PoC d'exploitabilité pour CVE-2026-9558 (SSTI Mautic Theme)
CVE-2026-9558 est une vulnérabilité d'injection de modèles côté serveur (SSTI) dans le moteur de thèmes de Mautic. Les thèmes téléchargés via le gestionnaire de thèmes sont des archives ZIP contenant des modèles Twig, et dans les versions affectées, ces modèles sont rendus par l'Environment Twig par défaut de l'application sans aucune politique SandboxExtension attachée.
Étant donné que Twig peut invoquer des callables PHP arbitraires via des filtres tels que map, filter et reduce, un utilisateur authentifié disposant des droits de téléchargement de thèmes peut installer un thème dont le modèle exécute une commande système arbitraire dès son rendu — ce qui se produit automatiquement la première fois qu'un utilisateur ouvre le constructeur d'e-mails ou de pages d'atterrissage avec ce thème.
{{ ["id"] | map("system") | join }}
| Plage affectée | Corrigé dans |
|---|---|
| >= 1.3.0, < 4.4.13 | 4.4.13 (4.4.20 via ELTS) |
| >= 5.0.0, < 5.2.11 | 5.2.11 |
| >= 6.0.0, < 6.0.9 | 6.0.9 |
| >= 7.0.0, < 7.1.2 | 7.1.2 |
Ce laboratoire cible la version 7.1.1, la dernière publication avant le correctif.
La documentation développeur de Mautic indique que les modèles de thèmes sont rendus dans un environnement sandbox Twig restreint :
Mautic rend les modèles de thèmes téléchargés par l'utilisateur dans un environnement sandbox Twig restreint. Le sandbox bloque certaines fonctions et certains filtres qui pourraient permettre l'exécution de code à distance, la fuite de données ou le sondage du système de fichiers.
Dans les versions affectées, cette politique sandbox n'existe pas. Le correctif (7.1.2) introduit
ThemeSandboxPolicy.php,
une implémentation de SecurityPolicyInterface basée sur une liste noire qui bloque les filtres map, filter et reduce ainsi qu'un ensemble de fonctions incluant source() (lecture de fichier arbitraire) et configGetParameter() (fuite des identifiants de base de données et de la clé secrète de l'application). Le commentaire en ligne du correctif lui-même documente la forme exacte de la charge utile utilisée dans ce PoC :
private const DENIED_FILTERS = [
'map', // {{ ['id']|map('system')|join }} -> RCE
'reduce',
'filter',
];
Avant cette politique, aucune restriction de ce type n'existait sur aucun chemin de rendu de thème.
La chaîne a été validée de bout en bout contre un compte à faibles privilèges disposant uniquement des groupes de permissions Thèmes (création/édition) et E-mails (création/édition) — pas Administrateur — pour correspondre à la précondition PR:L dans le vecteur CVSS de l'avis.
system() intégrés dans le fichier .twig du thème.config/local.php de Mautic, exposant les identifiants de base de données et la secret_key de l'application en clair.PDO directe depuis la charge utile SSTI et promouvoir le compte à faibles privilèges en role_id 1 (Administrateur), contournant ainsi complètement les vérifications de permissions au niveau de l'application Mautic.uid=33(www-data) gid=33(www-data) groups=33(www-data)
'db_host' => 'mautic-db',
'db_user' => 'mautic',
'db_password' => 'mauticpass',
'secret_key' => 'a15d98da823d751f4a0a5219123f4afbd90eb254074b1cea07518a3c0db70bcd',
rows_updated=1
confirm: 2|priv-esc|1
L'avis indique PR:L. Ce laboratoire confirme la précondition spécifique à faibles privilèges en pratique : atteindre le déclencheur de rendu nécessite à la fois les permissions de téléchargement de thème et de création d'e-mail — pas une seule permission faible générique. Aucune solution de contournement au-delà du correctif officiel ne restreint cela ; la seule atténuation documentée consiste à limiter core:themes:create aux administrateurs de confiance.
cve-2026-9558-poc/
├── podman-compose.yml # MariaDB + Mautic 7.1.1-apache, réseau pont isolé
├── Dockerfile.mautic # verrouille l'image officielle sur la version vulnérable
├── install.sh # bootstrap non interactif de mautic:install
└── sparse/
├── config.json # manifeste du thème malveillant
├── sparse.zip # thème prêt à être téléchargé
└── html/
├── email.html.twig # modèle de payload SSTI. Regardez la fin du fichier où se trouve le placeholder pour injecter des commandes arbitraires.
├── ... # Autres fichiers .twig
└── .../ # Autres répertoires (par ex. css)
| Outil | Version | Notes |
|---|---|---|
| Podman | ≥ 4.0 | podman-compose requis |
| curl | any | utilisé par install.sh pour vérifier la disponibilité |
L'exploitation dans ce PoC est effectuée manuellement via l'interface web de Mautic (téléchargement dans le gestionnaire de thèmes → constructeur d'e-mails), correspondant au workflow réel de l'attaquant : le téléchargement de thème est une opération sur fichier, pas un appel API qu'il vaudrait la peine d'automatiser à ce stade de l'analyse.
podman-compose up -d
./install.sh
install.sh attend que le conteneur de l'application accepte les connexions, puis exécute mautic:install de manière non interactive pour amorcer le premier compte Administrateur.
Depuis l'interface, créez un rôle personnalisé avec uniquement les permissions Thèmes (création/édition) et E-mails (création/édition) activées, et un utilisateur assigné à ce rôle. Cela reproduit la précondition PR:L au lieu de tester en tant qu'Administrateur.
Connectez-vous en tant qu'utilisateur à faibles privilèges. Depuis Thèmes → Télécharger, téléchargez un ZIP construit à partir de sparse/config.json et sparse/html/page.html.twig (ou une copie modifiée d'un thème intégré avec la ligne de charge utile ajoutée à son fichier .twig).
Depuis Canaux → E-mails → Nouveau, sélectionnez le thème téléchargé comme modèle et ouvrez le constructeur. La charge utile s'exécute dès que le thème est rendu pour l'aperçu.
podman-compose down -v
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Ce dépôt est destiné à des fins éducatives et d'analyse d'exploitabilité locale uniquement. Tous les tests ont été effectués sur un environnement conteneurisé auto-hébergé. N'exécutez pas ce PoC contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite de tester.
| Ressource | Lien |
|---|
| Avis | GHSA-9fx4-7cmj-47vg |
| Correctif (politique sandbox) | ThemeSandboxPolicy.php |
| Dépôt vulnérable | mautic/mautic |
| Analyse complète — article de blog | return-zero.dev/posts/cve-2026-9558 |