Уязвимости Drupal и PHP: как защитить сайт от взлома
Три мензурки на подложке: две боковые полны синей жидкости, в большой центральной она лишь на дне, рядом зелёный шарик

Уязвимости Drupal и PHP: как защитить сайт от взлома

Критические уязвимости Drupal обычно связаны с PHP-кодом. Разбираем типы брешей, как их закрыть обновлениями и настройками сервера.

Уязвимости Drupal и PHP: что нужно знать владельцу сайта

Большинство критических уязвимостей Drupal — это ошибки в PHP-коде ядра или модулей: SQL-инъекции, небезопасная десериализация, выполнение произвольного кода. Закрываются они обновлением Drupal, актуальной версией PHP и грамотной настройкой сервера.

Эксплойты для критических уязвимостей Drupal появлялись в открытом доступе вскоре после выхода патча, поэтому с обновлением нельзя медлить.

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

Почему уязвимости Drupal так часто связаны с PHP

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

При этом сам Drupal считается достаточно зрелым с точки зрения безопасности: у проекта есть собственная команда безопасности, регламент публикации advisories и оценка рисков по шкале от «Less critical» до «Highly critical». Но язык, на котором написана платформа, накладывает свои особенности. PHP динамически типизирован, умеет превращать строки в вызовы функций, десериализовать объекты из текста и подключать файлы по пути, который может прийти от пользователя. Любая из этих возможностей при недостаточной проверке данных превращается в точку входа для атаки.

Отдельная история — модули сообщества. Ядро проходит строгий ревью, а вот contrib-модули пишут разные авторы с разным уровнем внимания к безопасности. Статистика advisories показывает, что значительная часть бюллетеней касается именно дополнительных модулей, а не ядра.

хронология · громкие уязвимости ядра drupal
2014 · sa-core-2014-005
Drupalgeddon: SQL-инъекция
Ошибка в слое абстракции БД Drupal 7 позволяла внедрить SQL-запрос без авторизации. Массовые атаки начались в течение часов после публикации патча.
2018 · cve-2018-7600
Drupalgeddon 2: удалённое выполнение кода
Недостаточная фильтрация данных в Form API позволяла передать служебные свойства render-массива и запустить произвольный PHP-код.
2018 · cve-2018-7602
Drupalgeddon 3: продолжение
Вторая уязвимость того же класса, потребовавшая отдельного обновления для Drupal 7 и 8.
2019 · cve-2019-6340
Десериализация в REST-модулях
Некорректная обработка данных полей при включённых веб-сервисах давала возможность выполнить код на сервере в Drupal 8.

Какие типы уязвимостей встречаются в Drupal на уровне PHP

SQL-инъекции. Возникают, когда данные пользователя попадают в SQL-запрос без надлежащего экранирования. В Drupal для этого есть слой абстракции базы данных с параметризованными запросами, но ошибка в самом слое (как в 2014 году) или ручная сборка запросов в модуле возвращают проблему.

Удалённое выполнение кода (RCE). Самый опасный класс. В случае Drupalgeddon 2 злоумышленник через форму передавал специальные свойства render-массива, которые Drupal затем обрабатывал как вызов PHP-функции. Итог: полный контроль над сайтом и часто над сервером.

Небезопасная десериализация. Функция unserialize в PHP воссоздаёт объект из строки. Если строку контролирует атакующий, а в коде есть подходящие классы с «магическими» методами, можно запустить цепочку вызовов с вредоносным результатом. Отдельный вариант — десериализация метаданных через обёртку phar://: в 2019 году такая проблема была исправлена в ядре Drupal (CVE-2019-6339).

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

XSS и CSRF. Внедрение скриптов в страницы и подделка запросов от имени администратора. Прямого доступа к серверу они не дают, но позволяют украсть сессию и затем перейти к более серьёзным действиям.

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

Важно понимать: уязвимость в Drupal редко живёт сама по себе. Обычно взлом строится как цепочка: сначала найден публичный эксплойт, затем атакующий проверяет сайты автоматически, определяет версию ядра по служебным файлам и заголовкам и применяет готовый сценарий. Весь процесс занимает минуты и не требует ручной работы, поэтому «нас никто не ищет» — опасное заблуждение.

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

СлойТипичный рискКак защититься
Ядро DrupalSQL-инъекции, 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 поддерживаются дольше. Проверяйте актуальные даты перед планированием.

ключевые даты и требования
drupal 7 · eol
5 января 2025
Штатная поддержка завершена. Дальше только платная поддержка от вендоров.
drupal 9 · eol
1 ноября 2023
Ветка больше не получает исправлений безопасности.
drupal 10 · php
8.1+
Минимальная версия интерпретатора для установки и работы.
drupal 11 · php
8.3+
Актуальная ветка предъявляет самые строгие требования к окружению.

