Введение
Этот материал — реальный технический разбор инцидента на сайте под управлением 1C-Битрикс, где вредоносные файлы появлялись снова и снова даже после удаления.
Задача была не просто «почистить сайт», а понять механизм реинфекции и перекрыть точку входа, чтобы заражение не возвращалось.
Симптомы инцидента
Во время расследования регулярно обнаруживались новые вредоносные файлы:
- в
ajax/ - в
assets/images/ - периодически в маскирующих каталогах с «случайными» именами
Типичные признаки:
- однофайловые backdoor-скрипты (
eval(base64_decode(...))) - webshell / file manager
- обфусцированные дропперы под видом «легитимного» кода
- вредоносные вспомогательные файлы (
php.ini,.txt-стейджеры)
Ключевая проблема: после удаления вредонос восстанавливался.
Почему удаление «по файлам» не решает проблему
Если удалять только уже найденные shell-файлы, но оставить рабочий вектор входа, злоумышленник просто загружает их заново.
Поэтому расследование строилось в логике:
- выявить вектор первичного исполнения;
- связать события записи файлов с конкретным процессом;
- по времени процесса найти HTTP-запрос и источник;
- закрыть уязвимый код, а не только симптомы.
Что было сделано для расследования
1) Включен аудит файловых событий (auditd)
Для каталогов с постоянной реинфекцией были включены правила мониторинга записи/изменения:
.../ajax.../assets/images
Это позволило получить не предположения, а точные данные: какой процесс и когда создавал файл.
2) Сопоставление с процессами
По audit-событиям подтверждено:
- вредоносные файлы создавались процессом
php-cgi; - процесс запускался в контексте веб-обработки (
apache2как parent); - это исключило гипотезу про «фоновый демон из /tmp» как основной источник.
3) Корреляция по access-логам
По точным таймстемпам из audit были найдены соответствующие строки в access-логе виртуального хоста. Это дало цепочку запросов, которая приводила к записи webshell-файлов.
Ключевая exploit-цепочка
В ходе анализа выявлена рабочая связка:
- запрос к
ajax/error_log_logic.phpс параметромdata(в него передавался PHP payload); - payload попадал в локальный файл логирования (
ajax/js_error.txt); - затем вызывался
ajax/form.phpсform_id=TABLES_SIZEи параметромurl, что приводило кinclude(...)локального файла; - через выполнение payload разворачивался основной webshell (
ajax/e883b93f1458.php) и дополнительные дропперы.
То есть реинфекция шла не «сама по себе», а через конкретную уязвимую пару endpoint-ов.
Что оказалось уязвимым в коде
ajax/error_log_logic.php
Файл принимал пользовательский data и писал его в файл в web-доступной директории.
Такой механизм удобно использовать как стейджер для дальнейшего исполнения.
ajax/form.php (ветка TABLES_SIZE)
Ветка таблиц размеров делала include файла из пользовательского параметра url без безопасного whitelist-подхода. Это классический LFI-вектор, который в связке со стейджером превращается в RCE.
Что было удалено
Удалены подтвержденные вредоносные файлы (webshell/droppers), включая семейства:
e883b93f1458.php2c6d8479de*58b2a3298b*- и сопутствующие зараженные копии в
assets/images
Отдельно удален ajax/error_log_logic.php как подтвержденная точка входа.
Что было исправлено
Для ajax/form.php сделан безопасный патч:
- убран произвольный
includeпо пользовательскому пути; - добавлена строгая валидация:
- только реальные файлы;
- только
.php; - только внутри разрешенного каталога
include/table_sizes.
Таким образом функциональность таблиц размеров сохранена, но LFI-вектор закрыт.
Почему это важно для Bitrix-проектов
Для Bitrix-проектов характерна смесь:
- кастомных
ajax/*.phpобработчиков, - шаблонного кода от интеграторов/тем,
- устаревших «временных» debug-файлов.
Даже один небезопасный endpoint в публичной зоне может стать постоянной точкой возврата вредоноса.
Практические выводы
- Удаление файлов без закрытия вектора входа не работает.
- Нужна корреляция «файл -> процесс -> запрос».
- Аудит (auditd) и доступ к корректному access-логу критичны.
- Все кастомные
ajax/*.phpдолжны проходить security-ревизию:- без произвольных
include/require, - без записи пользовательских данных в исполняемые директории,
- с whitelist-подходом к путям и параметрам.
- без произвольных
Минимальный чеклист после инцидента
- смена всех критичных паролей (админка, SSH/FTP/SFTP, БД, панель);
- ревизия администраторов и доступов;
- проверка всех
ajax/*.phpи кастомных endpoint-ов; - запрет исполнения PHP в каталогах статики (
assets,uploadгде возможно); - установка мониторинга на появление новых
.phpв нетипичных директориях; - план регулярных security-проверок и обновлений ядра/модулей.
Заключение
Главный результат этого кейса — обнаружение и закрытие реальной exploit-цепочки, а не «косметическая чистка» последствий.
Если вредонос «возвращается», почти всегда есть рабочая точка входа.
Ее можно найти, если собрать расследование как техническую цепочку фактов:
время записи -> процесс -> родитель процесса -> HTTP-запрос -> уязвимый код.