Перейти к содержимому

Чистка сайта после взлома - порядок работ и возврат в строй

Возвращаем сайт в строй после взлома: отрезаем, меняем доступы, ищем чужое и закрываем то, через что вошли.

Решение

Отрезаем сайт от посетителей:

Окно терминала
sudo bx-sites -a disable -s example.org # в среде разработчиков платформы
# или закрываем на уровне веб-сервера, оставив себе доступ по адресу
# заодно останавливаем задания cron: они могут запускать чужой код
crontab -l > /backup/crontab.txt && crontab -r

Работать по чистке на живом сайте бессмысленно. Пока страницы отдаются посетителям, чужой код продолжает работать и восстанавливать то, что вы удаляете прямо сейчас.

Меняем все доступы разом:

- пароли всех администраторов сайта и разработчиков
- доступ к базе данных и файл настроек с ним
- ключи внешних сервисов: платежи, рассылки, обмен с учётной системой
- доступ к панели хостинга, к серверу и ключи для входа по нему

Скомпрометированным считается всё, до чего дотягивался сайт. Смена одного пароля администратора оставляет вход через ключ обмена или доступ к базе, и через день всё повторяется.

Ищем изменённое и чужое:

Окно терминала
find /home/site/public_html -name '*.php' -mtime -14 -printf '%T+ %p\n' | sort
grep -rl --include='*.php' -E 'eval\(|base64_decode\(|gzinflate\(' /home/site/public_html
# смотрят и каталог загрузок: исполняемым файлам там не место вовсе

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

Сверяем ядро с эталоном и возвращаемся:

1. Проверка целостности файлов из модуля проактивной защиты
2. Свой код - сверкой с репозиторием, а не глазами
3. Ядро и модули - обновлением продукта до актуальной версии
4. База - поиском чужих административных учётных записей и агентов

Сверка отвечает на вопрос, какой файл изменён, а не какой выглядит подозрительно. Чужой код давно научился выглядеть штатным, и глаз тут проигрывает контрольной сумме.

Исходную дыру закрывают до возврата сайта в строй. Иначе чистка превращается в ежедневную процедуру: та же уязвимость впускает тот же код через сутки.

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

Пользовательские данные после взлома считают известными посторонним. Сессии сбрасывают, пароли просят сменить, а о самом факте сообщают тем, кого он касается.

Ход работ стоит записывать по мере чистки, а не после неё. Список того, что найдено и когда изменено, пригодится и хостингу, и разбору причин, и через неделю вам самим при повторном обращении к этой истории.

Типичные проблемы

Через день чужой код вернулся.

В базе остался агент или задание по расписанию, восстанавливающее удалённые файлы. Чистят и файлы, и записи расписания в самой базе.

Восстановление из копии не помогло.

Копия снята уже после взлома и потому содержит в себе чужой код. Возвращаться нужно к копии, снятой до самых первых признаков взлома.

Взлом повторился через неделю.

Исходная уязвимость так и осталась закрытой только на словах, а не в коде. До возврата сайта обновляют продукт и закрывают вход.

Хостинг заблокировал сайт за рассылку.

С сайта уходил спам через чужой скрипт, оставленный после взлома. Разблокировку хостинг даёт только после чистки сайта и смены всех его доступов.

Файл выглядит штатным, а работает не так.

Изменена всего одна строка внутри давно знакомого файла самой платформы. Такое изменение видно только сверкой контрольных сумм файла с эталоном той же версии.

Частые вопросы

Достаточно ли восстановиться из резервной копии?

Нет: без закрытия исходной причины взлом повторится. Копия возвращает файлы, а не защиту.

Как определить дату взлома?

По журналам веб-сервера и времени изменения файлов. Первое обращение к чужому скрипту обычно видно там же.

Нужно ли сообщать хостингу?

Да, особенно при рассылке спама или блокировке. Они видят исходящий трафик и помогают его остановить.

Что делать с данными покупателей?

Считать их известными посторонним: сбросить сессии и попросить сменить пароли. Молчание обходится дороже.

Смежное

Первоисточник