История одной уязвимости Drupal модуля или почему я доверяю Drupal

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

Наше локальное сообщество Drupal в Санкт-Петербурге существует чуть более полугода. Сайт сообщества DrupalSPB.org, как не странно разработанный на Drupal, служит центром взаимодействия участников, на нем мы анонсируем наши встречи, делимся интересной информацией и продвигаем полезные инициативы.

Мы используем Яндекс.Метрику для подсчета статистики и анализа посещаемости на сайте. Модуль Yandex.Metrics, разрабатываемый нами, позволяет получить доступ к ключевым отчетам Метрики прямо на сайте в административной панели, чем мы регулярно пользуемся.

Однажды, зайдя на страницу отчетов модуля Yandex.Metrics, я заметил странную вставку.

iframe вирус в отчетах Yandex.Metrics

Ни минуты не медля, открыл исходный код страницы в браузере и нашел странный <iframe>, стало ясно, наш сайт заражен вирусом.

Вернемся в недалекое прошлое и посмотрим, что же предшествовало заражению.

За несколько недель до появления странного <iframe> мы бурно обсуждали в Skype-чате сообщества, как излечить сайт от вируса и предотвратить его повторное заражение. Все потому, что одному из наших участников пришлось столкнуться с <iframe> вирусом, который встраивался в каждую страницу сайта и запускал вредоносный код, который в свою очередь мог нанести вред посетителям сайта.

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

Шло время, робот Яндекса проиндексировал статью, и в один не предвещающий беды день на другом конце планеты был заражен тем же вирусом еще один сайт. Его мудрый администратор сразу же полез в Яндекс, чтобы найти ответ, что это за <iframe> такой. Он просто вставил код вируса в строку поиска, получил ссылку на наш сайт и перешел по ней.

Яндекс.Метрика на нашем сайте посчитала переход с поисковой системы. Вот она кульминация, в отчет по поисковым фразам модуля Yandex.Metrics попала строка с вредоносным кодом вируса почти как в оригинале. А я запустил вредоносный код, открыв отчет.

Yandex.Metrics отчет с iframe

Вы за меня не беспокойтесь, браузер предотвратил попытку открытия сомнительного сайта в <iframe>. Но мне пришлось действовать решительно, чтобы устранить уязвимость в модуле.

Первым делом я создал запрос безопасности (security issue) . Он не похож на сообщение о баге или запрос на доработку. Его нельзя создать, пользуясь обычным меню создания запросов к проекту. Ссылка на него располагается в правом нижнем углу страницы проекта на drupal.org.

drupal report security issue link

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

Команда Безопасности Drupal (Drupal Security Team) - участники мирового сообщества Drupal, которые на добровольных началах занимаются аудитом безопасности Drupal проекта и его расширений и помогают устранять найденные уязвимости.

Итак, я создал запрос безопасности, в котором описал проблему, сообщил свою версию модуля и версию Drupal, привел шаги по воспроизведению проблемы и приложил патч.

Затем Команда Безопасности во главе с Грегом Наддисоном (Greg Knaddison) провела меня через весь процесс создания релиза безопасности.

Greg Knaddison (greggles) - это один из великих людей, с которым у меня ассоциируется безопасность Drupal. Грег уже много лет занимается разработкой модулей, аудитом безопасности, помогает другим разработчикам и в данный момент возглавляет Команду Безопасности Drupal (Drupal Security Team).

И уже совсем скоро я создал анонс исправления безопасности (Security Advisory) и релизы для 6 и 7 версий модуля. Релизы стали доступны пользователям только после окончательной проверки Команды Безопасности.

Одна интересная особенность, которая мне запомнилась, релизы безопасности Drupal выпускаются только в среду, давая время Команде Безопасности на проверку, а пользователям на апдейт.

Пользуясь случаем, благодарю Команду Безопасности за помощь в устранении уязвимости, в частности Грега и Ли Роулендса (Lee Rowlands)! Благодаря таким людям, пользователи Drupal могут быть спокойными за свои сайты, если, конечно, эти пользователи включили уведомление о доступных обновлениях и обновляются своевременно :)

Итак, уязвимость устранена, релизы выпущены, а я получил полезный опыт.

Хочу пожелать вам обращать внимание на безопасность кода и сайтов, обновляться своевременно и незамедлительно сообщать о проблемах, руководствуясь официальной процедурой информирования об уязвимостях Drupal проектов.