Плагины CMS: как проверить источник и код
Москва, Щёлковское шоссе, д. 92, корп. 7 · Пн–Пт 9:00–19:00 · +7 903 729-62-41
АйТи Фреш
Информационная безопасность

Как не пустить подменённый плагин на сайт

Автор: , директор ООО «АйТи-Фреш» · · ~10 мин чтения
Две посылки: официальная с целой пломбой и сомнительная с тайником — метафора проверки плагина CMS
Плагин — это посылка с чужим кодом: смотрите, кто отправил и не вскрыта ли пломба.

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

Почему плагин с форума опаснее устаревшего ядра

В прошлой статье серии мы разбирали CVE-2026-60137 и CVE-2026-63030 в WordPress. Эти уязвимости исправлены в выпусках WordPress 6.8.6, 6.9.5 и 7.0.2 для затронутых веток: детали зависят от версии. Но уязвимость в известном коде и намеренная подмена пакета — разные проблемы. В первом случае помогает установленное исправление, во втором нужно выяснить происхождение файлов. Поэтому проверка расширений для меня — часть информационной безопасности сайта, рядом с обновлениями и учётом компонентов.

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

Представим, что администратор скачал «премиум бесплатно» из случайного архива и загрузил через панель. Сайт может продолжить работать как обычно, хотя внутри пакета уже лежит код, который создаёт учётную запись или меняет содержимое страниц. Это не неизбежный результат каждого неофициального скачивания, но проверить автора и происхождение такого архива значительно труднее. Снаружи сайт может выглядеть нормально; отсутствие явных симптомов ничего не доказывает. Проверка начинается до загрузки на рабочий сайт.

«Бесплатная» пересборка может оказаться дорогой. Сначала проверьте, кто собрал архив.

Какие источники расширений считать допустимыми

Для WordPress я начинаю с каталога wordpress.org/plugins или сайта коммерческого разработчика, у которого организация получила лицензию. Для 1С-Битрикс — с Marketplace и канала поставщика, указанного в документах покупки. Для Joomla — с Joomla Extensions Directory (JED) и страницы автора, на которую ведёт карточка расширения. Для OpenCart проверяю официальный маркетплейс и страницу разработчика. Форум, файлообменник, зеркало или ZIP из переписки не становятся доверенными только потому, что расширение там скачивается быстрее.

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

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

Дерево решений: допустимые источники плагинов CMS и порядок проверки расширения
Сверьте источник до установки

Как сверить автора и сам пакет перед установкой

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

Затем смотрю сам архив, полученный из разрешённого источника. Проверяю состав и структуру файлов, неожиданные PHP-файлы в каталогах изображений, длинные закодированные строки, динамическое выполнение кода и внешние обращения, не нужные функции расширения. Каждый такой признак требует разбора, но сам по себе ещё не доказывает вредоносность: похожие конструкции встречаются и в обычном коде. Быстрая проверка глазами не заменяет полноценный аудит. На копии сайта проверяю основные сценарии и журналы ошибок до выпуска.

У плагинов WordPress из каталога wordpress.org WP-CLI сверяет файлы с контрольными суммами, опубликованными для соответствующей версии. Команда не проверяет коммерческие и собственные плагины, если для них нет эталонных сумм, и чистый результат не доказывает безопасность замысла автора. Для коммерческого ZIP сохраняю SHA-256 исходного архива, источник, версию и дату. Позже этот хэш поможет сравнить архив с сохранённым оригиналом; он не скажет, что авторский код добросовестен. Если файлы на сайте отличаются от проверенного пакета, выясняю причину, прежде чем делать вывод об инциденте.

```bash # плагины из каталога WordPress.org wp plugin verify-checksums --all # файлы ядра WordPress wp core verify-checksums # SHA-256 исходного архива sha256sum plugin-name.zip ```
Если на сайте остались расширения неизвестного происхождения, мы проведём ревизию: установим источники, сверим доступные контрольные суммы, проверим права и подготовим порядок безопасных обновлений. Состав работ и срок зависят от CMS и состояния сайта. Обсудить задачу

Как запретить установку расширений из админки

