
CVE-2026-9558 (SSTI Mautic Theme) のエクスプロイト可能性のPoC
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 (ELTS経由で4.4.20) |
| >= 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)では、map、filter、reduceフィルタ、およびsource()(任意ファイル読み取り)やconfigGetParameter()(DB認証情報とアプリケーションシークレットキーの漏洩)を含む一連の関数をブロックする、拒否リストベースのSecurityPolicyInterface実装であるThemeSandboxPolicy.phpが導入されています。修正のインラインコメントには、この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、分離されたブリッジネットワーク
├── Dockerfile.mautic # 公式イメージを脆弱性のあるリリースに固定
├── install.sh # 非対話型 mautic:install ブートストラップ
└── sparse/
├── config.json # 悪意のあるテーママニフェスト
├── sparse.zip # アップロード可能なテーマ
└── html/
├── email.html.twig # SSTIペイロードテンプレート。ファイルの末尾にある、任意のコマンドを注入するためのプレースホルダーを参照してください。
├── ... # その他の .twig ファイル
└── .../ # その他のディレクトリ (例: 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をアップロードします。
チャンネル→メール→新規から、アップロードしたテーマをテンプレートとして選択し、ビルダーを開きます。テーマがプレビュー用にレンダリングされるとすぐにペイロードが実行されます。
podman-compose down -v
uid=33(www-data) gid=33(www-data) groups=33(www-data)
| リソース | リンク |
|---|---|
| アドバイザリ | GHSA-9fx4-7cmj-47vg |
| 修正(サンドボックスポリシー) | ThemeSandboxPolicy.php |
| 脆弱性のあるリポジトリ | mautic/mautic |
| 完全な分析 — ブログ記事 | return-zero.dev/posts/cve-2026-9558 |
このリポジトリは教育目的およびローカルでの悪用可能性分析のみを目的としています。すべてのテストはセルフホストのコンテナ環境に対して実施されました。このPoCを、所有していない、または明示的な書面によるテスト許可を得ていないシステムに対して実行しないでください。