Автоматическая проверка безопасности релизов плагинов WordPress: что изменилось

Wordpressбезопасностьобновленияплагины

9 сентября команда плагинов WordPress.org объявила о запуске автоматической проверки безопасности для каждого релиза плагина. Теперь до того, как версия уйдёт в update API WordPress.org — то есть до того, как она появится у вас в дашборде, — её изменения анализируются на предмет безопасности. Релизы, признанные потенциально рискованными (умышленно или случайно), блокируются автоматически.

Это заметное изменение в процессе, о котором стоит знать и владельцам сайтов, и тем, кто плагины делает.

Что именно изменилось

Логика каталога была такой: новый плагин проверяют перед тем, как пустить его в каталог, но дальше обновления выходят непрерывно. Плагин может быть безопасным сегодня и принести уязвимость или вредоносный код в следующем релизе. Единого шага проверки между коммитом и выпуском до сих пор не было — именно эту дыру и закрывают.

Как это работает сейчас:

  • С 5 июня каждый релиз плагинов и тем проходит через cooldown перед распространением через update API, включая обновления в один клик из админки. Сейчас пауза — 6 часов.
  • В течение этой паузы изменения анализируются на стороне WordPress.org: несколько ИИ-моделей вместе с Jetpack Scan. Результаты перекрёстно сверяются и превращаются в находки с оценкой безопасности — чем выше балл, тем выше потенциальный риск.
  • Релизы с высоким баллом блокируются автоматически, как только проверка завершается. Всем коммиттерам плагина уходит письмо с находками. Релизы ниже порога продолжают идти обычным путём.
  • Письма приходят только при блокировке: если вам ничего не написа́ли, делать ничего не нужно.

Перекрёстная проверка несколькими инструментами держит точность высокой, но, как честно отмечают авторы, не абсолютной — поэтому обратная связь по ложным срабатываниям для них особенно ценна.

Почему это появилось: июльский бэкдор и 26 минут

28 июля бэкдор был закоммичен в релиз плагина с примерно 20 000 активных установок. Автоматическая проверка его обнаружила и присвоила высокий балл безопасности. Релиз ещё находился внутри cooldown-окна, поэтому скомпрометированная версия так и не была распространена через update API. Плагин закрыли для скачивания через 26 минут после того, как Wordfence сообщил команде о случившемся.

Итог хороший, но он показал недостающую деталь: остановка распространения зависела от того, что кто-то из команды оказался на месте и успел среагировать. Автоматическая блокировка убирает эту зависимость.

Высокий балл не означает злой умысел

Важная оговорка, которую стоит прочитать дважды: оценка измеряет риск, а не намерение. Случайно внесённая уязвимость может получить такой же высокий балл, как умышленный вредоносный код.

Читайте также:  Опрос 131 SEO-специалиста: что реально влияет на ранжирование Google в 2026 году

По наблюдению команды, большинство находок — это не вредоносный код, а эндпоинт, написанный для админского экрана и оказавшийся доступным кому угодно. Типичная история: функция делалась «для своих», проверка прав забыта, а маршрут отвечает всем.

Если релиз заблокирован

Порядок действий, который предлагает команда:

1. Разобрать присланные находки — они описывают, что именно вызвало блокировку.

2. Исправить и выпустить новый релиз. Если новый релиз набирает балл ниже порога, он проходит обычный cooldown.

3. Если находка кажется неверной, можно обратиться к команде плагинов. Но объём проверок большой, и выпустить исправленный релиз почти всегда быстрее, чем ждать ручного разбора апелляции.

Что это значит для владельцев сайтов

Практических следствий два, и одно из них неочевидное.

  • Обновления, которые предлагает ваш дашборд, теперь прошли проверку. Скомпрометированная версия просто не доедет до вас — её отсекут раньше. Раньше такой гарантии не было: заражённый релиз оказывался в списке обновлений и ждал, пока кто-то заметит.
  • Между релизом и его доступностью появилась пауза. Сейчас это 6 часов. Для срочных патчей безопасности это означает задержку: если вендор выпустил исправление критической уязвимости, оно появится в дашборде не сразу — для чувствительных сайтов стоит договориться с разработчиком о прямой доставке или ставить патч вручную из проверенного источника.

