
Эксплуатационный PoC для CVE-2026-9558 (SSTI Mautic Theme)
CVE-2026-9558 — это уязвимость внедрения шаблонов на стороне сервера (SSTI) в движке тем Mautic. Темы, загружаемые через Менеджер тем, являются ZIP-архивами, содержащими шаблоны Twig, и в затронутых версиях эти шаблоны обрабатываются стандартным окружением Twig приложения без политики SandboxExtension.
Поскольку Twig может вызывать произвольные PHP-функции через такие фильтры, как map, filter и reduce, аутентифицированный пользователь с правами на загрузку тем может установить тему, шаблон которой выполняет произвольную системную команду сразу после рендеринга — что происходит автоматически при первом открытии редактора электронных писем или целевых страниц с этой темой.
{{ ["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',
];
До этой политики никаких подобных ограничений на пути рендеринга тем не существовало.
Цепочка была проверена от начала до конца с использованием учетной записи с низкими привилегиями, имеющей только группы разрешений Темы (создание/редактирование) и Электронные письма (создание/редактирование) — не Администратор — чтобы соответствовать предусловию PR:L в векторе CVSS уведомления.
system(), встроенные в .twig-файл темы.config/local.php Mautic, раскрывая учетные данные базы данных и secret_key приложения в открытом виде.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. Смотрите конец файла, где находится placeholder для внедрения произвольных команд.
├── ... # Другие .twig файлы
└── .../ # Другие директории (например css)
| Инструмент | Версия | Примечания |
|---|---|---|
| Podman | ≥ 4.0 | требуется podman-compose |
| curl | любая | используется install.sh для опроса готовности |
Эксплуатация в данном PoC выполняется вручную через веб-интерфейс Mautic (загрузка через Менеджер тем → редактор электронных писем), что соответствует реальному рабочему процессу атакующего: загрузка темы — это файловая операция, а не вызов API, который стоило бы автоматизировать на этом этапе анализа.
podman-compose up -d
./install.sh
install.sh ожидает, пока контейнер приложения начнет принимать соединения, затем запускает mautic:install в неинтерактивном режиме для создания первой учетной записи Администратора.
В интерфейсе создайте пользовательскую роль с включенными только Темы (создание/редактирование) и Электронные письма (создание/редактирование), и назначьте пользователя на эту роль. Это воспроизводит предусловие PR:L вместо тестирования от имени Администратора.
Войдите в систему как низкопривилегированный пользователь. В разделе Темы → Загрузить загрузите ZIP-архив, созданный из sparse/config.json и sparse/html/page.html.twig (или измененную копию любой встроенной темы с добавленной строкой полезной нагрузки в её .twig-файл).
В разделе Каналы → Электронные письма → Создать, выберите загруженную тему в качестве шаблона и откройте редактор. Полезная нагрузка выполняется сразу после рендеринга темы для предпросмотра.
podman-compose down -v
uid=33(www-data) gid=33(www-data) groups=33(www-data)