
Уязвимости Drupal и PHP: как защитить сайт от взлома
Критические уязвимости Drupal обычно связаны с PHP-кодом. Разбираем типы брешей, как их закрыть обновлениями и настройками сервера.
Уязвимости Drupal и PHP: что нужно знать владельцу сайта
Большинство критических уязвимостей Drupal — это ошибки в PHP-коде ядра или модулей: SQL-инъекции, небезопасная десериализация, выполнение произвольного кода. Закрываются они обновлением Drupal, актуальной версией PHP и грамотной настройкой сервера.
Drupal написан на PHP, поэтому почти любая брешь в нём — это либо ошибка в логике PHP-кода, либо небезопасное использование возможностей языка. Ниже разберём, какие типы уязвимостей встречаются чаще всего, чем запомнились самые громкие инциденты и какие меры защиты работают на практике. Материал полезен и владельцам сайтов, и разработчикам, и администраторам.
Почему уязвимости Drupal так часто связаны с PHP
Drupal — одна из самых заметных CMS для крупных проектов: порталы, медиа, госсайты, университеты, корпоративные системы. Такая популярность делает платформу привлекательной целью. Злоумышленникам выгодно искать одну брешь, которая работает на тысячах сайтов сразу.
При этом сам Drupal считается достаточно зрелым с точки зрения безопасности: у проекта есть собственная команда безопасности, регламент публикации advisories и оценка рисков по шкале от «Less critical» до «Highly critical». Но язык, на котором написана платформа, накладывает свои особенности. PHP динамически типизирован, умеет превращать строки в вызовы функций, десериализовать объекты из текста и подключать файлы по пути, который может прийти от пользователя. Любая из этих возможностей при недостаточной проверке данных превращается в точку входа для атаки.
Отдельная история — модули сообщества. Ядро проходит строгий ревью, а вот contrib-модули пишут разные авторы с разным уровнем внимания к безопасности. Статистика advisories показывает, что значительная часть бюллетеней касается именно дополнительных модулей, а не ядра.
Какие типы уязвимостей встречаются в Drupal на уровне PHP
SQL-инъекции. Возникают, когда данные пользователя попадают в SQL-запрос без надлежащего экранирования. В Drupal для этого есть слой абстракции базы данных с параметризованными запросами, но ошибка в самом слое (как в 2014 году) или ручная сборка запросов в модуле возвращают проблему.
Удалённое выполнение кода (RCE). Самый опасный класс. В случае Drupalgeddon 2 злоумышленник через форму передавал специальные свойства render-массива, которые Drupal затем обрабатывал как вызов PHP-функции. Итог: полный контроль над сайтом и часто над сервером.
Небезопасная десериализация. Функция unserialize в PHP воссоздаёт объект из строки. Если строку контролирует атакующий, а в коде есть подходящие классы с «магическими» методами, можно запустить цепочку вызовов с вредоносным результатом. Отдельный вариант — десериализация метаданных через обёртку phar://: в 2019 году такая проблема была исправлена в ядре Drupal (CVE-2019-6339).
Обход доступа. Ошибки в проверке прав позволяют увидеть или изменить то, что не должно быть доступно: черновики, пользовательские данные, настройки.
XSS и CSRF. Внедрение скриптов в страницы и подделка запросов от имени администратора. Прямого доступа к серверу они не дают, но позволяют украсть сессию и затем перейти к более серьёзным действиям.
Загрузка файлов. Если сервер позволяет исполнять PHP из каталога загруженных файлов, любая ошибка в валидации имени или типа файла превращается в веб-шелл.
Важно понимать: уязвимость в Drupal редко живёт сама по себе. Обычно взлом строится как цепочка: сначала найден публичный эксплойт, затем атакующий проверяет сайты автоматически, определяет версию ядра по служебным файлам и заголовкам и применяет готовый сценарий. Весь процесс занимает минуты и не требует ручной работы, поэтому «нас никто не ищет» — опасное заблуждение.
После проникновения обычно происходит одно из нескольких: на сервер устанавливают майнер, подключают сайт к ботнету, размещают скрытые спам-страницы для продвижения чужих ресурсов или воруют базу пользователей. Для бизнеса последствия измеряются не только затратами на восстановление, но и потерей доверия, а также проблемами с поисковым трафиком.
| Слой | Типичный риск | Как защититься |
|---|---|---|
| Ядро Drupal | SQL-инъекции, RCE, обход доступа | Устанавливать security-релизы сразу после выхода |
| Contrib-модули и темы | Ошибки в проверке данных, устаревшие неподдерживаемые модули | Удалять неиспользуемые модули, следить за статусом поддержки |
| Версия PHP и расширения | Устаревший интерпретатор без патчей безопасности, лишние расширения | Использовать поддерживаемую ветку PHP, отключить display_errors |
| Веб-сервер и ОС | Исполнение PHP в каталоге загрузок, избыточные права на файлы | Запретить запуск PHP в папке files, ограничить права записи |
Версии Drupal и PHP: почему устаревание опасно
Любая ветка Drupal и любая версия PHP имеют срок жизни. Когда поддержка заканчивается, новые уязвимости перестают исправляться, а информация о ранее найденных брешах остаётся в открытом доступе. Сайт на неподдерживаемой версии фактически содержит набор известных дыр, о которых знают все.
Связка Drupal и PHP работает в обе стороны. Новые версии Drupal требуют современный PHP: для Drupal 10 нужен PHP 8.1 или выше, для Drupal 11 — PHP 8.3. С другой стороны, переход на свежий PHP без обновления Drupal может сломать старые модули. Поэтому планировать обновления нужно вместе, а не по отдельности.
Статус поддержки веток PHP удобно проверять на официальной странице supported versions. На момент написания статьи ветка 8.1 получает только исправления безопасности до конца 2025 года, а 8.2 и 8.3 поддерживаются дольше. Проверяйте актуальные даты перед планированием.
Что делать, когда вышел security advisory для Drupal
- 01
Прочитайте бюллетень: определите уровень критичности, затронутые версии и наличие информации об эксплуатации уязвимости в реальных атаках.
- 02
Сделайте резервные копии файлов и базы данных. Проверьте, что копию действительно можно развернуть на тестовом окружении.
- 03
Обновите ядро и затронутые модули на стенде: через Composer командой composer update drupal/core-recommended --with-dependencies либо штатным способом вашей сборки.
- 04
Проверьте ключевые сценарии: авторизацию, формы, оформление заказа, поиск, загрузку файлов, работу кеша и очередей.
- 05
Выкатите обновление на рабочий сайт, очистите кеш и выполните drush updatedb, если в релизе есть обновления схемы данных.
- 06
Проверьте логи на признаки атаки: подозрительные POST-запросы к формам, новые файлы с расширением php в каталогах загрузок, неожиданные учётные записи администраторов.
- 07
Если сайт мог быть скомпрометирован до обновления, одного патча недостаточно: смените пароли и ключи, проверьте код на изменения и при необходимости восстановите проект из чистой копии.
Главное в этом процессе — скорость и воспроизводимость. Если обновление требует нескольких дней согласований и ручной подготовки окружения, вы всегда будете отставать от атакующих. Поэтому лучше заранее настроить конвейер: код в репозитории, зависимости под управлением Composer, автоматическая сборка и тесты, быстрый откат.
Полезно подписаться на рассылку security-анонсов Drupal и настроить уведомления Update Status на рабочую почту команды. Для проверки зависимостей на известные уязвимости используйте composer audit: команда сверяется с базой advisories и показывает проблемные пакеты прямо в терминале или в CI.
Типичные ошибки при защите сайта на Drupal
Так делать не стоит
- Откладывать обновление ядра «до следующего релиза сайта»
- Оставлять на сайте отключённые, но физически присутствующие модули с уязвимостями
- Работать на PHP, который уже не получает патчей безопасности
- Разрешать исполнение PHP-файлов в каталоге sites/default/files
- Включать display_errors на рабочем сервере и показывать посетителям трассировки
- Использовать один пароль администратора для нескольких сервисов
Как правильно
- 01
Устанавливать security-релизы в течение суток-двух после выхода
- 02
Удалять неиспользуемые модули и темы с сервера полностью
- 03
Планировать переход на поддерживаемые ветки Drupal и PHP заранее
- 04
Запретить запуск скриптов в каталоге загрузок на уровне nginx или Apache
- 05
Писать ошибки в журнал, а не выводить на страницу
- 06
Включить двухфакторную аутентификацию и разделить роли администраторов
Настройки сервера, которые закрывают последствия уязвимости
Даже если уязвимость уже эксплуатируется, правильная конфигурация сервера способна значительно снизить ущерб. Принцип простой: PHP-код должен выполняться только там, где ему положено быть.
В каталоге загруженных файлов запретите выполнение скриптов. Для nginx это правило, которое отдаёт отказ на любые запросы к файлам с расширением php внутри sites/*/files. Для Apache то же достигается через .htaccess, который Drupal создаёт автоматически, но на нестандартных конфигурациях его часто теряют при переносе.
Файл settings.php после установки стоит сделать доступным только для чтения, а в самой конфигурации задать trusted_host_patterns: это защищает от подмены заголовка Host. В php.ini отключите display_errors и expose_php, ограничьте опасные функции через disable_functions там, где это не мешает работе сайта, и задайте open_basedir, чтобы скрипт не мог читать произвольные каталоги сервера.
Отдельно упомяну уязвимости самого PHP. Например, CVE-2024-4577 в PHP-CGI на Windows позволяла внедрять аргументы командной строки. Она не относится к Drupal напрямую, но показывает, что окружение влияет на безопасность не меньше, чем CMS. Поэтому регулярно обновляйте и интерпретатор, и пакеты операционной системы.
Что даёт регулярное обслуживание Drupal
- 01
Закрытие известных уязвимостей до того, как их начнут массово использовать
- 02
Совместимость с современными версиями PHP и ускорение работы сайта
- 03
Сохранность позиций в Яндексе и Google: нет спама, редиректов и пометок об опасности
- 04
Предсказуемые расходы: плановое обновление дешевле аварийного восстановления
- 05
Спокойствие при проверках по персональным данным и требованиям заказчиков
Итоги: как не стать жертвой очередного Drupalgeddon
- 01
Следите за security advisories и ставьте обновления без отсрочек
- 02
Переходите на поддерживаемые версии Drupal и PHP: для новых проектов выбирайте Drupal 10 или 11
- 03
Удаляйте неиспользуемые модули и запрещайте выполнение PHP в каталоге файлов
- 04
Автоматизируйте проверки: composer audit, drush pm:security, мониторинг логов
- 05
Подключите Яндекс Вебмастер и Google Search Console, чтобы вовремя узнать о проблемах
Если вы не уверены, в каком состоянии находится ваш проект, начните с аудита: версии ядра, модулей и PHP, права на файлы, конфигурация веб-сервера. Часто именно этот первый шаг выявляет проблемы, которые годами оставались незамеченными.
Часто задаваемые вопросы
Так называют серию критических уязвимостей ядра Drupal: SQL-инъекцию 2014 года (SA-CORE-2014-005) и две уязвимости удалённого выполнения кода 2018 года (CVE-2018-7600 и CVE-2018-7602). Они позволяли захватить сайт без авторизации, поэтому стали эталонным примером того, почему ядро нужно обновлять сразу.
Нет. Уязвимость в коде ядра или модуля Drupal исправляется только обновлением самого Drupal. Новая версия PHP закрывает бреши интерпретатора и даёт поддержку безопасности, но не заменяет патч CMS. Защищать нужно все слои: ядро, модули, PHP и веб-сервер.
Проверьте отчёт Update Status в админке, выполните команду drush pm:security и запустите composer audit в корне проекта. Также следите за официальными security advisories Drupal. Они публикуются по расписанию, как правило, по средам.
Drupal 7 вышел из штатной поддержки в январе 2025 года, поэтому планируйте миграцию на Drupal 10 или 11. До миграции используйте расширенную поддержку от сертифицированных вендоров, закройте исполнение PHP в каталоге файлов, ограничьте доступ к админке и поставьте веб-фильтр (WAF).
Да. Если на сайт внедрили спам-страницы или вредоносный код, Яндекс Вебмастер и Google Search Console покажут предупреждение о проблемах безопасности. Поисковики могут понизить сайт в выдаче или пометить его как опасный.
Проверим ваш сайт на Drupal на известные уязвимости
Найдём устаревшие модули, небезопасные настройки PHP и сервера и составим план исправления
Спасибо за заявку!
Мы свяжемся с вами в ближайшее время.
Аудит учитывает последние advisories Drupal



