Это история о том, как я нашел 10.000 репозиториев в GitHub, в которых находится ссылка на скачивание zip архива. В этом архиве — троян. Все эти репозитории от разных контрибьюторов, с разным названием и не являются форками других репозиториев. Но у всех них есть одинаковый паттерн, который и позволил написать скрипт для поиска таких репозиториев.

Начало

У меня есть проект в гитхабе и я хотел проверить, проиндексировали ли его поисковые системы. Ввёл название проекта в Google, в выдаче появился мой репозиторий. Ввёл такой же запрос в Bing, в выдаче появился чужой репозиторий. С таким же названием и описанием. Там была копия моего репозитория со всеми коммитами, а я был указан в списке контрибьюторов. Но час назад был отправлен еще один коммит с изменением readme. В нём добавилась ссылка на zip архив.

Я выбирал подходящие теги для другого моего проекта в гитхабе. Перешел по этим тегам, чтобы посмотреть аналогичные продукты. В списке нашел репозиторий, название и описание которого полностью совпадают с еще одним репозиторием из этого списка. Оказалось, что в нем также скопированы все коммиты этого репозитория, а 2 часа назад в readme была добавлена ссылка на zip архив.

Понаблюдав за этими двумя репозиториями, я выяснил, что они каждые несколько часов удаляют предыдущий коммит и снова отправляют такой же коммит. В этом коммите только 1 изменение: добавление ссылки на архив в readme файл.

Я отправил запрос в поддержку гитхаба с просьбой удалить эти репозитории. За 2 недели ничего не изменилось, поддержка гитхаба не ответила. Я обсудил с ИИ, что еще можно с этим сделать, но полезных советов он не дал. Я открыл обсуждение на гитхабе, ответили 3 человека, с таким же ИИ слопом без какой-либо пользы.

Еще через месяц поддержка гитхаба прислала мне письмо о том, что они удалили эти репозитории.

Вы можете открыть другие подобные репозитории, посмотреть последний коммит и увидеть, что несколько часов назад в readme была добавлена ссылка на zip архив:
https://github.com/lucasheriq4374/welink
https://github.com/lucioloprey/OcyShield-Framework
https://github.com/luigi1973/AssetRipper-CLI


Zip архив содержит 4 файла:

  • Application.cmd или Launcher.cmd

  • loader.exe или luajit.exe или another_name.exe

  • random_name.cso или random_name.txt

  • lua51.dll

Если указать ссылку на архив в virustotal, он найдет 0 вирусов.
Если отправить zip файлом, он найдет в нём троян.

Проверка архива в VirusTotal
Проверка архива в VirusTotal

Продолжение

Казалось, я уже забыл об этом событии, но моё подсознание не забыло. И часто подсознание подкидывает мне интересные идеи когда я сплю или просыпаюсь. Недавно я проснулся и в ту же секунду понял, что мне нужно сделать. Мне нужно составить общий паттерн, а затем написать скрипт, который проанализирует все репозитории гитхаба и найдет среди них те, которые попадают под этот паттерн.

Паттерн для поиска:

  • Каждые несколько часов удаляется предыдущий коммит и отправляется новый

  • В коммите обновляется только readme файл

  • В readme файле находится ссылка на zip архив

  • Коммиты скопированы с другого репозитория

  • Это новый репозиторий, а не форк

  • У всех репозиториев разные контрибьюторы и разные названия

Из последних 2 пунктов становится понятно, что даже если мы найдем один такой репозиторий, мы не сможем по нему найти другие подобные репозитории. Но в гитхабе 500 миллионов репозиториев. Как нам их все проанализировать? Гитхаб позволяет делать 5.000 запросов в час с одним токеном. Для каждого репозитория нам надо сделать несколько запросов для получения списка коммитов, измененных файлов и контента readme файла. Я не хотел ждать год, пока скрипт проанализирует все репозитории.

Но ведь нам не нужны все репозитории, нам нужны только те, которые обновляются каждые несколько часов. Я нашел сервис gharchive, с которого можно скачать все события гитхаба за любой день. Значит нам нужно получить события за последние дни, найти из них пуш коммитов, и найти репозитории, которые обновляются от 2 до 10 раз каждые 10 часов.

За последние 5 дней было 16 миллионов пушей коммитов. Из них всего 3.000 репозиториев, которые обновляются каждые несколько часов.

Но в событиях нет информации о том, какие именно файлы были изменены. Значит для каждого подходящего репозитория нам нужно сделать дополнительные запросы к API гитхаба.

После запуска сприпт выдал много репозиториев. Я добавил в фильтры несколько параметров:

  • Коммит должен быть от пользователя, а не от бота

  • Между последним коммитом и предпоследним прошло более месяца

  • В репозиториях больше одного контрибьютора

