Wordpress

wp2shell: как критическая RCE-уязвимость в ядре WordPress 2026 года чуть не положила миллионы сайтов

07.08.2026 10 мин чтения

В пятницу 17 июля 2026 года я открыл почту утром и увидел три письма от Wordfence, Patchstack и хостинг-провайдера. Все про одно и то же: критическая уязвимость в ядре WordPress, RCE без аутентификации, эксплойт уже в дикой природе. Название — wp2shell.

К тому моменту я обслуживаю WordPress-сайты десять лет. Обновления ядра выходят регулярно, и обычно там заплатки для XSS в плагинах или баги в REST API средней серьёзности. Но wp2shell — это другой уровень. Цепочка из двух уязвимостей (CVE-2026-60137 и CVE-2026-63030), которая позволяет любому анонимусу выполнить произвольный код на дефолтной установке WordPress. Без пароля, без плагина, без клика от администратора.

Разбираюсь, что это за баг, как работает цепочка, кому угрожает и что делать прямо сейчас.

Что такое wp2shell

wp2shell — это цепочка из двух уязвимостей в ядре WordPress, которые вместе дают unauthenticated remote code execution. Первая уязвимость (CVE-2026-60137) — это SQL-инъекция в REST API. Вторая (CVE-2026-63030) — преобразование результата SQL-инъекции в выполнение кода через механизм, который WordPress использует для обработки данных в REST API.

По данным Wordfence, это первая критическая unauthenticated RCE в ядре WordPress за почти десять лет. Предыдущая похожая по серьёзности была в 2017 году — REST API Content Injection, которая позволяла править содержимое постов. Но та не давала RCE.

Уязвимость назвали wp2shell, потому что конечный результат — это возможность выполнить shell-команды на сервере через HTTP-запрос к WordPress-сайту. Буквально curl с правильным payload — и у вас шелл.

Какие версии затронуты

Согласно данным WPScan и NVD, уязвимы:

  • WordPress 6.9.0 — 6.9.4 (обе уязвимости)
  • WordPress 7.0.0 — 7.0.1 (обе уязвимости)
  • WordPress 6.8.x — затронута только CVE-2026-60137 (SQL-инъекция), но без второй части цепочки получить RCE сложнее

Пропатченные версии:

  • WordPress 6.8.6 — фикс SQL-инъекции для ветки 6.8
  • WordPress 6.9.5 — фикс обеих уязвимостей для ветки 6.9
  • WordPress 7.0.2 — фикс обеих уязвимостей для ветки 7.0

Если у вас WordPress 6.7.x или ниже — вы не подвержены wp2shell напрямую. Но если вы до сих пор на 6.7, у вас другие проблемы: куча пропущенных обновлений и потенциально уязвимые плагины.

Как работает цепочка эксплойта

Схема защиты WordPress: firewall и защитные барьеры
Только настройка нескольких уровней защиты — WAF, обновления, мониторинг — даёт реальную защиту от цепочек эксплойтов вроде wp2shell.

Техническая сторона дела объясняет, почему дефолтные настройки оказались настолько уязвимыми.

Шаг 1: SQL-инъекция через REST API (CVE-2026-60137)

WordPress REST API в версии 6.9 получил новый маршрут для обработки медиафайлов. Параметр, который фильтровал запросы к базе данных, не sanitize’ился должным образом. Анонимный пользователь мог отправить специально сформированный запрос к /wp-json/wp/v2/media или связанному эндпоинту, и внедрить SQL-код прямо в запрос к базе.

Сама по себе SQL-инъекция — это серьёзно. Можно читать данные из базы: хэши паролей, содержимое таблиц, токены. Но WordPress хранит сессии и autoload-опции в базе, и это открывает путь ко второй части.

Шаг 2: От SQL-инъекции к RCE (CVE-2026-63030)

Вторая уязвимость эксплуатирует то, как WordPress обрабатывает данные, полученные из базы. Если атакующий может контролировать содержимое определённых опций в таблице wp_options (через SQL-инъекцию из первого шага), он может заставить WordPress выполнить произвольный PHP-код при следующем запросе.

Механизм завязан на maybe_unserialize() и обработку опций, которые загружаются автоматически на каждом запросе (autoload = yes). WordPress при загрузке читает все autoload-опции из базы и передаёт их через maybe_unserialize(). Если в опции записан PHP-объект с __wakeup() или __destruct() методом, PHP выполнит этот метод. Атакующий через SQL-инъекцию записывает такой объект в базу — и при следующем запросе код выполняется.

Это классический PHP Object Injection, но в контексте ядра WordPress, а не плагина. Что делает его особенно опасным: не нужен конкретный плагин, не нужна конкретная тема. Достаточно дефолтной установки WordPress 6.9+.

Почему это сработало на дефолтной установке

Здесь важный момент: WordPress рекомендует использовать persistent object cache (Redis или Memcached). С ним autoload-опции кешируются и читаются из кеша, а не из базы. В этом случае SQL-инъекция в таблицу опций не даёт прямого пути к RCE, потому что изменённые данные в базе не попадают в кеш немедленно.

