WordPress держит значительную часть интернета, и заметная доля его функциональности приходит из плагинов. Каждый плагин — это сторонний код с доступом к базе данных и файлам сайта. Когда в популярном плагине находят критическую уязвимость, под угрозой оказываются десятки тысяч сайтов одновременно, и времени на аккуратное обновление почти нет.
Инцидент с Ninja Forms — учебный пример: разработчик выпустил принудительное обновление, закрывающее уязвимость, которая позволяла захватить сайт. Разберём, что произошло и как выстроить процесс, чтобы такие новости не заставали врасплох.
Что случилось
В плагине Ninja Forms, одном из популярных конструкторов форм для WordPress, обнаружили критическую уязвимость. Она затрагивала версии 3.0 и новее и была исправлена в 3.6.11. Обновление распространялось принудительно: WordPress умеет автоматически ставить патчи для уязвимых версий плагинов, и это как раз тот случай.
Характер проблемы — внедрение кода. В сочетании с другими ошибками она позволяла атакующему выполнить произвольный код на сервере и полностью взять сайт под контроль: читать базу, менять страницы, устанавливать бэкдоры.
Почему формы — лакомая цель
Плагин форм принимает данные от анонимных посетителей. Это значит, что входная точка доступна из интернета без аутентификации. Если обработчик не проверяет типы данных и права, пользовательский ввод может попасть туда, где его не ждут: в SQL-запрос, в файл или в вызов функции.
Второй фактор — распространённость. Формы нужны почти на любом сайте, поэтому один и тот же код работает на тысячах установок, и одна уязвимость даёт атакующему масштаб.
Как проверить свой сайт
Сначала узнайте версию плагина. В админке это раздел «Плагины», но надёжнее через WP-CLI:
wp plugin list --fields=name,status,version,update
wp plugin get ninja-forms --field=version
Если версия ниже 3.6.11, обновитесь немедленно. Перед обновлением сделайте резервную копию файлов и базы:
wp db export ~/backup-$(date +%F).sql
tar czf ~/wp-files-$(date +%F).tar.gz /var/www/html
wp plugin update ninja-forms
wp plugin list --fields=name,version | grep ninja
Автоматическое обновление могло уже сработать — тогда проверьте, что версия действительно изменилась, а не только появилась запись в журнале.
Настройка автообновлений
WordPress поддерживает автоматические обновления плагинов, но по умолчанию включает их не для всех. Для сайтов, где важна безопасность, разумно разрешить автообновления хотя бы для критичных плагинов и держать свежую резервную копию.
# wp-config.php
define('WP_AUTO_UPDATE_CORE', 'minor');
add_filter('auto_update_plugin', '__return_true'); // в mu-plugin
У автоматики есть цена: обновление может сломать совместимость. Поэтому тестовый стенд и резервная копия обязательны. Если сайт небольшой и вы обновляетесь вручную, подпишитесь на уведомления о безопасности плагинов — молчание здесь не означает, что всё хорошо.
Что делать, если сайт уже взломали
- Переведите сайт в режим обслуживания и сохраните копию для анализа.
- Смените пароли администраторов, ключи API и соли в
wp-config.php. - Проверьте список пользователей на неизвестные учётные записи с правами администратора.
- Сравните файлы ядра и плагинов с эталонными версиями.
- Проверьте задания cron и подозрительные записи в базе.
- Обновите всё, что отстаёт, и только потом возвращайте сайт в работу.
wp user list --role=administrator --fields=ID,user_login,user_email
wp cron event list
wp core verify-checksums
Если не уверены в чистоте, разумнее восстановить сайт из резервной копии до инцидента и затем закрыть уязвимость. «Дочистка» без понимания вектора почти всегда оставляет лазейку.
Профилактика на уровне конфигурации
- Удаляйте плагины, которыми не пользуетесь: неактивный плагин всё равно содержит код.
- Не устанавливайте плагины из сторонних архивов и «nulled» сборок.
- Ограничьте доступ к
wp-adminпо IP, если это возможно. - Включите двухфакторную аутентификацию для администраторов.
- Настройте WAF или хотя бы базовые правила на уровне веб-сервера.
- Держите резервные копии вне сервера и проверяйте восстановление.
Чего не делать
Не отключайте автоматические обновления «чтобы ничего не сломалось» на публичном сайте: риск взлома выше, чем риск временной несовместимости. Не редактируйте файлы плагина напрямую — при следующем обновлении правки исчезнут, а уязвимость останется. Не устанавливайте «патч» из письма или форума: официальный источник только один — репозиторий WordPress.org или сайт разработчика.
Как читать новости об уязвимостях WordPress
Сообщения о плагинах приходят постоянно, и легко перестать на них реагировать. Помогает простой фильтр из трёх вопросов: установлен ли у меня этот плагин, доступен ли он из интернета, и есть ли уже обновление. Если ответ «да, да, да» — действовать нужно сегодня. Если плагин установлен, но используется только в админке за VPN, срочность ниже, хотя обновление всё равно нужно.
Отдельно проверяйте, не является ли плагин заброшенным. Если последнее обновление было два года назад, исправления могут не выйти вовсе, и единственный выход — заменить плагин. Смотреть дату обновления и число активных установок полезнее, чем читать описание возможностей.
Ведите короткий список плагинов с датой последней проверки. Это занимает минуту в месяц и даёт понимание, что именно может сломаться или стать входной точкой.
Итог
История Ninja Forms напоминает, что безопасность WordPress — это процесс, а не одна настройка. Знайте версии своих плагинов, разрешите автообновления для критичных компонентов, держите свежие резервные копии и имейте план на случай взлома. Эти четыре привычки закрывают большинство реальных инцидентов.