Обновления защищают от внешних угроз. Но как проверить, не проникло ли что-то внутрь? В этой статье мы рассмотрим три проверки с помощью WP-CLI:  проверку контрольных сумм ядра и плагинов,  инвентаризацию учетных записей администраторов и  поиск PHP-файлов в папке загрузок. Мы разберем, как читать результаты и в каких случаях эти методы теряют эффективность. Данные проверки относятся к рутинным защитным процедурам, и их успешное прохождение не является абсолютной гарантией безопасности.

Зачем проверять то, что «уже внутри»

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

Поэтому обслуживание требует второго ракурса:  соответствует ли текущее состояние системы тому, каким оно должно быть? Все три описанные ниже проверки работают только на чтение. Они не вносят изменений в сайт.

Проверка Что она подтверждает Основная команда
① Совпадение файлов Файлы ядра и плагинов идентичны опубликованным оригиналам  wp core verify-checksums  /  wp plugin verify-checksums 
② Учетные записи Отсутствуют незнакомые вам администраторы  wp user list --role=administrator 
③ Расположение В местах, где кода быть не должно, нет PHP-файлов  find  через  uploads/ 

① Сравнение файлов с опубликованными контрольными суммами

Как описано в нашей статье об основах хеш-функций и контрольных сумм, изменение даже одного символа в файле меняет его хеш. WP-CLI применяет этот подход к WordPress.

 wp core verify-checksums
 

Эта команда скачивает с сайта WordPress.org список MD5-контрольных сумм для установленной у вас версии и сравнивает их с файлами на диске. Согласно документации, она  избегает загрузки WordPress в процессе проверки, поэтому измененный код не выполняется во время сканирования.

При успешном прохождении выводится:

 Success: WordPress installation verifies against checksums.
 

Если что-то отличается, вы получите предупреждение по каждому такому файлу — например, о несовпадении контрольной суммы или наличии лишнего файла.

Важные нюансы:

  •  Локаль и версия: если проверка ведет себя некорректно, передайте  --locale  и  --version , чтобы значения соответствовали экрану обновлений, так как локализованные сборки различаются
  •  Корневая директория: по умолчанию проверка затрагивает только файлы ядра; добавьте  --include-root , чтобы также получать предупреждения о незнакомых элементах в корне сайта
  •  Ваши собственные правки: если вы изменяли файлы ядра, несовпадение ожидаемо. Главное — можете ли вы объяснить причину каждого расхождения

Плагины работают аналогично

 wp plugin verify-checksums --all
 

Этот способ работает для плагинов, распространяемых через каталог WordPress.org. Важно  не упускать из виду то, что проверить не удалось. У платных плагинов и плагинов из сторонних источников нет опубликованных контрольных сумм, и утилита сообщит, что не может их проверить. Сама по себе это не проблема, но это  пробел в вашей защите, который следует закрыть другими средствами — например, историей изменений от разработчика или временем модификации файлов.

Чего проверка контрольных сумм сделать не может

  • Она не проверяет темы или плагины, у которых нет опубликованных контрольных сумм
  • Она игнорирует  wp-config.php ,  uploads/  и созданные вами файлы, так как эталонных значений для них не существует
  • Она не видит содержимое базы данных, например опции или записи, содержащие нежелательный код
  • Она не способна обнаружить случай, когда  сам источник дистрибутива был скомпрометирован (см. нашу статью о цепочках поставок)

Слово «совпадает» означает «соответствует опубликованному оригиналу», но не означает «безопасно».

② Инвентаризация учетных записей администраторов

След, который часто остается после взлома — это  незнакомая вам учетная запись администратора. Смена пароля ее не удаляет, а чужой аккаунт с правами администратора остается лазейкой для злоумышленника.

 wp user list --role=administrator --fields=ID,user_login,user_email,user_registered
 

Отфильтруйте пользователей по роли и выведите время регистрации. Затем задайте себе вопросы:

  •  Можете ли вы объяснить каждый аккаунт? Кто этот администратор и зачем ему такие права
  •  Логичны ли даты регистрации? Не были ли созданы аккаунты в то время, когда никто не работал над сайтом
  •  Соответствуют ли ожиданиям адреса электронной почты? Бывшие сотрудники, прошлые агентства или неиспользуемые ящики
  •  Нет ли лишних администраторов? Часто для работы достаточно роли редактора

Если вы обнаружили незнакомую учетную запись,  не удаляйте ее на месте. Удаление уничтожает улики. Сначала зафиксируйте обстановку.

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

③ Поиск PHP-файлов в папке загрузок

 wp-content/uploads/  содержит изображения и документы, добавленные через медиабиблиотеку.  В норме там не должно быть PHP-файлов, поскольку в хранилище медиафайлов нет необходимости держать исполняемый код.

Проверка выполняется в режиме чтения:

 find wp-content/uploads -type f -name '*.php'
 

Отсутствие вывода означает, что проверка ничего не нашла. Если что-то было обнаружено:

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

Практически пустой  index.php  — распространенная практика, предотвращающая просмотр содержимого директории (листинг), и ее легко узнать по содержимому.

Следующий шаг —  настроить сервер так, чтобы PHP вообще не выполнялся в папке загрузок. Это сокращает количество точек входа, а не просто обнаруживает вторжения. Метод зависит от конкретного сервера, поэтому мы рассмотрим его отдельно.

Сделайте это рутиной

Эти проверки приносят больше пользы, если запускать их  регулярно по расписанию, сравнивая результаты с предыдущими.

  • Фиксируйте дату и результаты, включая предупреждения
  • Пока вы не можете объяснить причину предупреждения, не считайте его безобидным
  • Запускайте проверки и после обновлений, чтобы увидеть, не появилось ли что-то постороннее

Если вы управляете несколькими сайтами, использование алиасов для переключения между ними поможет сохранить единый регламент. Оценивайте результаты для каждого сайта индивидуально.

Если что-то выглядит подозрительно

  1.  Зафиксируйте команду, вывод и время. Пока ничего не удаляйте и не перезаписывайте
  2.  Убедитесь, что это действительно аномалия: возможно, это ваши собственные изменения или штатное поведение плагина?
  3. Если ситуация по-прежнему выглядит подозрительно, переходите к процедуре реагирования, включающей восстановление. Наличие резервной копии, к которой можно  вернуться в чистое состояние, во многом определяет дальнейшие действия

Мы подробно разберем шаги по реагированию в отдельной статье. Если вы не уверены в своих силах, проконсультируйтесь со специалистом.

Итоги

  • Обновления защищают будущее.  Проверка того, что уже находится внутри — вторая половина обслуживания
  •  wp core verify-checksums  и  wp plugin verify-checksums  выполняют сравнение с опубликованными хешами. Всё, что  не удалось проверить, следует рассматривать как часть результата
  • Проверяйте список администраторов с помощью  wp user list --role=administrator , пока не сможете объяснить происхождение каждого
  • Наличие PHP-файлов в  uploads/  в норме не ожидается. Если вы нашли их, зафиксируйте их, а не запускайте
  • Успешное прохождение проверки не доказывает безопасность. Полезной ее делает именно привычка  сравнивать результаты с прошлым разом

Что сделать сегодня: запустите  wp user list --role=administrator  и убедитесь, что можете  объяснить каждое имя и причину его появления.