Но дефолтная установка WordPress работает без persistent object cache. По оценкам WordPress.com, около 60-70% сайтов используют дефолтную конфигурацию без Redis/Memcached. Эти сайты были уязвимы к полной цепочке wp2shell.

Сайты с persistent object cache были защищены от RCE-части, но всё ещё подвергались SQL-инъекции, которая позволяет читать данные из базы.

Хронология: как разворачивался инцидент

По данным Rapid7 и VulnCheck, хронология выглядит так:

  • 17 июля 2026, 14:00 UTC — WordPress Security Team публикует обновления 6.8.6, 6.9.5 и 7.0.2. Одновременно публикуется GitHub Security Advisory для CVE-2026-63030.
  • 17 июля, ~16:00 UTC — Wordfence и Patchstack выпускают аналитические статьи. Появляются первые PoC-эксплойты на GitHub.
  • 18 июля — SecurityWeek сообщает о массовой эксплуатации в дикой природе. Akamai фиксирует тысячи попыток эксплуатации по всему миру.
  • 19-20 июля — публичный эксплойт-код появляется на форумах и в Telegram-каналах. Количество атак растёт экспоненциально.
  • 21 июля — по данным Wordfence, заблокировано более 2,5 миллионов попыток эксплуатации за четыре дня.

От релиза патча до массовых атак прошло меньше суток. Исследователи и атакующие реверс-инжинирят патч за часы — это типичная картина для уязвимостей ядра популярных CMS.

Статистика WordPress-уязвимостей в 2026 году

Отчёт Patchstack “State of WordPress Security in 2026” даёт контекст для понимания масштаба проблемы. В 2025-2026 годах:

  • Зафиксировано 11 334 новых уязвимости в экосистеме WordPress (рост 42% год к году)
  • 91% уязвимостей найден в плагинах, 6% в темах, 3% в ядре
  • Highly exploitable уязвимости выросли на 113% по сравнению с предыдущим годом
  • В среднем — 250+ уязвимостей в плагинах каждую неделю (около 36 в день)
  • ~13 000 WordPress-сайтов взламывают каждый день

wp2shell в этой статистике — это редкий случай, когда уязвимость в самом ядре, а не в плагине. Но именно поэтому она так опасна: затронуты все сайты на уязвимых версиях, независимо от того, какие плагины установлены.

Что делать: практический чек-лист

1. Обновите WordPress немедленно

Проверьте версию WordPress. Если у вас 6.9.0–6.9.4 или 7.0.0–7.0.1 — обновляйтесь до 6.9.5 или 7.0.2 прямо сейчас. Если 6.8.x — обновляйтесь до 6.8.6 минимум. В админке: «Консоль» → «Обновления» → кнопка «Обновить WordPress».

Для обновления через WP-CLI:


wp core update --version=7.0.2 --force
wp core update-db

После обновления проверьте, что сайт работает: откройте главную страницу, попробуйте залогиниться, проверьте REST API через /wp-json/.

2. Включите persistent object cache

Это та мера, которая бы закрыла RCE-часть wp2shell даже без обновления ядра. Если на хостинге есть Redis или Memcached, включите его. В wp-config.php:


define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);

И установите плагин Redis Object Cache или Memcached Object Cache. Это не замена обновлению, но дополнительный слой защиты.

3. Проверьте логи на следы эксплуатации

Ищите подозрительные запросы к REST API за период с 17 июля по настоящее время:


grep -i "wp-json/wp/v2/media" /var/log/nginx/access.log | grep -E "POST|PUT|PATCH"
grep -i "wp-json" /var/log/apache2/access.log | grep " UNION "

Признаки эксплуатации: нестандартные параметры в запросах к REST API, длинные строки в query-параметрах, SQL-конструкции (UNION, SELECT, SLEEP) в URI.

4. Установите WAF

Web Application Firewall перехватывает попытки эксплуатации SQL-инъекций на уровне HTTP-запроса. Варианты:

  • Cloudflare — бесплатный план даёт базовую защиту, WAF на Pro-плане ($20/мес) ловит большинство SQLi-атак
  • Wordfence — плагин с firewall, есть бесплатная версия. Premium ($119/год) обновляет сигнатуры в реальном времени
  • Sucuri — облачный WAF, $199,99/год, работает как прокси перед сайтом
  • ModSecurity — серверный WAF, бесплатно, но требует настройки правил (OWASP CRS)

WAF — это не панацея. Умный атакующий обходит сигнатуры. Но против массовых автоматических атак, которые были основным вектором для wp2shell, WAF работает.

5. Проверьте целостность файлов

Если сайт был уязвим в период с 17 июля, проверьте, не закинул ли атакующий бэкдор. WordPress может проверить контрольные суммы ядра:


wp core verify-checksums

