Он отфильтровал 16 млн пушей на GitHub и нашёл 10 000 репозиториев с одним трояном
Разработчик заметил два клона своего проекта, которые раз в несколько часов удаляли и перепушивали один и тот же коммит. Схема — SEO-атака: опередить оригинал в поиске, а тем, кто нажимает «скачать», подсунуть архив с вредоносом.
Всё началось с одного клонированного репозитория со ссылкой на zip-архив. Клон перепушивал идентичный коммит каждые несколько часов, чтобы держаться в топе «недавно обновлённых» на GitHub и обходить оригинал в поиске.
Чтобы оценить масштаб, автор разобрал 16 миллионов коммит-пушей из GHArchive за пять дней. Из 40 000 репозиториев, обновляющихся 1–24 раза в сутки, ровно 10 000 совпали с отпечатком кампании. Отправьте ссылку в VirusTotal — ноль угроз. Отправьте сам zip — троян.
Один клон, перепушивающий один коммит раз в несколько часов
Оригинальный разбор (779 голосов в треде) начинается с малого. Автор обнаружил два репозитория с именем своего проекта и полной историей коммитов, плюс одно дополнение: ссылка на zip-архив. Странной была периодичность: «Каждые несколько часов они удаляют предыдущий коммит и пушат точно такой же коммит заново».
Логика в ранжировании. Свежий, часто обновляемый клон поднимается в сортировке GitHub по «недавно обновлённым» и выходит в топ по нишевым запросам: пользователь ищет оригинальный инструмент, попадает на форк и скачивает отравленный релиз.
Как один репозиторий превратился в 10 000
GitHub поддержке потребовалось около двух недель на первый ответ и месяц на действие, поэтому автор автоматизировал поиск через GHArchive. Он отфильтровал примерно 16 миллионов коммит-пушей за 5 дней, начал с 3 000 высокочастотных репозиториев, затем отсеял по признакам ботов, истории контрибьюторов и паттернам сообщений коммитов. Поиск репозиториев, «обновляющихся от 1 до 24 раз каждые 24 часа», дал 40 000 кандидатов, из которых ровно 10 000 совпали с паттерном кампании — 25% от общего числа.
Полезная нагрузка — четырёхфайловый zip: .cmd-лаунчер, переименованный исполняемый файл (loader.exe, luajit.exe), blob с данными и lua51.dll. Один читатель разобрал образцы:
«Вирус делает запросы к трём ресурсам: GET-запрос на сайт для получения информации об IP, POST-запрос к Polygon RPC-ноде (drpc) и POST-запрос, по всей видимости, на сервер создателя вируса.» — читатель, загрузивший несколько архивов в VirusTotal
Такая схема (Polygon RPC плюс колбэк на неизвестный сервер) читается как кража криптовалюты.
Почему проверка ссылки чиста, а файл — нет
Уклонение от обнаружения банальное и эффективное:
«Если отправить ссылку на архив в VirusTotal, он найдёт 0 вирусов. Если отправить сам zip-файл — обнаружит троян внутри.» — комментатор, цитирующий манифест файлов
Тот, кто давно отслеживает такие кампании, объяснил, почему их трудно перечислить: каждый репозиторий создаётся заново, не как форк, с разными контрибьюторами и именами, поэтому обнаружение одного ничего не говорит об остальных. Фильтр по 16 миллионам пушей был единственным способом увидеть всю картину.
Разработчик с биографией security-исследователя описал, как сам столкнулся с той же схемой. Небольшие полезные кодовые базы форкают, дистрибутив заменяют вредоносом, README переписывают под SEO; когда он поймал один случай, тот был удалён в течение 24 часов. Несколько участников треда заметили: более быстрый путь — автоматическое сканирование, которое мог бы запустить сам GitHub:
«Единственное, от чего мы категорически отказываемся использовать ИИ, — это флагировать подобный мусор для защиты пользователей…» — разработчик в треде
Модель доверия к открытому коду — обращённая против самой себя
Кампания использует то, что делает GitHub полезным: публичную историю, выглядящую легитимно. Как выразился один читатель, принцип «открытый код не может ничего скрыть, потому что исходник виден» «не выдержал проверки», поскольку никто не проверяет код и не сверяет, совпадает ли бинарник с ним. Клон с реальными коммитами и аккуратным README проходит этот порог по умолчанию. Пока GitHub не использует частоту смены коммитов как сигнал, бремя обнаружения лежит на одном разработчике, разбирающем 16 миллионов пушей в свободное время. Автор отмечает: GitHub удалил только репозитории из его списка, не проверив наличие новых.
Получайте такие разборы каждый день
Главные истории Hacker News — на email, в Telegram или RSS.
GitHub Trending сегодня: iroh, freeCodeCamp, Plane, LibreTranslate, Unciv
Сегодня в топе нет ни одной большой языковой модели — и это главное. Пять репозиториев, которые в него поднялись, объединяет одна цель: каждый вычёркивает из стека отдельную компанию, будь то Atlassian, Google или игровой издатель.