Обновления защищают от внешних угроз. Но как проверить, не проникло ли что-то внутрь? В этой статье мы рассмотрим три проверки с помощью 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 вообще не выполнялся в папке загрузок. Это сокращает количество точек входа, а не просто обнаруживает вторжения. Метод зависит от конкретного сервера, поэтому мы рассмотрим его отдельно.
Сделайте это рутиной
Эти проверки приносят больше пользы, если запускать их регулярно по расписанию, сравнивая результаты с предыдущими.
- Фиксируйте дату и результаты, включая предупреждения
- Пока вы не можете объяснить причину предупреждения, не считайте его безобидным
- Запускайте проверки и после обновлений, чтобы увидеть, не появилось ли что-то постороннее
Если вы управляете несколькими сайтами, использование алиасов для переключения между ними поможет сохранить единый регламент. Оценивайте результаты для каждого сайта индивидуально.
Если что-то выглядит подозрительно
- Зафиксируйте команду, вывод и время. Пока ничего не удаляйте и не перезаписывайте
- Убедитесь, что это действительно аномалия: возможно, это ваши собственные изменения или штатное поведение плагина?
- Если ситуация по-прежнему выглядит подозрительно, переходите к процедуре реагирования, включающей восстановление. Наличие резервной копии, к которой можно вернуться в чистое состояние, во многом определяет дальнейшие действия
Мы подробно разберем шаги по реагированию в отдельной статье. Если вы не уверены в своих силах, проконсультируйтесь со специалистом.
Итоги
- Обновления защищают будущее. Проверка того, что уже находится внутри — вторая половина обслуживания
-
wp core verify-checksumsиwp plugin verify-checksumsвыполняют сравнение с опубликованными хешами. Всё, что не удалось проверить, следует рассматривать как часть результата - Проверяйте список администраторов с помощью
wp user list --role=administrator, пока не сможете объяснить происхождение каждого - Наличие PHP-файлов в
uploads/в норме не ожидается. Если вы нашли их, зафиксируйте их, а не запускайте - Успешное прохождение проверки не доказывает безопасность. Полезной ее делает именно привычка сравнивать результаты с прошлым разом
Что сделать сегодня: запустите wp user list --role=administrator и убедитесь, что можете объяснить каждое имя и причину его появления.
Комментарии (0)
Пока нет комментариев — будьте первым.