Перейти к содержанию

Атака криптомайнера

На прошлой неделе меня взломали. Не то чтобы я сильно переживал по этому поводу — но эпизод имел последствия.

Я провел небольшое расследование. Мне удалось восстановить ход событий практически по минутам. Кое-что осталось за кадром — но эти белые пятна достраиваются логически. Делюсь выводами.

Первый сигнал #

Все началось с аномалии в учетной записи на GitHub: репозитории, которых я не создавал. Рандомные имена, странное содержимое. Беглый взгляд на код — майнинг, криптовалюта, Monero.

Этого хватило, чтобы сразу все стало понятно. Ок, меня взломали. Что дальше?

Первое правило путешествующего автостопом по Галактике - “НЕ ПАНИКУЙ!!!”. Заходим в настройки. Хвала небесам, аккаунт не заблокирован. Отзываем все токены доступа, меняем пароль, перезапускаем двухфакторную аутентификацию. Потом — чистим артефакты: для расследования они еще будут доступны на серверах GitHub около месяца, но держать на своем аккаунте материал, который может быть использован для атаки изнутри, не стоит.

Оценка ущерба #

Следующий шаг — проверить все репозитории, просмотреть последние коммиты. Здесь спокойно: атака прошла в другом направлении, данные не задеты. Выдох.

Смотрим логи. Вся атака заняла около пятнадцати минут. За это время от моего имени создано с десяток репозиториев — по три коммита в каждом. Паттерн одинаковый, разброс по времени — минимальный. Действовал явно бот: без лишних движений, четко по скрипту, к цели.

Цель — серверы GitHub Actions. Чужие репозитории с майнинговым кодом должны были запуститься в моих воркерах и начать добывать Monero за чужой счет.

Хорошая новость: GitHub Actions пресек атаки на корню. Далеко идущих последствий не случилось, лимит бесплатного времени использован минимально, в минус я не ушел. Фух, пронесло.

Плохая новость: заметив подозрительную активность, GitHub ограничил мне доступ к сервису. Весь CI/CD пайплайн — сборка, деплой, всё — встал намертво, начиная со времени атаки. А атака, как водится, прошла в середине ночи, ближе к раннему утру. Когда все спят.

Откуда утечка #

Самый интригующий вопрос: как именно утекли мои данные?

Проверяю сетевую инфраструктуру. Все серверы, все логи, всю активность. Стоп.

На одном из узлов ядра — файл с датой и временем, совпадающими с началом атаки. Смотрим содержимое: GitHub credentials. Понятно. Файл «пропылесосили»: вытащили токен доступа к GitHub, перезаписали его пустым значением.

Проверяю аналогичные файлы на других серверах ядра. Везде, кроме root-узла, — та же история с разницей в несколько минут. Кто-то методично прошелся по всем машинам, которые доверяли друг другу и разрешали вход без пароля. Вытащил персональный токен — тот самый, через который я отправлял бэкапы данных в приватный репозиторий. Дальше вы знаете.

Что это значит #

Токен для бэкапов хранился в открытом виде в файле ~/.git-credentials. Простое, удобное решение для автоматизации. И совершенно ненадежное, как выяснилось.

Серверы ядра были объединены в доверенную сеть: везде настроен вход по SSH без пароля по ключу, все серверы ядра доверяют друг другу. Это удобно для управления кластером. Но для злоумышленника, получившего доступ к одной машине, остальное — дело техники. Прорвали в одном месте — скомпрометированы все.

Персональный токен имел избыточные права: он был нужен для записи в один приватный репозиторий, но технически открывал гораздо больше. Что и было использовано.

Копаем глубже #

Дальше — одни догадки.

Где произошел прорыв — неизвестно. Беглое обследование не выявило ничего подозрительного: явных следов заражения нет, аномалий в процессах нет. Но безопасность местами хромает. На одной из машин обнаружен незакрытый вход по паролю — могли сбрутфорсить.

Есть и другая версия. Ключи я меняю нечасто. А несколько месяцев назад мы потеряли часть инфраструктуры — и с теми серверами я расстался не по-джентльменски: доступ пропал раньше, чем я успел превратить их содержимое в цифровой пепел. Утечь могло оттуда.

Есть и другие сценарии — я никогда не был параноиком в вопросах безопасности. Возможно, пора.

Выводы #

Атака завершена, ущерб подсчитан.

Личный аккаунт на GitHub — скомпрометирован, восстановлен. Сетевая инфраструктура практически не пострадала и продолжает работать — задело краем. Но весь кластер ядра скомпрометирован полностью. То, что было удобно для оперативного управления, для подобных кейсов совсем не годится.

Пришло время подумать об архитектуре с точки зрения безопасности. Сворачиваемся.