В пятницу 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, у вас другие проблемы: куча пропущенных обновлений и потенциально уязвимые плагины.
Как работает цепочка эксплойта

Техническая сторона дела объясняет, почему дефолтные настройки оказались настолько уязвимыми.
Шаг 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 году? Поделитесь в комментариях — интересно узнать, что работает на практике у вас.