Коллеги, у меня та же проблема (автоматическое создание файлов htaccess и index с модифицированном коде), только всё намного хуже. Есть выделенный сервер, на нём около 80 сайтов (каждый под разным пользователем), из них половина на Битриксе. Сайты на разных версиях РНР от 5.6 до 7.4. Взлом обнаружили неделю назад сначала на 8 сайтах, которые уже больше 2 лет не обновлялись, на которых версия РНР была 5.6-7.0. Мы удалили полностью файлы заражённых сайтов, восстановили резервную копию от января этого года, установили все обновления Битрикс, версию РНР для всех сделали 7.4 и расслабились. На следующий день всё тоже самое.
Тогда, удалили пользователей, под которыми были сделаны сайты и базы данных. Создали новых пользователей, новые БД, загрузили архив от января (он, к слову, выглядит нормально после распаковки). Снова поставили обновления, версию РНР 7.4. Поставили модуль поиска троянов от Битрикс - проблем не найдено. Сделали это 3 дня назад. Сейчас с Htaccess всё в порядке, но меня смущает содержимое файла .access.php в корне сайта. На всех взломанных сайтах есть такие строчки в этом файле:
$PERM["desktop_app"]["*"]="D";
$PERM["online"]["*"]="R";
$PERM["pub"]["5"]="T_8";
Папок desktop_app и online нет ни на одном сайте. На части сайтов есть папка pub в корне, на части нет. Но каким образом могла появится запись $PERM["pub"]["5"]="T_8"; на тех сайтах, на которых папка pub в принципе не существует на сервере?
Внутри папки pub всегда есть файл im.file.php и иногда ещё какие-то папки и файлы. Содержимое im.file.php такое:
<?php
use \Bitrix\Main\Error,
\Bitrix\Main\Result;
define('IM_AJAX_INIT', true);
define('PUBLIC_AJAX_MODE', true);
define('NO_KEEP_STATISTIC', 'Y');
define('NO_AGENT_STATISTIC', 'Y');
define('NO_AGENT_CHECK', true);
define('DisableEventsCheck', true);
define('STOP_STATISTICS', true);
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
if(
!\Bitrix\Main\Loader::includeModule('disk')
|| !\Bitrix\Main\Loader::includeModule('im')
)
{
die;
}
$request = Bitrix\Main\Application::getInstance()->getContext()->getRequest();
$result = new Result();
if ($request->get('FILE_ID') && $request->get('SIGN'))
{
$diskFileId = (int)$request->get('FILE_ID');
$sign = htmlspecialcharsbx($request->get('SIGN'));
try
{
$signer = new \Bitrix\Main\Security\Sign\Signer;
$signKey = \CIMDisk::GetFileLinkSign();
if (is_string($signKey))
{
$signer->setKey($signKey);
}
$sign = (int)$signer->unsign($sign);
}
catch (\Bitrix\Main\Security\Sign\BadSignatureException $e)
{
try
{
$signer = new \Bitrix\Main\Security\Sign\Signer;
$sign = (int)$signer->unsign($sign);
}
catch (\Bitrix\Main\Security\Sign\BadSignatureException $e)
{
}
}
if ($diskFileId === $sign)
{
$file = \Bitrix\Disk\File::getById($diskFileId);
if ($file !== null)
{
$fileId = $file->getFileId();
CFile::ViewByUser($fileId);
}
else
{
$result->addError(new Error('Missing file'));
if ($request->get('img') === 'y')
{
$errorImageSrc = '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 /g9+pxl9BakXNwAAAABJRU5ErkJggg==';
header('Content-type: image/png');
echo base64_decode($errorImageSrc);
}
}
}
else
{
$result->addError(new Error('Wrong signature or file id'));
}
}
else
{
$result->addError(new Error('Missing signature or file id'));
}
if (!$result->isSuccess())
{
foreach ($result->getErrorMessages() as $errorMessage)
{
$lastError = $errorMessage;
}
CHTTP::SetStatus('403 Forbidden');
header("BX-File-Error: $lastError");
}
CMain::FinalActions();
die();
Так же я обнаружила папку /pub/ и такие же строки в .access.php в нескольких сайтах, которые у нас регулярно обновляются, версия РНР там 7.4. И на которых нет признаков вирусов, да и поиск троянов ничего не находит.
Но и это ещё не всё. Такую же папку я нашла на нескольких наших сайтах, которые вообще на других серверах располагаются, у других хостеров, т.е. по идее, они вообще никак между собой не связаны.
В общем, я не могу найти закономерность. Может кто-то подскажет, в какую сторону копать?
Тогда, удалили пользователей, под которыми были сделаны сайты и базы данных. Создали новых пользователей, новые БД, загрузили архив от января (он, к слову, выглядит нормально после распаковки). Снова поставили обновления, версию РНР 7.4. Поставили модуль поиска троянов от Битрикс - проблем не найдено. Сделали это 3 дня назад. Сейчас с Htaccess всё в порядке, но меня смущает содержимое файла .access.php в корне сайта. На всех взломанных сайтах есть такие строчки в этом файле:
$PERM["desktop_app"]["*"]="D";
$PERM["online"]["*"]="R";
$PERM["pub"]["5"]="T_8";
Папок desktop_app и online нет ни на одном сайте. На части сайтов есть папка pub в корне, на части нет. Но каким образом могла появится запись $PERM["pub"]["5"]="T_8"; на тех сайтах, на которых папка pub в принципе не существует на сервере?
Внутри папки pub всегда есть файл im.file.php и иногда ещё какие-то папки и файлы. Содержимое im.file.php такое:
<?php
use \Bitrix\Main\Error,
\Bitrix\Main\Result;
define('IM_AJAX_INIT', true);
define('PUBLIC_AJAX_MODE', true);
define('NO_KEEP_STATISTIC', 'Y');
define('NO_AGENT_STATISTIC', 'Y');
define('NO_AGENT_CHECK', true);
define('DisableEventsCheck', true);
define('STOP_STATISTICS', true);
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
if(
!\Bitrix\Main\Loader::includeModule('disk')
|| !\Bitrix\Main\Loader::includeModule('im')
)
{
die;
}
$request = Bitrix\Main\Application::getInstance()->getContext()->getRequest();
$result = new Result();
if ($request->get('FILE_ID') && $request->get('SIGN'))
{
$diskFileId = (int)$request->get('FILE_ID');
$sign = htmlspecialcharsbx($request->get('SIGN'));
try
{
$signer = new \Bitrix\Main\Security\Sign\Signer;
$signKey = \CIMDisk::GetFileLinkSign();
if (is_string($signKey))
{
$signer->setKey($signKey);
}
$sign = (int)$signer->unsign($sign);
}
catch (\Bitrix\Main\Security\Sign\BadSignatureException $e)
{
try
{
$signer = new \Bitrix\Main\Security\Sign\Signer;
$sign = (int)$signer->unsign($sign);
}
catch (\Bitrix\Main\Security\Sign\BadSignatureException $e)
{
}
}
if ($diskFileId === $sign)
{
$file = \Bitrix\Disk\File::getById($diskFileId);
if ($file !== null)
{
$fileId = $file->getFileId();
CFile::ViewByUser($fileId);
}
else
{
$result->addError(new Error('Missing file'));
if ($request->get('img') === 'y')
{
$errorImageSrc = 'iVBORw0KGgoAAAANSUhEUgAAAEsAAABiCAYAAAAY7S4UAAAN7UlEQVR4Xu1c
header('Content-type: image/png');
echo base64_decode($errorImageSrc);
}
}
}
else
{
$result->addError(new Error('Wrong signature or file id'));
}
}
else
{
$result->addError(new Error('Missing signature or file id'));
}
if (!$result->isSuccess())
{
foreach ($result->getErrorMessages() as $errorMessage)
{
$lastError = $errorMessage;
}
CHTTP::SetStatus('403 Forbidden');
header("BX-File-Error: $lastError");
}
CMain::FinalActions();
die();
Так же я обнаружила папку /pub/ и такие же строки в .access.php в нескольких сайтах, которые у нас регулярно обновляются, версия РНР там 7.4. И на которых нет признаков вирусов, да и поиск троянов ничего не находит.
Но и это ещё не всё. Такую же папку я нашла на нескольких наших сайтах, которые вообще на других серверах располагаются, у других хостеров, т.е. по идее, они вообще никак между собой не связаны.
В общем, я не могу найти закономерность. Может кто-то подскажет, в какую сторону копать?