Анализ подверженности репозиториев на GitHub атаке RepoJacking

Исследователи из компании Aqua Security проанализировали применимость атаки RepoJacking к репозиториям на GitHub. Суть проблемы в том, что после удаления или переименования проектов на GitHub, в сторонних репозиториях могут остаться ссылки на уже несуществующие имена, например, в документации, скриптах и инструкциях по установке из README-файлов. Атакующий может зарегистрировать на GitHub имя пользователя, повторяющее ранее существовавшее имя, разместить в репозитории с повторяющимся именем вредоносное ПО и ожидать, что кто-то загрузит его, пользуясь неисправленными руководствами или старым кодом, загружающим зависимости по старым ссылкам.

Например, в прошлом году подобным образом был получен контроль над PHP-библиотекой phpass. В GitHub имеется защита от повторной регистрации удалённых проектов, но её удалось обойти через создание репозитория с тем же именем в произвольной учётной записи, после чего переименовать эту учётную запись в целевую. Например, если нужно зарегистрировать репозиторий user/rep, где учётная запись user удалена, GitHub даст создать повторно пользователя “user”, но не позволит создать репозиторий “rep”. Обойти это ограничение можно создав репозиторий “rep” в учётной записи другого пользователя (например, “user1”), после чего переименовать этого пользователя в “user”.

GitHub теперь пытается противостоять подобным манипуляциям, но по данным Aqua Security, не все обходные пути блокируются и защита распространяется только на самые популярные проекты, до переименования насчитывавшие более 100 клонов. При этом защита не захватывает проекты, ставшие популярными после переименования. Также не учитывается, что популярный проект может использовать в качестве зависимости менее популярный репозиторий, который раньше был переименован и на который не распространяется защита (атака может быть совершена через подмену зависимости). После переименования GitHub автоматические перенаправляет старые ссылки на новый репозиторий, но это перенаправление действует только до регистрации пользователя с тем же именем, из-за чего в коде часто забывают поправить ссылки на новое имя.

В ходе исследования Aqua Security была изучена выборка из 1.25 млн репозиториев, что соответствует примерно 0.4% от общего числа репозиториев на GitHub. Список был получен на основе анализа лога изменений за случайный месяц (июнь 2019). Подверженность атаке RepoJacking выявлена в 36983 репозиториях (2.95%). Экстраполировав полученные результаты на все репозитории GitHub сделан вывод, что потенциально атака RepoJacking может затрагивать более 8 млн репозиториев.

В качестве примера рассмотрены RepoJacking-уязвимости в репозиториях Google (google/mathsteps) и Lyft (yesgraph-Dominus_DEPRECATED). В репозитории Google старое имя репозитория (“socraticorg/mathsteps”) упоминалось в официальной инструкции по установке, а в репозитории Lyft присутствовал установочный скрипт, загружающий ZIP-архив из переименованного репозитория (“YesGraph/Dominus”). Для совершения атаки злоумышленник мог зарегистрировать пользователей “socraticorg” и “YesGraph”, после чего разместить в них репозитории “mathsteps” и “Dominus”.

Исследователями также проведена экспериментальная атака, показывающая работоспособность метода. В нескольких переменованных репозиториях были организован сбор информации об IP-адресах, загрузивших размещённые в репозитории артефакты. В итоге загрузки подменённых данных были зафиксированы в сетях нескольких крупных компаний.

Release. Ссылка here.