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

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

Механизм проверки соответствия между email-адресом в коммитах Git и email-адресом, связанным с аккаунтом на GitHub, работает по странному принципу. Можно подумать, что валидация вовсе отсутствует, но вот выдержка из документации по GitHub, которая объясняет, как определяется авторство коммитов:
Коммиты отображаются в графике, только если они отвечают всем из нижеперечисленных условий:
- Адрес почты, использованный для коммитов, привязан к вашему аккаунту на Github;
- Коммиты сделаны в отдельном репозитории, а не в форке;
- (…)
Кроме того, должно соблюдаться как минимум одно из следующих условий:
- Вы один из соавторов репозитория или член организации, владеющей репозиторием;
- Вы создали форк репозитория;
- Вы открыли пулл-реквест или issue для репозитория.
Таким образом, чтобы вы могли завандалить чужой график коммитов, нужны всего три предпосылки:
- Другой пользователь должен открыть issue или запушить код в репозиторий, в который вы тоже можете пушить код (или получить одобрение пулл-реквеста);
- Вы должны знать почтовый адрес, который пользователь использовал для регистрации;
- Репозиторий не должен быть форком.
Как использовать эту силу во благо
В последнее время на GitHub фиксировались попытки фишинга через оставление комментариев в issues:

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

Чтобы письмо с этим уведомлением пришло мне на почту, злоумышленник открыл issue в репозитории, куда я пушил код. Это позволило мне оставить в его профиле ту самую метку «Bad dude». С тех пор этого пользователя уже забанили на GitHub.
Если вы хотите попробовать сделать это самостоятельно, достаточно воспользоваться каким-нибудь готовым инструментом для рисования граффити в графиках активности (например, этим) и указать почтовый адрес человека, который пытался вас развести. Эти почтовые адреса можно узнать, просмотрев API событий мошенника. Или можно просто клонировать его репозитории и посмотреть адреса, использованные в его старых коммитах.
Выводы, которые можно отсюда извлечь
Легко представить, что кто-то может использовать эту систему в менее благородных целях: например, писать в профилях ни в чем не повинных пользователей GitHub нецензурные оскорбления или еще что похуже. Проблемы можно было бы избежать, если бы график основывался на событиях пушей, а не на сырых данных коммитов; однако это может расстроить некоторых пользователей, которые пушат много коммитов за один раз, а не по одному-двум коммитам ежедневно.
Как бы то ни было, эта особенность возникла из-за слабого механизма аутентификации внутри самого Git, а также из-за системы управления доступом на основе ролей, которую GitHub построил вокруг Git.
Комментарии (11)
GidraVydra
04.02.2025 20:20Где та тонкая грань между придурком, засирающим чужие коммиты, и благородным доном, клеймящим мошенников?
Newbilius
04.02.2025 20:20Благородный дон в случае, если ему скажут, что он ошибся и пометил не того - публично извинится и добровольно передаст пострадавшему от его действий материальную компенсацию за причинённые неудобства.
Myxach
04.02.2025 20:20Скорее всего грань находится по принципу:"если это делаю я. то благородный дон, а если мне, то придурки "
kipar
04.02.2025 20:20атакующий рискует больше жертвы - жертва как правильно написали ниже может в крайнем случае закрасить граффити, а вот у атакующего есть какой-то репозиторий достаточно популярный чтоб там оставляли issue, так что если жертва напишет в службу поддержки он вполне может его лишиться.
Tony-Sol
04.02.2025 20:20Хуже того, жертва не сможет удалить эти коммиты.
Если только это не коммиты, где у жертвы есть права на push force, потому что кажется, что тогда можно через rebase + squash + reset-author полностью переписать историю
kipar
04.02.2025 20:20там где у жертвы есть права атакующий скорее всего и не сможет создать столько мусорных коммитов. "Атака" как раз в том что жертве достаточно оставить issue в репозитории подконтрольном атакующему.
Panzerschrek
04.02.2025 20:20Что мешает мошеннику просто таким же образом нагенерировать коммитов, полностью заполняющую все дни, так что граффити особо заметным не будет? Или просто проявлять каждодневную активность (как в моём случае).
briabeegost
04.02.2025 20:20Честно говоря, если бы я увидел такое граффити без контекста этой статьи, я бы подумал что автор сам веселится
Kenya-West
Интересно. А подписывание коммитов GPG'шкой или полноценным PEM со своим CA даст гарантию 100% защиты от такого багоабузоюза?
Tony-Sol
Как будто бы нет. Ну то есть, при включенном vigilant mode, эти коммиты в истории будут отмечены как unverified, но похоже что они все равно будут