Инциденты

Вредоносный Go-модуль раскрыл фабрику приманок на GitHub

Маша Даровская
By Маша Даровская , IT-редактор и автор
Вредоносный Go-модуль раскрыл фабрику приманок на GitHub
Обложка © Anonhaven

Исследователи обнаружили на GitHub сеть из 222 репозиториев, созданных для распространения вредоносных программ под видом полезных инструментов. В подтверждённое ядро инфраструктуры вошли 190 учётных записей. Репозитории маскировались под средства проверки доменов, расширения для криптокошельков, торговых роботов, ботов для Telegram и Discord, игровые читы и инструменты для тестирования безопасности.

Расследование началось с модуля dnsub-scanning-tool для языка Go. Проект выдавал себя за сканер DNS и поддоменов, но запускал на компьютере скрытый сценарий PowerShell ещё до выполнения заявленных функций. Дальнейшая цепочка загружала зашифрованные команды, искала адрес полезной нагрузки через публикации на общедоступных платформах и устанавливала трояны удалённого доступа либо программы для кражи данных. Socket назвала кампанию Operation Muck and Load.

На 11 июля 2026 года репозиторий Kaleidora/dnsub-scanning-tool оставался общедоступным. GitHub показывал 909 изменений и всего две звезды. В начале файла main.go по-прежнему находилась команда, которая скрытно запускала PowerShell, загружала внешний объект, декодировала его штатной программой Windows и выполняла полученный сценарий с обходом локальной политики запуска.

Файл LOG, используемый для имитации постоянной разработки, обновился 10 июля — уже после публикации расследования Socket. Это указывает на продолжение автоматической генерации изменений либо на работу связанного с ней сценария GitHub Actions.

Socket передала сведения службе безопасности GitHub и команде Go. Разработчики Go сообщили исследователям о блокировке вредоносного модуля в официальном зеркале модулей. Сам репозиторий и каталожная страница pkg.go.dev при проверке всё ещё открывались. Эти сервисы выполняют разные задачи: GitHub хранит исходники, каталог показывает сведения о пакете, а зеркало обслуживает загрузку версий командой Go. Сохранение страницы в каталоге не подтверждает возможность штатно получить модуль через заблокированное зеркало.

Создатели приманки взяли описание и внешний вид существующего инструмента dnsub, предназначенного для поиска поддоменов. Вредоносная копия находилась в другом пространстве имён GitHub, но использовала знакомое название, документацию и примеры команд.

Главная опасность размещалась в самом начале функции main(). До перехода к коду сканера программа запускала PowerShell с невидимым окном. Он обращался к домену muckcoding, сохранял полученные данные под видом файла базы в общей папке изображений Windows, декодировал их в сценарий L.ps1 и запускал его с отключённой проверкой политики выполнения.

Вредоносную строку отодвинули далеко вправо большим количеством пробелов. При обычном просмотре файла разработчик мог увидеть начало программы и принять его за пустую или безобидную строку. Для обнаружения команды требовалась горизонтальная прокрутка либо автоматическое форматирование кода.

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

Модуль впервые появился 24 января 2026 года. За несколько месяцев вокруг него возникло более 1200 версий, из которых свыше 700 содержали вредоносную логику. Для небольшого сканера с двумя звёздами такая частота выпусков выглядит аномально.

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

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

Расписание было записано как запуск каждую минуту. GitHub фактически не обещает такую частоту: минимальный интервал для запланированных Actions составляет пять минут, возможны задержки и пропуски. Смысл оставался прежним — страница получала свежую дату, длинную историю изменений и признаки якобы активной поддержки.

Загруженный L.ps1 состоял из нескольких слоёв кодирования. Сценарий расшифровывал данные через операцию XOR, передавал результат на выполнение и повторял процедуру для следующего слоя. Внутри также отключалась проверка сертификатов, поэтому загрузчик мог устанавливать соединение с сервером даже при недействительном, подменённом или самоподписанном сертификате.

Конечный сценарий не содержал постоянного адреса вредоносного архива в открытом виде. Вместо этого он проверял несколько общедоступных площадок: Pastebin, Telegram, YouTube, Instagram, Google Docs, GitCode и подконтрольные создателям домены.