Что делать, когда вышел security advisory для Drupal

  1. 01

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

  2. 02

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

  3. 03

    Обновите ядро и затронутые модули на стенде: через Composer командой composer update drupal/core-recommended --with-dependencies либо штатным способом вашей сборки.

  4. 04

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

  5. 05

    Выкатите обновление на рабочий сайт, очистите кеш и выполните drush updatedb, если в релизе есть обновления схемы данных.

  6. 06

    Проверьте логи на признаки атаки: подозрительные POST-запросы к формам, новые файлы с расширением php в каталогах загрузок, неожиданные учётные записи администраторов.

  7. 07

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

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

Полезно подписаться на рассылку security-анонсов Drupal и настроить уведомления Update Status на рабочую почту команды. Для проверки зависимостей на известные уязвимости используйте composer audit: команда сверяется с базой advisories и показывает проблемные пакеты прямо в терминале или в CI.

Типичные ошибки при защите сайта на Drupal

Большинство успешных взломов объясняются не хитрой техникой атакующих, а банальными упущениями в обслуживании.

Так делать не стоит

  • Откладывать обновление ядра «до следующего релиза сайта»
  • Оставлять на сайте отключённые, но физически присутствующие модули с уязвимостями
  • Работать на PHP, который уже не получает патчей безопасности
  • Разрешать исполнение PHP-файлов в каталоге sites/default/files
  • Включать display_errors на рабочем сервере и показывать посетителям трассировки
  • Использовать один пароль администратора для нескольких сервисов

Как правильно

  1. 01

    Устанавливать security-релизы в течение суток-двух после выхода

  2. 02

    Удалять неиспользуемые модули и темы с сервера полностью

  3. 03

    Планировать переход на поддерживаемые ветки Drupal и PHP заранее

  4. 04

    Запретить запуск скриптов в каталоге загрузок на уровне nginx или Apache

  5. 05

    Писать ошибки в журнал, а не выводить на страницу

  6. 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Ядро и модули обновлены до последних security-релизов
02Версия PHP получает патчи безопасности
03composer audit и drush pm:security запускаются в CI
04Исполнение PHP в каталоге files запрещено
05settings.php доступен только для чтения, заданы trusted_host_patterns
06display_errors выключен, ошибки пишутся в журнал
07У администраторов включена двухфакторная аутентификация
08Резервные копии проверены восстановлением на стенде

Что даёт регулярное обслуживание Drupal

  1. 01

    Закрытие известных уязвимостей до того, как их начнут массово использовать

  2. 02

    Совместимость с современными версиями PHP и ускорение работы сайта

  3. 03

    Сохранность позиций в Яндексе и Google: нет спама, редиректов и пометок об опасности

  4. 04

    Предсказуемые расходы: плановое обновление дешевле аварийного восстановления

  5. 05

    Спокойствие при проверках по персональным данным и требованиям заказчиков

Проверить статус безопасности сайта в поиске можно в Яндекс Вебмастере (раздел о безопасности и нарушениях) и в Google Search Console (отчёт «Проблемы безопасности»). Подключите оба сервиса: они сообщают о взломе и вредоносном коде быстрее, чем это замечают посетители.

Итоги: как не стать жертвой очередного Drupalgeddon

Безопасность Drupal держится на трёх вещах: свежее ядро и модули, поддерживаемый PHP, строгая конфигурация сервера.
  1. 01

    Следите за security advisories и ставьте обновления без отсрочек

  2. 02

    Переходите на поддерживаемые версии Drupal и PHP: для новых проектов выбирайте Drupal 10 или 11

  3. 03

    Удаляйте неиспользуемые модули и запрещайте выполнение PHP в каталоге файлов

  4. 04

    Автоматизируйте проверки: composer audit, drush pm:security, мониторинг логов

  5. 05

    Подключите Яндекс Вебмастер и Google Search Console, чтобы вовремя узнать о проблемах

Если вы не уверены, в каком состоянии находится ваш проект, начните с аудита: версии ядра, модулей и PHP, права на файлы, конфигурация веб-сервера. Часто именно этот первый шаг выявляет проблемы, которые годами оставались незамеченными.

Часто задаваемые вопросы

Проверим ваш сайт на Drupal на известные уязвимости

Найдём устаревшие модули, небезопасные настройки PHP и сервера и составим план исправления

Бесплатный экспресс-аудитОтчёт за 24 часаБез простоя сайта

Аудит учитывает последние advisories Drupal

Политика конфиденциальности

При оставлении заявки на ресурсе «https://gurucontext.ru» пользователи предоставляют следующие сведения:

  • Имя
  • Контактный телефон или Telegram
  • Адрес сайта пользователя (не обязательно)

Также администрация сайта получает данные об IP-адресе посетителей, типе браузера, времени нахождения на сайте и прочие подобные сведения через сервисы статистики.

Использование информации

Вся полученная информация используется администрацией «https://gurucontext.ru» исключительно в целях связи с клиентом.

Защита персональных данных

Компания «https://gurucontext.ru» обязуется не разглашать сведения, полученные от пользователей, и хранит их в защищённом виде.

Предоставление данных третьим лицам

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

Контакты

Телефон: +7 (499) 955-47-00.
E-mail: info@gurucontext.ru.