Автоматическая проверка не отменяет базовых мер на стороне сайта: резервные копии, тестовый контур для обновлений, ограничение админского доступа и контроль изменений в файлах остаются вашей зоной ответственности. Проверка релиза защищает от чужого кода, но не от вашей собственной ошибки в настройках.

Как проверять плагины заранее: инструменты

Автор анонса Дэвид Перес в комментариях перечислил, чем авторам плагинов стоит пользоваться, чтобы не доходить до блокировки. Порядок — по отдаче:

  • PHPCS с WordPress Coding Standards. Набор WordPress-Extra включает сниффы WordPress.Security.* — EscapeOutput, ValidatedSanitizedInput, NonceVerification. Большая часть того, что ловит автоматическая проверка, — это неэкранированный вывод или отсутствующая проверка прав и nonce. Прогон на каждом пул-реквесте отсекает это задолго до релиза:
composer require --dev wp-coding-standards/wpcs dealerdirect/phpcodesniffer-composer-installer
vendor/bin/phpcs --standard=WordPress-Extra .
  • Plugin Check — локально или в CI через официальное действие. Это не только про безопасность: проверяются readme, локализация, производительность и требования каталога, но категория безопасности и проверка позднего экранирования заметно перекрываются с находками авто-ревью.
  • Статический анализ, который следит за потоком данных — PHPStan с пакетом szepeviktor/phpstan-wordpress или Semgrep с правилами для WordPress. Здесь находятся самые интересные случаи: пользовательский ввод, доходящий до «стока» через несколько файлов, чего сниффы просто не видят.
  • QIT, если вы публикуете расширения WooCommerce: там к проверкам совместимости добавлены сканирования безопасности.
Читайте также:  Как собрать E-E-A-T-чекер с помощью ИИ-ассистента для кода

Паттерны, которые чаще всего поднимают балл

Команда перечислила, на что реагирует проверка. Список полезен как чек-лист при ревью кода:

  • REST-, AJAX- или admin-post-эндпоинты без проверки прав доступа. Отдельно подчёркнуто: nonce сам по себе не является авторизацией.
  • Запросы к базе, собранные без $wpdb->prepare().
  • Пути к файлам, загрузка, удаление и подключение файлов, собранные из данных запроса.
  • unserialize() для данных запроса или ответа удалённого сервиса.
  • Опции, метаданные пользователей и настройки, которые записываются из эндпоинтов, доступных подписчикам или неавторизованным пользователям.
  • Код, получаемый или исполняемый во время выполнения, а также обфусцированный и упакованный код.

Что из этого следует

  • Для владельцев сайтов: канал автоматических обновлений стал фильтрованным, но появилась задержка около 6 часов. Планируйте срочные патчи отдельно от «просто обновиться».
  • Для авторов плагинов: блокировка — это не обвинение. Оценка измеряет риск, а не намерение, и разблокировать релиз быстрее всего новым исправленным релизом, а не апелляцией.
  • Для разработчиков: проверку стоит перенести влево — в CI на каждый пул-реквест. PHPCS с WordPress-Extra, Plugin Check и статический анализ закрывают большую часть типовых находок.
  • Отдельно про права доступа: nonce и проверка capability — разные вещи, и проверка не заменяется проверкой. Именно эта путаница даёт заметную долю находок.
  • Про ложные срабатывания: сообщать о них команде полезно — это то, на чём система учится, и единственный способ сделать порог точнее.

Если вы ведёте сайты на WordPress и хотите, чтобы обновления и безопасность не зависели от того, вспомнил ли кто-то про обновление, — посмотрите, как мы устроили эту работу на своих проектах. Про свежие изменения в ядре мы писали в разборе WordPress 7.1, а про магазины — в материале про WooCommerce 11.1.

По материалам make.wordpress.org (David Perez, 9 сентября 2026) и комментариев Дэвида Переса к анонсу.

Добавить комментарий

Email не будет опубликован. Обязательные поля помечены *