17 сентября 2026 года вышел WordPress 7.1.1 с одиннадцатью исправлениями безопасности. Одно из них закрывает цепочку уязвимостей, которую исследователи назвали Click2Shell. Из отчета становится ясно, как один переход по ссылке заканчивается выполнением чужого кода на сервере. Затронуты все версии WordPress до 7.1.1. Платформа работает на 43 процентах сайтов в мире, это около 500 миллионов установок, поэтому цена ошибки здесь выше обычной.
Уязвимость Click2Shell
Основой цепочки стал параметр theme в адресе страницы установки тем. Значение читают две разные части системы, и каждая понимает его по-своему. Серверный интерфейс каталога WordPress.org обращается с ним как с именем темы, лишние символы отбрасываются, остаётся обычный идентификатор. Зато JavaScript в браузере администратора берёт то же исходное значение и подставляет его в селектор jQuery без очистки. Селектор - это строка, по которой библиотека ищет нужные элементы на странице. Расхождение между двумя толкованиями и открывает уязвимость.
Специально составленный идентификатор закрывает кавычкой атрибут внутри селектора и добирается до кнопок в карточке темы. Хвост строки оформлен как комментарий и гасит тот фрагмент, который WordPress дописывает сам. Поэтому страница решает, будто администратор нажал кнопку установки, хотя он всего лишь открыл ссылку. Дальше WordPress запрашивает живой каталог, получает подлинную запись и скачивает официальный архив темы. Ничего подозрительного при этом не происходит: сайт остаётся на прежней теме, а новая просто ложится на диск неактивной. Проверить поведение можно на обычном адресе предпросмотра: там тема открывается, но не устанавливается.
Казалось бы, неактивная тема безобидна. Однако WordPress загружает код темы при предпросмотре в настройщике, даже если активна другая тема. Так у чужого кода появляется шанс зарегистрировать свои обработчики. В версии Mobile Repair Zone 2.5.4 один из них принимал ссылку на архив плагина и не проверял ни одноразовый токен, ни права пользователя. Плагин - это дополнение, расширяющее функции сайта. WordPress скачивал архив по указанному адресу, распаковывал и запускал его код на сервере. Похожие незащищённые обработчики нашлись более чем в 40 сторонних темах каталога. Иначе говоря, вторая половина цепочки опирается не на редкую оплошность, а на повторяющийся шаблон.
Полный сценарий выглядит так. Администратор открывает подготовленную ссылку, WordPress ставит выбранную тему из официального каталога, настройщик подгружает её код, тот добирается до открытого установщика, а тот записывает на сервер чужой пакет и выполняет его. Ни одной учётной записи на самом сайте злоумышленнику не нужно.
Участие человека при этом обязательно. Открыть ссылку должен администратор, вошедший в панель управления. Это либо целевой фишинг против конкретного сотрудника, либо внедрение скрипта (межсайтовый скриптинг) на самом сайте. Во втором случае запрос уходит автоматически, когда администратор просматривает заражённую страницу. Запустить атаку со стороны обычного посетителя, автора или редактора не выйдет, прав не хватает. Если на сайте запрещена установка файлов, например включена константа DISALLOW_FILE_MODS, внедрение скрипта сработает, но дойти до установки тем и плагинов не получится.
Что даёт выполнение кода на сервере, видно по перечню возможностей. Тема получает доступ к файлу конфигурации и учётным данным базы, к данным других дополнений, к сведениям, которые видит рабочий процесс PHP. Она может создавать и менять пользователей и записи, править файлы приложения и полностью распоряжаться как сайтом, так и сервером под ним. Поэтому установка темы - это развёртывание кода, а не смена оформления.
В WordPress 7.1.1 разработчики сузили выбор элемента до настоящей карточки темы и пропускают значение через экранирование перед подстановкой в селектор. Кавычка, разделители и комментарий теперь читаются как обычные символы, а не как структура. Нажать за администратора страница больше не может. Обновиться стоит всем, кто ещё этого не сделал, тем более что релиз принёс ещё десять исправлений. Проблему в теме-посреднике патч не закрывает, за неё отвечают авторы самой темы, а список подходящих для такой связки тем остаётся широким.
Отдельную подделку установки исследователи оценили как высокую по уровню риска, а полную цепочку с выполнением кода - как критическую, хотя участие пользователя снижает итоговую оценку. WordPress заплатил максимальную выплату по своей программе, 300 долларов, и обещает присвоить идентификатор CVE. Пока его нет. В релизе отметили pwn.ai без номера уязвимости. Сведений о реальных атаках не публиковалось, полное техническое описание появилось 18 сентября.
Общий смысл этой истории не в одном конкретном селекторе. Один и тот же параметр разбирают две независимые части системы, поэтому проверять его приходится с обеих сторон. Шаблон встречается всюду, где серверный код и код браузера обрабатывают одно значение по отдельности. Администраторам стоит держать обновления в актуальном состоянии и помнить, что переход по незнакомой ссылке в панели управления равносилен выдаче прав на установку дополнений.
Ссылки
- https://pwn.ai/blog/click2shell
- https://patchstack.com/database/wordpress/wordpress/wordpress/vulnerability/wordpress-core-7-1-cross-site-request-forgery-to-theme-install-and-preview-vulnerability
- https://wordpress.org/documentation/wordpress-version/version-7-1-1/
- https://patchstack.com/articles/click2shell-the-rce-wordpress-7-1-1-just-patched/