В середине июля 2026 года в официальном реестре Ruby-библиотек RubyGems были выявлены две серии вредоносных пакетов, предназначенных для скрытого майнинга криптовалюты. Первая, более сложная кампания, насчитывает 113 поддельных библиотек, опубликованных 13 июля, которые в сумме были загружены более 14 тысяч раз. Вторая, менее изощрённая, включает 23 пакета, опубликованных к 16 июля. Кроме того, обнаружен связанный аккаунт, содержащий 309 пакетов без вредоносной нагрузки - вероятно, тестовый полигон для будущих атак.
Описание
Все 113 пакетов первой кампании представляют собой троянизированные копии популярных Ruby-библиотек. Злоумышленник использовал единую схему наименования, комбинируя приставки (giga, nano, ultra, hyper, piko, super, mega, micro, mini, tiny) с качественными определениями (pure, sharp, smart, pro, safe, clean, fast, quick, lite, max) и окончаниями (kit, tool, mod, pkg, hub, lib, box, rb, sys, gem). В каждую из таких подделок встроена идентичная вредоносная вставка - программа-майнер криптовалюты Monero на основе открытого проекта XMRig. Майнер активируется не сразу: код задерживает запуск на пять часов после установки пакета, чтобы обойти автоматические песочницы, которые обычно анализируют поведение в течение короткого времени.
Как показало исследование, для закрепления в системе злоумышленник предусмотрел три механизма: добавление строки в файл конфигурации оболочки (~/.bashrc), установка задания в планировщик задач (crontab) и создание пользовательской службы в системе инициализации (systemd). После активации майнер пытается прочитать ключи SSH на заражённой машине и известные хосты, после чего распространяется на другие доступные серверы - так называемое боковое перемещение. Более того, вредоносная нагрузка способна заражать другие языковые экосистемы: она записывает вредоносные скрипты в файлы package.json (Node.js), setup.py (Python), .gemspec (Ruby), Dockerfile, а также устанавливает ловушки в систему контроля версий git и расширения для редактора кода VSCode.
Перед выполнением майнера код проверяет, не работает ли программа в изолированной среде: он ищет признаки виртуальных машин (VMware, VirtualBox, QEMU), контейнеров (файл /.dockerenv, записи в cgroup) и отладчиков. Если окружение считается подозрительным, майнер не запускается. При работе он следит за нагрузкой на процессор и приостанавливает добычу, если загрузка превышает половину доступных ядер. Все настройки майнера хранятся в зашифрованном виде: используется тройное шифрование (AES, RSA, ChaCha20), что затрудняет извлечение адреса кошелька и пулов для майнинга. Все 113 пакетов направляют вычислительные мощности на один и тот же кошелёк Monero через четыре майнинг-пула.
Вторая кампания, проводившаяся с другого аккаунта, оказалась проще. Злоумышленник сначала опубликовал 23 пакета-пустышки 12 июля - они были безвредны и имели описание "University research based on...". Через четыре дня, 16 июля, все эти пакеты были обновлены, и в них появилась вредоносная нагрузка. В отличие от первой кампании, код не был зашифрован - он представлял собой открытый скрипт на Ruby, который загружал майнер XMRig напрямую с GitHub, используя официальный API репозитория проекта, и запускал его встроенным методом exec(). Механизмы закрепления, бокового перемещения и проверки на виртуальные среды отсутствовали - майнер работал только во время выполнения команды. Настройки были жёстко прописаны в коде: единственный пул pool.supportxmr.com и стандартный порт.
Для маскировки второй злоумышленник использовал две стратегии именования. Первая повторяла схему приставок и определений из первой кампании. Вторая - тайпосквоттинг, то есть регистрация имён, похожих на известные популярные библиотеки, с заменой символов (буква "i" на цифру "1", "o" на "0", удвоение букв). Среди целей - такие распространённые пакеты, как minitest, rake, activesupport, addressable, json, aws-sdk-core, bundler и другие. Именно эти библиотеки ежедневно загружают миллионы разработчиков, поэтому поддельные версии могли оказаться в чужих проектах случайно или при использовании невнимательных команд установки.
Отдельное внимание привлёк третий аккаунт, связанный с обеими кампаниями. На нём с 5 по 14 июля были опубликованы 309 пакетов с такими же шаблонами наименований, но без вредоносного содержимого - их общее число загрузок составило почти 140 тысяч. На момент 15 июля все эти библиотеки оставались чистыми, однако их наличие свидетельствует о возможной подготовке к будущим атакам или тестировании механизмов публикации. Аккаунт до сих пор активен на платформе RubyGems.
Подобные инциденты напоминают о необходимости тщательной проверки сторонних пакетов перед их использованием в проекте. Разработчикам рекомендуется обращать внимание на нестандартные имена библиотек, загруженные недавно или с подозрительно большим числом версий, а также использовать инструменты анализа зависимостей, которые могут выявить несанкционированные сетевые подключения или запуск скрытых процессов. Регулярное обновление менеджеров пакетов и подключение автоматических проверок на наличие вредоносных вставок снижают риск компрометации, хотя полностью устранить угрозу от атак на цепочку поставок невозможно.