Взлом, который пережил первую чистку
Заметил атаку по сломанному деплою, вычистил её, а через три недели повторный аудит нашёл то, что атакующий спрятал глубже.
Сигнал
При выкатке очередного обновления перестала проходить отправка кода в репозиторий: сломались хуки Git-сервера. Причина нашлась быстро: регистрация на Git-сервере осталась открытой, через неё зашли, завели сотни пользователей, поставили задачи по расписанию и майнер.
Первая чистка
Регистрация закрыта, посторонние пользователи, задачи и майнер удалены. Сайт и данные затронуты не были.
Повторный аудит
Через три недели, во время планового аудита сервера, нашлась служба с именем, почти совпадающим со штатным системным компонентом. Она запускала неизвестный бинарник от root, скрывала вывод и держала внешнее соединение. По метаданным файлов восстановил хронологию: атакующий успел подняться до root и закрепиться так, что первая чистка этого не задела.
Порядок работ
- Улики. Копии бинарников, состояние процесса и его соединения, всё до любых удалений.
- Изоляция. Git-сервер закрыт от интернета, доступен только изнутри.
- Зачистка. Бэкдоры и остатки майнера удалены, модули аутентификации переустановлены, все системные пакеты сверены с эталонными контрольными суммами.
- Причина. Git-сервер обновлён на шесть версий вперёд по шагам: проверка подписей, резервная копия, готовый откат, сверка всех веток и тегов до и после. Совпали полностью.
Выводы
Удалить видимое ещё не значит вычистить. После взлома нужен аудит закреплений: службы, задачи, SUID-файлы, модули аутентификации. Служебные интерфейсы не должны смотреть в интернет, в SSH пускать только по ключам, а после компрометации менять все секреты.