После этого нашлось только 14 репозиториев, которые полностью совпадают с паттерном. И мне не давал покоя вопрос, почему нашлось так мало репозиториев? Какая вероятность того, что я наткнулся на эти репозитории 2 месяца назад и их всего 14 штук по всему гитхабу? Ведь их должно быть гораздо больше. Представьте, какой был бы заголовок этой статьи, если бы я нашел миллион таких репозиториев, ну или хотя бы тысячу.

Но я смирился с тем, что их всего 14, и начал писать эту статью. Я решил перепроверить их еще раз, чтобы не добавить в статью лишние репозитории по ошибке. И какого же было мое удивление, когда я увидел, что все они обновлялись последний раз 20 часов назад. Значит параметр "обновляются каждые несколько часов" был вообще не правильный. Фильтр отбросил все репозитории, которые обновляются редко.

Еще при ручной проверке я увидел репозитории, в которых есть ссылка на zip архив и есть недавний коммит, но в нём 0 изменений. А фильтр учитывал только репозитории, в которых был изменен 1 файл readme в последнем коммите.

Еще я заметил, что последний коммит во всех этих репозиториях называется одинаково: "Update README.md".

Я поменял фильтр. Теперь скрипт искал репозитории, которые обновлялись от 1 до 24 раз каждые 24 часа. Таких репозиториев нашлось 40.000.

Репозиториев, которые полностью совпадают по паттерну — 10.000. Это 25% от общего количества.

Каждый из этих репозиториев содержит zip архив с трояном.

Эти репозитории существуют много месяцев, некоторые даже больше года, гитхаб их автоматически не детектит и не удаляет.

Полный список репозиториев я опубликовал на GitHub.
Скрипт для поиска таких репозиториев: Git Malware Finder

Открытые вопросы

  1. Почему они копируют только новые репозитории, а не популярные?

  2. Зачем они удаляют коммит и отправляют новый каждые несколько часов?

  3. Почему гитхаб не детектит такие репозитории автоматически?

  4. Что именно делает исполняемый exe файл из архива?

  5. Какой реальный масштаб этой схемы?

Мои предположения

Задача хакеров — понять, как работает система, найти в ней ограничения и уязвимости, и воспользоваться этой информацией. Если перезаписывание коммитов помогает обойти алгоритмы безопасности гитхаба, то они этим воспользовались. Возможно, по этой же причине каждый коммит называется "Update README.md".

Вторая задача это распространение вируса. Как сделать так, чтобы люди его нашли и скачали? Думаю для этого они копируют только новые репозитории и сразу попадают в топ выдачи поисковых систем по низкочастотным запросам. И они добавляют эти репозитории в популярные теги гитхаба, чтобы увеличить шанс индексации, и чтобы люди нашли эти репозитории из этих тегов.

Но почему они копируют все коммиты и контрибьюторов? Ведь они могли просто скопировать весь исходный код? Это возможно сделано для доверия. Когда человек заходит в репозиторий, он видит контрибьюторов, может в них перейти и увидеть, что это не аккаунты однодневки. И сохраняется история коммитов, чтобы было понятно, что репозиторий появился не вчера. Но возможно это также сделано для обхода алгоритмов гитхаба.

Это только мои предположения, а реальность может быть совершенно другая.

Заключение

У меня было ограничение API гитхаба на 5.000 запросов в час. Я оптимизировал скрипт для поиска только подходящих репозиториев, и думаю из-за фильтра скрипт нашел только малый процент репозиториев. У команды гитхаба таких ограничений нет. Они могут проанализировать все 500 миллионов репозиториев, найти в них любые архивы или исполняемые файлы и проверить их на вирусы.

На этот раз я не буду отправлять запрос в GitHub. Репозиториев слишком много. Если у кого-то из вас есть прямой контакт со службой безопасности гитхаба, отправьте им ссылку на эту статью.

UPD
Нашел такую статью от 18 апреля: How 109 Fake GitHub Repositories Delivered SmartLoader and StealC
В ней подробно рассказывается, как работает этот вирус. На тот момент автор статьи нашел 109 таких репозиториев.

UPD 2
Гитхаб начал удалять все репозитории, которые нашёл скрипт. Большинство из этих репозиториев уже не доступны.

UPD 3
Нашёл пост на Reddit с упоминанием этой схемы. Он был размещен в феврале 2025, почти 1.5 года назад: If you’re creating new repositories, they are being spoofed to host malware

