Специалисты Datadog Security Labs наткнулись на нечто необычное: десятки старых, годами неактивных аккаунтов GitHub вдруг начали синхронно опрашивать API платформы, методично составляя карту корпоративных организаций, репозиториев и пользователей. Причём делали это не хаотично, а по чёткой схеме, растянутой на несколько недель.
Речь идёт о более чем 50 «спящих» аккаунтах, созданных от двух до пяти лет назад. Всё это время они просто существовали — без единого коммита, без активности, ничем не привлекая внимания. А затем их будто разбудили и пустили в дело. По словам старшего инженера по безопасности Datadog Джули Агнес Спаркс, именно в этом и заключается расчёт атакующих: аккаунт с историей в несколько лет не вызывает подозрений так, как свежесозданный профиль, зарегистрированный вчера ради разовой операции.
Параллельно с «призрачными» аккаунтами злоумышленники задействовали и другой канал — украденные OAuth-токены и персональные токены доступа (PAT), принадлежащие вполне реальным пользователям. Таких скомпрометированных учёток набралось несколько десятков, и они добавляли операции ещё один слой правдоподобности: запросы шли как бы от имени легитимных разработчиков.
Инструментарий для сканирования тоже впечатляет своей проработкой. Это не примитивный скрипт для одноразового парсинга, а версионируемая система, которая менялась и дорабатывалась прямо в процессе кампании. Запросы маскировались под легитимные или похожие на легитимные user-agent'ы, что дополнительно усложняло фильтрацию по сигнатурам.
Основная цель — публичные данные: списки организаций, репозиториев, участников команд. Казалось бы, ничего секретного, GitHub и так открывает значительную часть своего API без авторизации. Но в нескольких случаях наблюдатели зафиксировали переход границы: атакующие не просто перечисляли публичные репозитории, а клонировали приватные. Как минимум для одной организации подтверждён факт доступа к закрытому коду.
Здесь и кроется главная сложность обнаружения подобной активности. Отдельно взятый запрос выглядит абсолютно рутинно — обращение к публичному эндпоинту, чистая или вовсе отсутствующая аутентификация, успешный ответ сервера. Ничего похожего на классические индикаторы компрометации. Проблема проявляется только при сопоставлении множества запросов между собой, когда становится видно: группа аккаунтов двигается синхронно, обходит одни и те же организации в одинаковом порядке, использует одну и ту же кастомную тулзу разных версий.
В Datadog это описали предельно конкретно: «По отдельности большинство этих запросов ничем не примечательны. Они обращаются к публичным эндпоинтам, проходят аутентификацию чисто или вообще без неё, и возвращают успешные ответы. Проблема — в совокупности: группа аккаунтов, синхронно перемещающихся по GitHub-организациям разных компаний с версионируемым кастомным инструментарием, работающим неделями, а в худшем случае — субъекты, которые перестали просто сканировать и начали клонировать».
Схема атаки укладывается в четыре последовательных этапа. Сначала идёт автоматизированная разведка — сбор данных об организациях, репозиториях и пользователях через открытый API. Затем подключаются механизмы доступа: спящие аккаунты вперемешку с угнанными OAuth-токенами и PAT. На третьем этапе часть операторов переходит от простого перечисления к активному клонированию приватных репозиториев. И всё это держится на одном простом трюке — использовании состарившихся, ничем не примечательных учёток вместо свежих, которые сразу привлекли бы внимание систем мониторинга.
Для служб безопасности компаний, использующих GitHub, это довольно неприятный сигнал. Классические подходы к обнаружению аномалий — поиск подозрительных user-agent'ов, свежесозданных аккаунтов, всплесков активности с одного IP — здесь просто не работают. Нужна корреляция на уровне организации целиком: сопоставление паттернов запросов от разных, казалось бы, независимых пользователей, отслеживание совпадений в тайминге и последовательности обращений к репозиториям.
Речь идёт о более чем 50 «спящих» аккаунтах, созданных от двух до пяти лет назад. Всё это время они просто существовали — без единого коммита, без активности, ничем не привлекая внимания. А затем их будто разбудили и пустили в дело. По словам старшего инженера по безопасности Datadog Джули Агнес Спаркс, именно в этом и заключается расчёт атакующих: аккаунт с историей в несколько лет не вызывает подозрений так, как свежесозданный профиль, зарегистрированный вчера ради разовой операции.
Параллельно с «призрачными» аккаунтами злоумышленники задействовали и другой канал — украденные OAuth-токены и персональные токены доступа (PAT), принадлежащие вполне реальным пользователям. Таких скомпрометированных учёток набралось несколько десятков, и они добавляли операции ещё один слой правдоподобности: запросы шли как бы от имени легитимных разработчиков.
Инструментарий для сканирования тоже впечатляет своей проработкой. Это не примитивный скрипт для одноразового парсинга, а версионируемая система, которая менялась и дорабатывалась прямо в процессе кампании. Запросы маскировались под легитимные или похожие на легитимные user-agent'ы, что дополнительно усложняло фильтрацию по сигнатурам.
Основная цель — публичные данные: списки организаций, репозиториев, участников команд. Казалось бы, ничего секретного, GitHub и так открывает значительную часть своего API без авторизации. Но в нескольких случаях наблюдатели зафиксировали переход границы: атакующие не просто перечисляли публичные репозитории, а клонировали приватные. Как минимум для одной организации подтверждён факт доступа к закрытому коду.
Здесь и кроется главная сложность обнаружения подобной активности. Отдельно взятый запрос выглядит абсолютно рутинно — обращение к публичному эндпоинту, чистая или вовсе отсутствующая аутентификация, успешный ответ сервера. Ничего похожего на классические индикаторы компрометации. Проблема проявляется только при сопоставлении множества запросов между собой, когда становится видно: группа аккаунтов двигается синхронно, обходит одни и те же организации в одинаковом порядке, использует одну и ту же кастомную тулзу разных версий.
В Datadog это описали предельно конкретно: «По отдельности большинство этих запросов ничем не примечательны. Они обращаются к публичным эндпоинтам, проходят аутентификацию чисто или вообще без неё, и возвращают успешные ответы. Проблема — в совокупности: группа аккаунтов, синхронно перемещающихся по GitHub-организациям разных компаний с версионируемым кастомным инструментарием, работающим неделями, а в худшем случае — субъекты, которые перестали просто сканировать и начали клонировать».
Схема атаки укладывается в четыре последовательных этапа. Сначала идёт автоматизированная разведка — сбор данных об организациях, репозиториях и пользователях через открытый API. Затем подключаются механизмы доступа: спящие аккаунты вперемешку с угнанными OAuth-токенами и PAT. На третьем этапе часть операторов переходит от простого перечисления к активному клонированию приватных репозиториев. И всё это держится на одном простом трюке — использовании состарившихся, ничем не примечательных учёток вместо свежих, которые сразу привлекли бы внимание систем мониторинга.
Для служб безопасности компаний, использующих GitHub, это довольно неприятный сигнал. Классические подходы к обнаружению аномалий — поиск подозрительных user-agent'ов, свежесозданных аккаунтов, всплесков активности с одного IP — здесь просто не работают. Нужна корреляция на уровне организации целиком: сопоставление паттернов запросов от разных, казалось бы, независимых пользователей, отслеживание совпадений в тайминге и последовательности обращений к репозиториям.