The Events Calendar позволяет анонимному комментатору выполнить код на сервере и сменить пароль администратора

WordPress

Исследователи из команды Wordfence Threat Intelligence обнаружили две независимые цепочки уязвимостей в плагине The Events Calendar для WordPress. Плагин установлен более чем на 600 тысячах сайтов. Каждая цепочка приводит к удалённому выполнению кода, то есть к запуску произвольных команд на сервере. Ни вход в систему, ни регистрация, ни обман пользователей не требуются. Условие всего одно: на страницах событий должны быть включены комментарии. Обе цепочки получили оценку 9.8 из 10. Нашли их инструментом Argus, который разработала та же команда. Первую уязвимость выявили 21 августа 2026 года, вторую, независимую от неё, через два дня. Идентификаторы CVE-2026-78006 и CVE-2026-78159.

Детали уязвимостей

Под удар попадают сайты с календарями событий: конференции, музеи, образовательные площадки, магазины билетов. Успешная атака означает полную компрометацию сайта. Атакующий получает доступ к базе данных, может украсть персональные сведения посетителей, разместить вредоносный код на страницах и удалить содержимое. Под угрозой оказываются и сами события с регистрацией участников, и всё остальное, что работает на том же сервере. Учётная запись для атаки не нужна, поэтому рискует любой сайт с открытыми комментариями на страницах событий.

Обе цепочки выросли из одного набора решений, принятых при отрисовке виджетов, и потому используют общую точку входа. Плагин собирает страницу события целиком, включая область комментариев, и пропускает готовую разметку через разбор блоков. Ядро WordPress так не поступает: блоки оно разбирает только в основном тексте записи. Из-за этого поверхность атаки расширяется на всё, что оставил анонимный посетитель. Штатный фильтр безопасности комментариев сохраняет служебные разделители HTML, а блочный редактор Gutenberg (встроенный редактор WordPress) считает такие разделители разметкой блока. Подготовленный блок доживает до разбора.

Отправить комментарий мало. Обычно он ждёт одобрения модератора. Но WordPress возвращает автору ссылку с хешем модерации, по которой тот открывает свой ещё не одобренный текст. Просмотр запускает отрисовку виджетов плагина. Одобрение администратора не нужно, и это снимает последний барьер.

WordPress перед восстановлением виджета сверяет его содержимое с контрольной суммой. Плагин сам подписывает данные атакующего: берёт его значение, проводит собственную слабую проверку и подставляет свежую корректную подпись. Ядро получает валидный хеш и пропускает полезную нагрузку дальше. Единственная встроенная защита перестаёт работать. Дальше пути двух цепочек расходятся.

Первая цепочка строится на инъекции PHP-объектов. Проверка плагина пытается разобрать данные с запретом на создание объектов, а затем ищет объекты в результате. Логика ошибочна, потому что PHP вызывает служебные методы объекта прямо во время разбора, ещё до того, как функция вернёт значение. Атакующий встраивает в структуру настоящий объект и дописывает в конец повреждённый маркер. Предварительный разбор спотыкается о маркер и сообщает, что объектов нет. Позже ядро восстанавливает данные по-настоящему, и объект успевает выполнить свой метод. Тот передаёт управление функции, применяющей заданную команду к списку значений. Команда выполняется от имени пользователя веб-сервера.

Вторая цепочка обходится без объектов. Обычный массив честно проходит проверку, ведь объектов в нём нет. Ядро восстанавливает виджет и передаёт массив в шаблон, где каждый ключ превращается в переменную. Одна переменная доходит до утилиты, которая собирает имена стилевых классов (CSS) для разметки. Утилита рассчитана на анонимные функции, поэтому умеет вызывать переданные значения. Но проверка не ограничена анонимными функциями и пропускает любое имя, которое PHP считает вызываемым, включая имена глобальных функций. Дальше атакующий собирает в массиве три элемента: идентификатор пользователя, признак смены пароля и имя штатной функции обновления учётной записи. Массив разбирается по порядку, значения попадают в набор результатов, а затем срабатывает вызов. Внутри процесса проверка прав не выполняется, поэтому пароль администратора меняется на строку из одного символа. Атакующий входит в панель управления и загружает вредоносный плагин. Сайт переходит под полный контроль.

Разработчик плагина, компания StellarWP, получила уведомление о первой уязвимости 21 августа 2026 года, подтвердила его 24 августа и через день подготовила первое исправление. Между раскрытием и полным закрытием обеих цепочек прошло около трёх недель. Актуальная версия плагина 6.17.4.1 закрывает и инъекцию объектов, и вызов произвольных функций. Всем, кто использует плагин, нужно обновиться.

Комментарии редко рассматривают как источник кода, и в этом главная неожиданность истории. Плагин сам превратил пользовательский текст в исполняемую разметку и сам же выдал ей доверенную подпись. Достаточно одной страницы события с открытыми комментариями и одного анонимного сообщения. Технический разбор вышел вместе с исправлением и описывает устройство обеих цепочек достаточно подробно, поэтому повторение чужого опыта теперь требует лишь терпения и списка сайтов на WordPress.

Ссылки

Комментарии: 0