UPD 4
Гитхаб удалил только те репозитории, которые я опубликовал в полном списке в txt файле. Затем я запустил скрипт еще раз, он нашёл новые репозитории, я добавил их в эту статью. Прошло 2 дня, эти репозитории не были удалены. У гитхаба нет способа поиска этих репозиториев. Они не запустили мой скрипт, они не написали свой скрипт. Они даже не открыли эту статью, чтобы посмотреть, изменился ли в ней список репозиториев. Они удаляют только репозитории, о которых им сообщают, но больше они ничего не делают. Поэтому эта схема существует уже несколько лет, и скорее всего продолжит существовать.

Все новые статьи и короткие заметки я публикую на сайте и в телеграм канале.

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


  1. AliceKwangweith
    18.06.2026 09:10

    Да, я тоже заметил с этим луаджитом 3-4 месяца назад репозиторий SpotiFLAC, для скачивания музыки из Spotify, отправил запрос с жалобой - удалили через 3 дня, а тут аж умный человек скрипт написал и нашел аж 10000 таких репозиториев, красава)).

    По поведению трояна похоже на ботнет, а вот куда он направлен - предстоит узнать


    1. aPiks
      18.06.2026 09:10

      Если речь о spotbye, то это старый репозиторий и прога рабочая. А клонов я поиском не нашел.


    1. Bardakan
      18.06.2026 09:10

      не знаю. Я на днях репортил такой репозиторий - удалили в течение пары часов.

      Правда там челы додумались в репозиторий с исходниками для ios засунуть вредонос под винду.

      А еще например, Brave наотрез отказался выкачивать файл - пришлось искать обходные пути


      1. nodevner
        18.06.2026 09:10

        Им даже не важно, о чём сам репозиторий, главное создать больше копий. Я думаю, что с такой скоростью создания копий это делает AI: загружает архив, пишет описание проекта (зачем?) и вставляет ссылку на архив в Readme.md, стиль везде один.


      1. geher
        18.06.2026 09:10

        Правда там челы додумались в репозиторий с исходниками для ios засунуть вредонос под винду.

        Это абсолютно нормально. Я помню вирус (еще в DOS), который заражал текстовые файлы (он их считал COM файлами, он вообще все считал такими файлами) и не брезговал повторным заражением. Просто влом проверять было.


  1. greabock
    18.06.2026 09:10

    Хабравчане, а есть идеи как можно что-то еще нарыть на этих ударников опенсорсного труда? Может по трояну кто-то что-то поймет? ))


  1. Dzen_Python
    18.06.2026 09:10

    Да, в последнее время то AUR забрасывают такими вот волнами с троянами, про NPM вообще молчу


  1. matveitkachev
    18.06.2026 09:10

    Вот это конечно они масштабную схему провернули


  1. nodevner
    18.06.2026 09:10

    Скриншот с VirusTotal
    Скриншот с VirusTotal

    Я загрузил несколько таких архивов с вирусом на VirusTotal. В каждом архиве в разделе Network Communication вирус стучится на 3 ресурса: GET на сайт по получению информации об айпи, POST на https://polygon.drpc.org/ и POST на предполагаемый сервер создателя вируса. Могу только предположить, что суть схемы в краже криптовалюты.


  1. danila-kondr2004
    18.06.2026 09:10

    Есть также репозитории на Github, где вирус размещён не по ссылке в README.md, а в релизном дистрибутиве. Например, клоны Flowseal/zapret-discord-youtube, которые создаются как будто под копирку, и во всех таких репозиториях в релизах есть файл DiscordFix.exe, который нужно обязательно запустить. Может быть, сейчас именно такой способ неактуален, распространители троянов наверняка поменяли тактику действия, но такое имело место, и я лично обращался в поддержку Github с требованием заблокировать один из таких репозиториев.

    Было бы интересно поискать такие вот репозитории с вирусами в релизах.


    1. Rikimortuy
      18.06.2026 09:10

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


  1. Granulex
    18.06.2026 09:10

    Техника обновления вредоносного коммита каждые несколько часов – не случайность: это сброс таймера для автоматических фильтров, которые ловят недавно изменённые репозитории. Параллельно жертва числится контрибьютором в копии своего же проекта – случайный посетитель видит знакомое имя и снижает бдительность. Два механизма доверия, задействованных одновременно.


    1. Rikimortuy
      18.06.2026 09:10

      Гитхабу давно пора внедрить хэширование бинарников по ссылкам в ридми. Если линка ведет на внешку с малварью, надо сразу давать шадоубан репе


      1. orchidfiles Автор
        18.06.2026 09:10

        Они размещают zip архив в этом же репозитории. Это уже не внешняя ссылка. Возможно это помогает обходить алгоритмы гитхаба.


  1. Psychosynthesis
    18.06.2026 09:10

    И они добавляют эти репозитории в популярные теги гитхаба

    А что конкретно значит вот это предложение?


    1. orchidfiles Автор
      18.06.2026 09:10

      В гитхабе есть теги. Вы можете добавить до 20 тегов в репозиторий. Тогда он будет показываться в списке репозиториев по этому тегу.


      1. CoolCmd
        18.06.2026 09:10

        В гитхабе есть теги.

        а разве они не topics называются?


        1. orchidfiles Автор
          18.06.2026 09:10

          Да, я ошибся. Они называются topics.


  1. Sanctuary_s
    18.06.2026 09:10

    Я репортил еще неделю назад https://github.com/CreekMonitor/Win11-Deployment-Optimization-Tool, но так и не снесли. :(


  1. KEugene
    18.06.2026 09:10

    Я всегда думал, что пользователь Гитхаба означает человека, который не станет запускать на компьютере стремный exe файл. Разве что в качестве эксперимента в песочнице.

    Кстати, разработчики ориентируются только на Windows пользователей. Какая дискриминация.


    1. Wesha
      18.06.2026 09:10

      Я всегда думал, что пользователь Гитхаба означает человека, который не станет запускать на компьютере стремный exe файл.

      Они уже здесь!


    1. 4ae4eK
      18.06.2026 09:10

      Кстати, разработчики ориентируются только на Windows пользователей. Какая дискриминация.

      На самом деле всё просто. Windows - самая популярная ОС в пользовательском сегменте. А делать под другие системы даже ради далее цифра взята с потолка 10-12% не особо имеет смысла


    1. Rikimortuy
      18.06.2026 09:10

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


      1. dee3mon
        18.06.2026 09:10

        Там сейчас кучу всего стороннего удобно хранить и распространять. Например, у меня там есть репо с библиотекой компонентов для Altium-а и с шаблонами для него, а также с учебниками в pdf-ах.


    1. JBFW
      18.06.2026 09:10

      Справедивости ради - очень распространенная схема установки чего-либо в Линуксе - curl URL | bash, то есть вы даже не знаете что именно скачали и откуда на самом деле, приходит некий скрипт, который что-то делает.
      Еще и права рута попросит (и получит).

      Конечно, есть параноики, которые сначала скачают, потом почитают, и только потом запустят (или пошагово выполнят вручную).
      Но не уверен что нас много...


  1. Rikimortuy
    18.06.2026 09:10

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


  1. YuriyX
    18.06.2026 09:10

    Вот это дела. 10к репозиториев с троянами, схема работает годами, а GitHub реагирует только на ручные репорты. Это systemic failure платформы. У них есть ресурсы проанализировать 500 млн репозиториев, но нет желания. Вопрос: это халатность или осознанная политика невмешательства? Потому что если второе — то Microsoft фактически покрывает распространение malware через свою инфраструктуру.


    1. nay77
      18.06.2026 09:10

      Может просто неофициальный полигон для отработки технологии массового заражения пользователей.


    1. Remigrant
      18.06.2026 09:10

      то Microsoft фактически покрывает распространение malware через свою инфраструктуру.

      А может быть, он делает это специально и целенаправленно?.. Да не, не может же быть!

      OH, SHI...!!!


  1. pureooplover
    18.06.2026 09:10

    Я тоже так накрыл два аккаунта когда увидел что мой проект на гитхабе скопировали и добавили некий zip-файл "Software-2.1-beta" и там в этом файле был обфусцированный код на Lua.

    UPD: я эти аккаунты заметил в начале этого года.


  1. LimTroev
    18.06.2026 09:10

    Еще были прецеденты, например скачиваешь проект на Microsoft Visual Studio, собираешь и подхватываешь малварь при сборке. Все дело в том, что в PreBuid Step или PostBuild Step была строчка запуска вируса. Еще гитхаб вирусописатели используют ка промежуточное звено для полезной нагрузки и обновлений своих троянов, ботов, стиллеров и т.д. а так же размещают там зашифрованные адреса командных центров для них и многое другое.


  1. Sap_ru
    18.06.2026 09:10

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


    1. isden
      18.06.2026 09:10

      Так уже "непонятно что" распространяется и так, легко и просто. Недавно скинули архив с комментом "Загрузите архив в чатбота, рекомендуется ChatGPT Plus или выше". А там внутри... Гигантские скиллы/промпты, код на питоне, куча инструкций. Которые конечно же никто не вычитывал и не проверял (и я это тоже делать не буду).


  1. trig-ger
    18.06.2026 09:10

    Firefox при скачивании на один из двух zip файлов отреагировал, что это вирус. Защитник в Windows 10 6-летней давности (не обновлялась даже) в обоих zip сразу определяет вирус. Так что подхватить вирус, даже скачав и распаковав подобный zip, чуть сложнее, чем кажется.


  1. dintsovaviiki
    18.06.2026 09:10

    Даже VirusTotal тут не показатель, потому что он не всегда корректно ловит поведение архивов внутри цепочки запуска