Внедрение PHP-объектов в Tutor LMS даёт подписчику выполнить код на сервере

WordPress

В плагине Tutor LMS для WordPress нашли уязвимость, позволяющую выполнить произвольный код на сервере сайта. Хватит учётной записи с минимальными правами, уровня подписчика. Плагин работает более чем на 100 000 площадок, в основном это учебные порталы и онлайн-курсы. Проблему закрыли в версии 4.0.8. До обновления уязвимыми остаются все сборки по 4.0.7 включительно.

Уязвимость CVE-2026-78175

Речь о внедрении PHP-объектов: в поток данных, который интерпретатор затем разбирает и восстанавливает, подставляются заранее собранные объекты. Ошибка сидит в механике вывода средств для преподавателей. Запрос к обработчику, сохраняющему реквизиты получателя, отправляет любой вошедший пользователь. Разработчики зарегистрировали этот обработчик только для авторизованных и не добавили проверки роли. Вход прикрывает одноразовый код (nonce), подтверждающий, что запрос пришёл с сайта. Такой код выдаётся при загрузке любой страницы, поэтому подписчик добывает его сразу после создания учётной записи.

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

На чтении рассинхронизация превращается в инструмент атаки. Восстанавливая структуру из строки, интерпретатор отмеряет ровно столько байт, сколько заявлено. Он выходит за границы строки и захватывает соседние данные. Имена полей формы плагин использует как ключи массива и никак их не проверяет, поэтому атакующий волен расположить за границей любые байты. Так в разбор попадает подложенный набор объектов. Срабатывание происходит при повторной отправке того же запроса. Достаточно и простого открытия страницы настроек вывода средств: плагин сам читает испорченные метаданные, чтобы понять, изменилось ли значение. Просмотр страницы владельцем курса тоже запускает разбор.

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

Условий для атаки немного, но на типичной установке они выполняются. Регистрация учеников и преподавателей открыта по умолчанию, так устроена работа онлайн-школ. Нужна ещё включённая функция монетизации, то есть приём платежей за курсы. Тогда путь от анонимного посетителя до захвата сервера начинается с самостоятельной регистрации. Оценка уязвимости - 8.8 из 10 по шкале CVSS, идентификатор CVE-2026-78175. Свидетельств использования в реальных атаках на момент публикации нет.

Исправление вышло 10 сентября 2026 года. Версия 4.0.8 закрывает четыре звена сразу. Проверка роли инструктора отсекает подписчиков. Отказ от SQL-экранирования убирает рассинхронизацию длин. Белый список имён полей не даёт подложить произвольные ключи. Проверка метода вывода средств блокирует обход. Любое из первых трёх изменений по отдельности перекрывает возможность атаки. Разработчики из команды Themeum отреагировали на отчёт за сутки и выпустили патч меньше чем через три недели.

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

Ссылки

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