На этих страницах размещался зашифрованный указатель на следующий файл. Сценарий находил специальную метку, извлекал соседний блок, расшифровывал его встроенным ключом и получал актуальный адрес загрузки. Публичные сервисы фактически работали как резервные доски объявлений для вредоносной программы.

Такая архитектура устойчивее одного управляющего сервера. После удаления публикации с одной площадки программа может перейти к другой. Оператор также способен заменить адрес архива, не меняя первоначальный Go-модуль и уже установленные сценарии.

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

Загрузчик распаковывал архив в каталог, внешне похожий на папку приложения Microsoft Photos. Затем запускался файл с нейтральным названием Microsoft.exe. Этот путь не является штатным расположением программы «Фотографии», но в журнале процессов и при беглом осмотре выглядит правдоподобно.

Модуль Go оказался лишь одной точкой входа. Связанный адрес электронной почты и одинаковый сценарий накрутки изменений привели исследователей к 222 подтверждённым репозиториям в 190 аккаунтах.

В этот подсчёт включались проекты, где одновременно присутствовали адрес, связанный с оператором, и характерный сценарий GitHub Actions. 

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

— защита аккаунтов и двухфакторная проверка для Exodus;
— интеграции MetaMask, WalletConnect и Trust Wallet;
— торговые роботы и автоматизация Binance;
— инструменты для PayPal;
— боты для Telegram и Discord;
— автоматизация криптовалютных игр;
— читы для PUBG, Escape from Tarkov и Valorant;
— упаковщики, генераторы и средства для проведения атак.

Исследователи подтвердили как минимум 14 уникальных вредоносных файлов в изученной инфраструктуре. В неё входили загрузчики, программы для кражи данных, шпионские компоненты и майнеры Monero на основе XMRig или BitMiner.

Один и тот же Loader.exe без изменений находился сразу в четырёх проектах. В другом репозитории со схожей легендой размещался загрузчик, связанный с Vidar — программой для кражи паролей, файлов cookie, данных браузеров и криптовалютных кошельков.

Часть файлов помещалась прямо в дерево исходников, другие распространялись через раздел выпусков GitHub. В одном случае злоумышленники применили управляющий символ Unicode, разворачивающий часть имени справа налево. Так исполняемый файл заставки Windows с расширением .scr выглядел похожим на файл проекта.

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

Найденная сеть пересекается с инфраструктурой, которую Sophos изучала в 2025 году. Тогда аналитики обнаружили 141 связанный репозиторий. Вредоносный код присутствовал в 133 из них, а 111 использовали команды предварительной сборки Visual Studio для скрытой загрузки следующей ступени.

Около 58% найденных тогда приманок изображали игровые читы. Ещё 24% выдавали себя за вредоносные программы, средства эксплуатации уязвимостей или инструменты для атак. Остальная часть была связана с ботами, криптовалютами и вспомогательными программами.

Аналитики также нашли тот же адрес ischhfd83@rambler.ru, похожую автоматизацию коммитов, архивы 7-Zip, вредоносные приложения Electron и многоступенчатые сценарии. Старейшее подтверждённое изменение в их наборе датировалось ноябрём 2023 года. Исследователи Socket с высокой уверенностью относят новую операцию к тому же кластеру активности, но не устанавливают конкретного автора или страну происхождения.

Сеть эксплуатирует привычные признаки доверия к открытому проекту. Пользователи смотрят на дату последнего изменения, количество коммитов, оформленный README и наличие выпусков. Все эти признаки можно сгенерировать автоматически.

В исследовании Sophos один репозиторий имел почти 60 тыс. изменений спустя несколько месяцев после создания. Среднее число коммитов превышало 4400, но среднее количество звёзд составляло лишь 2,78. Большую часть изменений создавал один автоматизированный аккаунт, записывавший новую дату в служебный файл.

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

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

Такая проверка не отвечает на вопрос, безопасны ли сами файлы. Вредоносный модуль тоже может иметь корректную контрольную сумму. Она лишь подтверждает, что код не изменился после публикации.

Есть новость? Станьте автором.

Мы сотрудничаем с независимыми исследователями и специалистами по кибербезопасности. Отправьте нам новость или предложите статью на рассмотрение редакции.