
Exploitierbarkeit PoC für CVE-2026-9558 (SSTI Mautic Theme)
CVE-2026-9558 ist eine Server-Side Template Injection (SSTI)-Sicherheitslücke in der Theme-Engine von Mautic. Über den Theme-Manager hochgeladene Themes sind ZIP-Archive, die Twig-Vorlagen enthalten. In betroffenen Versionen werden diese Vorlagen von der standardmäßigen Twig-Environment der Anwendung ohne angehängte SandboxExtension-Richtlinie gerendert.
Da Twig über Filter wie map, filter und reduce beliebige PHP-Callables aufrufen kann, kann ein authentifizierter Benutzer mit Berechtigungen zum Hochladen von Themes ein Theme installieren, dessen Vorlage beim Rendern einen beliebigen Systembefehl ausführt – was automatisch geschieht, sobald ein Benutzer den E-Mail- oder Landing-Page-Builder für dieses Theme öffnet.
{{ ["id"] | map("system") | join }}
| Betroffener Bereich | Behoben in |
|---|---|
| >= 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 |
Diese Laborumgebung zielt auf 7.1.1 ab, die letzte Version vor dem Fix.
In der Entwicklerdokumentation von Mautic heißt es, dass Theme-Vorlagen in einer eingeschränkten Twig-Sandbox gerendert werden:
Mautic rendert benutzerhochgeladene Theme-Vorlagen in einer eingeschränkten Twig-Sandbox-Umgebung. Die Sandbox blockiert bestimmte Funktionen und Filter, die Remote-Code-Ausführung, Datenlecks oder Dateisystem-Zugriff ermöglichen könnten.
In betroffenen Versionen existiert diese Sandbox-Richtlinie nicht. Der Fix (7.1.2) führt
ThemeSandboxPolicy.php ein,
eine denylist-basierte Implementierung von SecurityPolicyInterface, die die Filter map, filter und reduce sowie eine Reihe von Funktionen blockt, darunter source() (beliebiges Dateilesen) und configGetParameter() (gibt DB-Anmeldedaten und den geheimen Anwendungsschlüssel preis). Der Inline-Kommentar des Fixes dokumentiert die exakte Payload-Form, die in diesem PoC verwendet wird:
private const DENIED_FILTERS = [
'map', // {{ ['id']|map('system')|join }} -> RCE
'reduce',
'filter',
];
Vor dieser Richtlinie existierte keine derartige Einschränkung auf irgendeinem Theme-Rendering-Pfad.
Die Kette wurde Ende-zu-Ende gegen ein Konto mit niedrigen Privilegien validiert, das nur über die Berechtigungsgruppen Themes (erstellen/bearbeiten) und Emails (erstellen/bearbeiten) verfügt – nicht Administrator – um der PR:L-Vorbedingung im CVSS-Vektor der Advisory zu entsprechen.
.twig-Datei des Themes eingebetteten system()-Aufrufe aus.config/local.php, und legt die Datenbank-Anmeldedaten sowie den secret_key der Anwendung im Klartext offen.PDO-Verbindung aus der SSTI-Payload heraus zu öffnen und das Konto mit niedrigen Privilegien auf role_id 1 (Administrator) zu befördern, wobei die anwendungsspezifischen Berechtigungsprüfungen von Mautic vollständig umgangen werden.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
Die Advisory gibt PR:L an. Diese Laborumgebung bestätigt die spezifische Vorbedingung niedriger Privilegien in der Praxis: Um den Render-Trigger zu erreichen, sind sowohl Theme-Upload-Berechtigungen als auch E-Mail-Erstellungsberechtigungen erforderlich – nicht eine einzelne generische niedrige Berechtigung. Es gibt keine Umgehung jenseits des offiziellen Fixes, die dies einschränkt; die einzige dokumentierte Abschwächung ist die Einschränkung von core:themes:create auf vertrauenswürdige Administratoren.
cve-2026-9558-poc/
├── podman-compose.yml # MariaDB + Mautic 7.1.1-Apache, isoliertes Bridge-Netzwerk
├── Dockerfile.mautic # fixiert das offizielle Image auf die anfällige Version
├── install.sh # nicht-interaktives mautic:install Bootstrap
└── sparse/
├── config.json # bösartiges Theme-Manifest
├── sparse.zip # bereit zum Hochladen des Themes
└── html/
├── email.html.twig # SSTI-Payload-Vorlage. Schauen Sie an das Ende der Datei, wo der Platzhalter zum Injizieren beliebiger Befehle ist.
├── ... # Andere .twig-Dateien
└── .../ # Andere Verzeichnisse (z.B. css)
| Tool | Version | Notes |
|---|---|---|
| Podman | ≥ 4.0 | podman-compose erforderlich |
| curl | any | wird von install.sh verwendet, um die Bereitschaft abzufragen |
Die Ausnutzung in diesem PoC erfolgt manuell über die Mautic-Web-Oberfläche (Theme-Manager-Upload → E-Mail-Builder), was dem tatsächlichen Angreifer-Workflow entspricht: Theme-Upload ist ein Datei-Vorgang, kein API-Aufruf, der für diese Analysephase eine Automatisierung rechtfertigen würde.
podman-compose up -d
./install.sh
install.sh wartet, bis der App-Container Verbindungen akzeptiert, und führt dann mautic:install nicht-interaktiv aus, um das erste Administratorkonto einzurichten.
Erstellen Sie über die Benutzeroberfläche eine benutzerdefinierte Rolle, in der nur Themes (erstellen/bearbeiten) und Emails (erstellen/bearbeiten) aktiviert sind, und weisen Sie dieser Rolle einen Benutzer zu. Dies reproduziert die PR:L-Vorbedingung anstatt als Administrator zu testen.
Melden Sie sich als Benutzer mit niedrigen Privilegien an. Laden Sie über Themes → Upload ein ZIP hoch, das aus sparse/config.json und sparse/html/page.html.twig erstellt wurde (oder eine modifizierte Kopie eines integrierten Themes, dem die Payload-Zeile zur .twig-Datei hinzugefügt wurde).
Wählen Sie unter Channels → Emails → New das hochgeladene Theme als Vorlage aus und öffnen Sie den Builder. Die Payload wird ausgeführt, sobald das Theme für die Vorschau gerendert wird.
podman-compose down -v
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Dieses Repository dient ausschließlich zu Bildungszwecken und zur lokalen Ausnutzbarkeitsanalyse. Alle Tests wurden gegen eine selbst gehostete Container-Umgebung durchgeführt. Führen Sie diesen PoC nicht gegen Systeme aus, die Ihnen nicht gehören oder für die Sie keine ausdrückliche schriftliche Genehmigung zum Testen haben.
| Ressource | Link |
|---|
| Advisory | GHSA-9fx4-7cmj-47vg |
| Fix (Sandbox-Richtlinie) | ThemeSandboxPolicy.php |
| Anfälliges Repository | mautic/mautic |
| Vollständige Analyse – Blogbeitrag | return-zero.dev/posts/cve-2026-9558 |