WordPress закрыла уязвимость обхода пути, ведущую к RCE

WordPress закрыла уязвимость обхода пути, ведущую к RCE

WordPress опубликовала security advisory об уязвимости в функции get_page_template(), которая отвечает за подбор шаблона страницы. Неавторизованный атакующий может заставить эту функцию подключить произвольный доступный для чтения .php-файл за пределами директорий активной темы, это классический path traversal (обход пути). При выполнении дополнительных условий со стороны сервера и темы обход пути превращается в удалённое выполнение кода (RCE).

Условия таковы. Во-первых, активная дочерняя или родительская тема должна содержать папку верхнего уровня, имя которой начинается на «page-» (например, page-templates), это касается старых стандартных тем Twenty Twelve и Twenty Fourteen, а также ряда популярных сторонних тем: Neve, Hestia и Sydney. Во-вторых, на сервере должен существовать конкретный локальный .php-файл, доступный для чтения от имени веб-сервера. В качестве такого файла может использоваться pearcmd.php: известная связка PEAR→RCE срабатывает, когда включена директива register_argc_argv. Это верно для официального Docker-образа PHP, а также для конфигурации cPanel по умолчанию, но только если используется PHP старше версии 8.5.

Уязвимость затрагивает практически всю историю WordPress: версии от 4.7.0 до 7.1.1 включительно, по всем промежуточным веткам. Исправление вышло в составе WordPress 7.1.2, и, в порядке исключения для пользователей старых веток, патч был бэкпортирован во все ветки вплоть до 4.7. Уязвимость обнаружил и ответственно раскрыл разработчику исследователь Robert Ressl.

Ключевые факты

  • Функция get_page_template() позволяет неавторизованному атакующему подключить произвольный доступный для чтения .php-файл вне директорий активной темы (path traversal).
  • До RCE это доходит только при двух условиях: у активной темы есть папка верхнего уровня с именем на «page-» (Twenty Twelve, Twenty Fourteen, а также сторонние Neve, Hestia, Sydney), и на сервере есть подходящий читаемый .php-файл, например, pearcmd.php при включённой register_argc_argv.
  • Такая связка pearcmd.php реализуется в официальном Docker-образе PHP и в конфигурации cPanel по умолчанию с PHP старше 8.5.
  • Уязвимы версии WordPress от 4.7.0 до 7.1.1; патч вышел в 7.1.2 и бэкпортирован во все ветки вплоть до 4.7.
  • Уязвимость обнаружил и ответственно раскрыл Robert Ressl.

Почему это важно

Это уязвимость без авторизации в самом ядре WordPress, а не в плагине или теме, и она тянется через все ветки, от текущей 7.1.x до 4.7.x, то есть затрагивает сайты, которые годами не обновлялись. WordPress остаётся одной из самых распространённых CMS в вебе, поэтому обход пути в базовой функции подбора шаблона касается огромного числа установок сразу.

Кому это важно

В первую очередь, администраторам и хостинг-провайдерам сайтов на WordPress, особенно тех, что используют темы с папкой верхнего уровня на «page-»: старые стандартные Twenty Twelve и Twenty Fourteen, а также сторонние Neve, Hestia и Sydney. Отдельно это важно тем, кто разворачивает WordPress в официальном Docker-образе PHP или на cPanel с настройками по умолчанию и PHP старше 8.5, именно там совпадает второе условие для RCE через pearcmd.php.

Как это применить

Практический шаг один, обновить WordPress до патченной версии своей ветки: 7.1.2 для актуальной линии, либо соответствующий бэкпорт-релиз (7.0.6, 6.9.9, 6.8.10 и так далее вплоть до 4.7.37 для самой старой поддерживаемой ветки). Дополнительно стоит проверить, не содержит ли используемая тема директорию с именем на «page-», и по возможности отключить register_argc_argv в php.ini, а также перейти на PHP 8.5 и новее, где связка pearcmd.php не работает.

Можно ли доверять

Источник, официальный security advisory WordPress в GitHub Security Advisories, то есть первичное сообщение от самого проекта, а не пересказ третьих лиц. В нём указаны точные диапазоны затронутых и патченных версий и названо имя исследователя, ответственно раскрывшего уязвимость. Оснований сомневаться в достоверности нет.

Риски и подводные камни

RCE здесь не гарантирован, он возможен только при совпадении темы с папкой на «page-» и наличии подходящего читаемого .php-файла на сервере; без этих условий эксплуатация ограничивается собственно обходом пути. В самом advisory нет идентификатора CVE, не указаны даты обнаружения или исправления и ничего не сказано о том, эксплуатировалась ли уязвимость в реальных атаках до выхода патча, эти детали пока не публиковались.