Если администраторы могут ставить ZIP из панели, письменный список источников легко обойти. В WordPress DISALLOW_FILE_EDIT отключает встроенный редактор файлов тем и плагинов. DISALLOW_FILE_MODS запрещает операции установки и обновления файлов через админку, в том числе для плагинов и тем; он также блокирует фоновые обновления, поскольку WordPress не может менять файлы. Это настройка процесса, а не кнопка «сделать сайт безопасным»: обновления нужно выполнять отдельно, например через контролируемый WP-CLI или деплой, и проверять после выпуска.

Ограничиваю и права на файловой системе. Код сайта должен изменять только тот процесс или пользователь, которому это нужно для установки и выпуска. Если веб-процесс имеет запись во все каталоги кода, компрометация этого процесса упрощает подмену файлов. Загрузки отделяю по правам и настройкам веб-сервера так, чтобы загруженные пользователями скрипты не исполнялись. Конкретные правила зависят от CMS, веб-сервера и способа деплоя; копировать чужую директиву вслепую не стоит.

Для Joomla и Битрикса настройки отличаются, но принцип тот же: право добавлять расширения оставляю ограниченному кругу ответственных людей. Контент-менеджеру обычно не нужны права на установку кода, чтобы публиковать текст и изображения. Разделение ролей снижает вероятность случайной установки, но не отменяет журнал изменений, резервную копию и проверку того, что именно попало на сайт. Учётная запись администратора — часть цепочки поставки, поэтому общие логины здесь особенно мешают разбору.

```php // wp-config.php define( 'DISALLOW_FILE_EDIT', true ); define( 'DISALLOW_FILE_MODS', true ); ```

Журнал проверки: что записывать перед выпуском

Запись о проверке нужна до установки, пока можно восстановить происхождение пакета. Фиксирую название и версию расширения, автора, URL источника, дату загрузки, хэш архива, результаты просмотра, ответственного и дату выпуска. Для контрольной суммы WordPress отмечаю, что именно проверялось и были ли предупреждения. Журнал храню отдельно от сайта, чтобы после сбоя или компрометации осталась независимая история. Это может быть таблица с ограниченным доступом: сложная система сама по себе дисциплину не создаёт.

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

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

Чек-лист журнала проверки плагина CMS перед выпуском на рабочий сайт
Запишите проверку до выпуска

Разбор на условном сайте-портфолио

Возьмём типовой WordPress-сайт, где владелец обнаружил незнакомого администратора и PHP-файл в загрузках. Эти признаки требуют проверки, но не позволяют сразу назвать виновником плагин. Сначала сохраняю список файлов и учётных записей, журналирую время обнаружения, ограничиваю доступ к панели и делаю копию для разбора. Затем сопоставляю изменения с журналом выпусков и проверяю, не было ли легитимной работы подрядчика.

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

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

Проверка происхождения отвечает на вопрос «какой код мы установили», а разграничение ролей — на вопрос «кто может добавить новый». В следующем материале серии — [cms-least-privilege-admin-accounts](cms-least-privilege-admin-accounts) — разбираем отдельные учётные записи и минимальные права. Правила без разграничения доступа быстро становятся памяткой, которую никто не обязан соблюдать.

Пакет без понятного источника сначала расследуют, потом устанавливают.
Инфографика о проверке источников и учётных записей расширений CMS
Проверяйте пакет до публикации

Частые вопросы

Безопасен ли плагин из официального каталога?

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

Как проверить плагины WordPress командой WP-CLI?

Для расширений из каталога WordPress.org используйте `wp plugin verify-checksums --all`. Для коммерческих и собственных плагинов эталонных сумм может не быть, поэтому команда их не подтвердит.

Что делает DISALLOW_FILE_MODS?

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

Хэш архива доказывает, что плагин безопасен?

Нет. SHA-256 помогает проверить, совпадает ли архив с тем, который вы сохранили при проверке. Он не оценивает код и не подтверждает добросовестность разработчика.

Как часто пересматривать список расширений?

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

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

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

📞 +7 903 729-62-41 ✈ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Источники

© ООО «АйТи-Фреш» · Москва · Все статьи
АйТи-Фреш (ООО «АЙТИ-ФРЕШ») · г. Москва, Щёлковское шоссе, д. 92, корп. 7 · +7 903 729-62-41 · info@itfresh.ru · Пн–Пт 9:00–19:00