Уже много лет опенсорсные проекты позволяют нам «украшать» графики активности на GitHub фальшивыми историями коммитов Git. Но знали ли вы, что подобные граффити можно также размещать в профилях других пользователей?

К примеру, в графиках активности нескольких фишеров я оставил вот такую «черную метку»:


В статье расскажу, как отметить профиль недобросовестного юзера таким граффити, чтобы другие пользователи GitHub знали, с кем имеют дело.

Итак, при помощи простого скрипта в графике активности на GitHub можно рисовать забавный пиксель-арт. Это возможно из-за отсутствия механизма валидации меток времени между Git и GitHub, а также из-за того, что даты коммитов Git можно указывать задним числом.

Еще один пример граффити

Механизм проверки соответствия между email-адресом в коммитах Git и email-адресом, связанным с аккаунтом на GitHub, работает по странному принципу. Можно подумать, что валидация вовсе отсутствует, но вот выдержка из документации по GitHub, которая объясняет, как определяется авторство коммитов:

Коммиты отображаются в графике, только если они отвечают всем из нижеперечисленных условий:
  • Адрес почты, использованный для коммитов, привязан к вашему аккаунту на Github;
  • Коммиты сделаны в отдельном репозитории, а не в форке;  
  • (…)

Кроме того, должно соблюдаться как минимум одно из следующих условий:
  • Вы один из соавторов репозитория или член организации, владеющей репозиторием;
  • Вы создали форк репозитория;
  • Вы открыли пулл-реквест или issue для репозитория.

Таким образом, чтобы вы могли завандалить чужой график коммитов, нужны всего три предпосылки:
  • Другой пользователь должен открыть issue или запушить код в репозиторий, в который вы тоже можете пушить код (или получить одобрение пулл-реквеста);
  • Вы должны знать почтовый адрес, который пользователь использовал для регистрации;
  • Репозиторий не должен быть форком.
Эта система прямо напрашивается на злоупотребления. По сути, кто угодно может самовольно разместить баннер размером 7x52 в профиле другого пользователя. Хуже того, жертва не сможет удалить эти коммиты. 

Как использовать эту силу во благо


В последнее время на GitHub фиксировались попытки фишинга через оставление комментариев в issues

«Новая методика угона учетных данных Github? Атакующий оставляет комментарий в открытом issue, надеясь убедить владельца репозитория, что поступившее ему письмо с уведомлением о комменте — это предупреждение системы безопасности, требующее смены пароля...»

Кроме того, на GitHub были случаи, когда хакеры внедряли в чужие проекты зловредный код при слиянии репозиториев — например, так спрятали бэкдор в коде XZ-Utils.

Встретив на просторах GitHub такого мошенника, вы можете предупредить других пользователей о его недобрых намерениях, разместив граффити в его графике активности.

Как только злоумышленник открывает issue или отправляет нам пулл-реквест, у нас появляется уникальная возможность: теперь мы удовлетворяем одному из критериев, о которых я писал выше.

Некоторое время назад мне пришло фишинговое письмо от мошенника, который действовал по такой же схеме: 


Чтобы письмо с этим уведомлением пришло мне на почту, злоумышленник открыл issue в репозитории, куда я пушил код. Это позволило мне оставить в его профиле ту самую метку «Bad dude». С тех пор этого пользователя уже забанили на GitHub.

Если вы хотите попробовать сделать это самостоятельно, достаточно воспользоваться каким-нибудь готовым инструментом для рисования граффити в графиках активности (например, этим) и указать почтовый адрес человека, который пытался вас развести. Эти почтовые адреса можно узнать, просмотрев API событий мошенника. Или можно просто клонировать его репозитории и посмотреть адреса, использованные в его старых коммитах.

Выводы, которые можно отсюда извлечь 


Легко представить, что кто-то может использовать эту систему в менее благородных целях: например, писать в профилях ни в чем не повинных пользователей GitHub нецензурные оскорбления или еще что похуже. Проблемы можно было бы избежать, если бы график основывался на событиях пушей, а не на сырых данных коммитов; однако это может расстроить некоторых пользователей, которые пушат много коммитов за один раз, а не по одному-двум коммитам ежедневно.

Как бы то ни было, эта особенность возникла из-за слабого механизма аутентификации внутри самого Git, а также из-за системы управления доступом на основе ролей, которую GitHub построил вокруг Git.

Комментарии (5)


  1. Kenya-West
    04.02.2025 20:20

    Интересно. А подписывание коммитов GPG'шкой или полноценным PEM со своим CA даст гарантию 100% защиты от такого багоабузоюза?


    1. Tony-Sol
      04.02.2025 20:20

      Как будто бы нет. Ну то есть, при включенном vigilant mode, эти коммиты в истории будут отмечены как unverified, но похоже что они все равно будут


  1. GidraVydra
    04.02.2025 20:20

    Где та тонкая грань между придурком, засирающим чужие коммиты, и благородным доном, клеймящим мошенников?


  1. Tony-Sol
    04.02.2025 20:20

    Хуже того, жертва не сможет удалить эти коммиты. 

    Если только это не коммиты, где у жертвы есть права на push force, потому что кажется, что тогда можно через rebase + squash + reset-author полностью переписать историю