Многим уже известно, что Ростелеком при поддержке Mail.ru начал внедрение своих рекламных баннеров на сайтах не защищённых протоколом HTTPS. Защититься от их появления на своём сайте можно переводом его на HTTPS. Но что делать, если у вас нет такой возможности или для вас это слишком трудоёмко? Я провёл своё небольшое исследование и хочу поделиться простым и пока ещё эффективным способом против этой заразы.
На Хабре уже были расследования на эту тему и я опирался на них:
- Вы не смотрите рекламу во время разработки? Непорядок
- DPI: Deep Packet INJECTION, или конспирологическая теория о заговоре между RTK и MRG
Известно, что баннеры внедряются путём подмены оригинального JavaScript файла на вредоносный через редирект. А уже он вставляет на страницу сайта баннер и загружает оригинальный файл. Таким образом, при проверке на вирусы невозможно сразу обнаружить как на сайте появилась реклама, т.к. оригинальные файлы не изменяются, а редирект выполняется с определённым интервалом и обнаружить его достаточно сложно.
Для исследования нужен сайт работающий по протоколу HTTP и содержащий JS файлы. В качестве примера я взял сайт Музеи Кирова. С некоторой периодичностью на нём можно наблюдать баннеры.
Я написал специальную утилиту. Она делает запрос по определённому URL через равные промежутки времени и сравнивает полученное содержание с предыдущим. Если содержание ответа отличается — оно сохраняется для изучения. При анализе запросов к небольшому скрипту
http://muzey43.ru/js/script-eye.js
обнаружилось, что всегда возвращается одинаковое содержание — редиректа нет.Тогда каким образом появляется баннер? При изучении исходного кода сайта обнаружился ещё один JS файл, который загружался по HTTP, но с другого хоста:
http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js
. При анализе этого запроса периодически наблюдаем получение содержания вредоносного файла.Из скриншота видно, что вредоносное содержимое загружается приблизительно два раза в минуту, но могут быть и недолгие перерывы в работе редиректа. Содержимое зловреда каждый раз меняется путём обфускации кода и содержит ссылку на оригинальный скрипт.
Скорее всего, существует некий «белый список» хостов, JS редирект для которых запрещён. Например, сайт Министерства культуры Кировской области. Несмотря на то, что он работает через HTTP протокол, баннеры на нём не появляются. А вот на сайте Музеи Кирова баннер присутствует, хотя редиректа для его скриптов и нет, но через редирект скрипта с другого хоста в него внедряется баннер. Чтоб устранить уязвимость в данном случае, скорее всего, достаточно запрашивать файл по HTTPS протоколу, т.е. просто заменить URL скрипта на
https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js
Но что делать, если ваш сайт не в «белом списке» и нужно использовать собственные скрипты? Я обнаружил простой способ избежать JS редиректа. Достаточно в URL скрипта добавить произвольный параметр:
https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js?banner=off
и редирект выполняться не будет.Вероятно, это сделано, чтоб редирект не нарушал работу сложных динамических JS сайтов, либо нужные файлы просто определяются по расширению
.js
. Но в любом случае, достаточно дописать к URL-ам скриптов на страницах вашего сайта случайные параметры и рекламные баннеры Ростелекома на нём появляться не будут.P.S. Как верно указывают в комментариях, самым правильным решением для владельцев сайтов будет переход на HTTPS, тем более что сейчас некоторые хостинги предлагают установку бесплатного сертификата прямо из панели одной кнопкой. Ведь завтра Ростелеком легко может подкрутить алгоритм редиректа и решение приведённое выше перестанет работать. А просто блокировка редиректа фильтром на клиенте, как некоторые предлагают, сможет решить проблему только клиента — баннера не будет, но не будет и подстановки скрипта который он подменил и при этом функционал сайта может пострадать.