Если проверки не прошли — в ядре изменены файлы. Дополнительные шаги: проверить .php файлы в wp-content/uploads/ (там не должно быть PHP-файлов), проверить .htaccess на странные правила, просканировать плагины через Wordfence Scan или Sucuri SiteCheck.

6. Поменяйте пароли и API-ключи

Если сайт был уязвим к SQL-инъекции, атакующий мог прочитать хэши паролей из wp_users. WordPress использует phpass (MD5-based), что не так плохо при сильных паролях, но при слабых — брутфорсится за часы.

Сбросьте пароли всех администраторов и редакторов. Перегенерируйте ключи в wp-config.php (блок AUTH_KEY, SECURE_AUTH_KEY и т.д.) через api.wordpress.org/secret-key/1.1/salt/. Это инвалидирует все существующие сессии и cookie.

Почему в 2026 году WordPress всё ещё уязвим на дефолтной установке

Это вопрос, который задают все после инцидентов такого масштаба. WordPress работает на 43% всех сайтов в интернете. Десятки миллионов установок. Любая уязвимость в ядре — это потенциально миллионы скомпрометированных сайтов.

Архитектурная проблема, которую wp2shell обнажил: WordPress по умолчанию не использует persistent object cache. Это значит, что каждый HTTP-запрос читает autoload-опции напрямую из базы. И если база скомпрометирована через SQL-инъекцию, данные, которые попадают в PHP-процесс, контролируются атакующим.

WordPress.org рекомендует Redis или Memcached с 2016 года. Но рекомендация — не требование. Плагины кеширования (W3 Total Cache, WP Super Cache) часто работают только с файловым кешем, который не закрывает этот вектор. Только Redis/Memcached как drop-in replacement для object cache решает проблему.

Вторая проблема: maybe_unserialize() в ядре. PHP-функция unserialize() известна своими проблемами безопасности с 2009 года. В 2024 году PHP RFC предлагал дефолтно отключить десериализацию объектов, но предложение не прошло. WordPress использует maybe_unserialize() для обработки опций, мета-данных и трансиентов. Полный отказ от unserialize() в ядре — это большой рефакторинг, который не сделают в ближайшее время.

Уроки для разработчиков и админов

Несколько выводов из инцидента, которые стоит зафиксировать:

Обновления ядра — это не “попозже”. wp2shell показывает, что окно между публикацией патча и началом массовых атак составляет часы, не дни. Автоматические обновления ядра (включены по умолчанию с WordPress 3.7, но многие отключают их) — это минимальная защита.

Persistent object cache — это не оптимизация производительности, это безопасность. Redis на сервере стоит копейки по сравнению с восстановлением взломанного сайта. Если у вас VPS за $5/мес, поставьте Redis — он занимает 20-50 МБ оперативки для типичного WordPress-сайта.

WAF закрывает массовые атаки. Когда эксплойт публичный и автоматизированный, WAF блокирует 99% попыток. Это не поможет против таргетированной атаки с custom эксплойтом, но от ботов, которые сканируют весь интернет на wp2shell, спасает.

Мониторинг логов — это не паранойя. Если вы не проверяете access-логи после публичного раскрытия критической уязвимости в вашем стеке, вы не узнаете, что вас пытались (или успешно) взломать, пока не станет поздно.

Что было после патча

По данным Wordfence, за первую неделю после выхода обновления:

  • Заблокировано 2,5+ миллионов попыток эксплуатации wp2shell
  • Обновлено до 6.9.5/7.0.2 около 40% сайтов из уязвимого пула за первые 72 часа
  • Зафиксировано более 3000 подтверждённых компрометаций сайтов (взломанных до выхода патча)
  • В нескольких случаях атакующие устанавливали бэкдоры в wp-content/uploads/ и модифицировали .htaccess для перенаправления трафика

Цифры от Akamai ещё интереснее: их WAF зафиксировал пиковую нагрузку в 18 000 попыток эксплуатации в час в первые 48 часов после публикации эксплойта. Большинство атак шли с IP-адресов в Китае, России, Бразилии и Индии — типичная картина для ботнетов, которые сканируют IPv4-диапазоны.

Итог

wp2shell показал, что WordPress — это не «поставил и забыл». Уязвимость в ядре, которая даёт RCE без аутентификации на дефолтной установке, — серьёзная проблема. Цепочка сработала, потому что дефолтная конфигурация не имеет persistent object cache, а maybe_unserialize() остаётся в ядре.

Если вы ещё не обновились до 6.9.5 или 7.0.2 — сделайте это сейчас. Включите Redis. Поставьте WAF. Проверьте логи. Это не паранойя, это базовая гигиена.

А какие меры безопасности вы считаете обязательными для WordPress в 2026 году? Поделитесь в комментариях — интересно узнать, что работает на практике у вас.

Евгений Слесаренко
Автор

Евгений Слесаренко

Частный разработчик на Bitrix и WordPress. Пишу о том, как делать сайты и сервисы понятнее, сильнее визуально и спокойнее в поддержке.