5 октября 2026 года в реестре npm появилась версия 5.8.3 библиотеки @subql/common с вредоносной вставкой. Код срабатывает в двух случаях: когда разработчик устанавливает пакет и когда приложение просто импортирует его. Под удар попадают рабочие станции программистов и среды непрерывной интеграции, включая рабочие узлы GitHub Actions в облаке. Издатели пакета призывают считать эту версию небезопасной и не допускать её установки.
Описание
@subql/common - общая библиотека в монорепозитории SubQuery, набора инструментов для индексации данных в приложениях Web3. Внутри есть загрузчики проектов и модули чтения содержимого из локальных источников, GitHub и IPFS (распределённой файловой системы). Вредоносный файл представлен как кэш манифестов - на фоне остальных модулей название не выделяется. Предыдущая чистая версия 5.8.2 вышла 20 ноября 2025 года. Промежуточная предрелизная сборка и 5.8.3 появились 5 октября 2026 года с разницей в полчаса. На момент обнаружения метка последней версии в npm указывала именно на заражённый выпуск. Число файлов в пакете выросло с 62 до 65, а объём распакованных данных - примерно с 301 тысячи до 365 тысяч байт. Зависимости при этом не менялись.
Исследование StepSecurity показало, что авторы спрятали реализацию за тремя уровнями защиты. Первый - загрузчик, собранный из разрозненных фрагментов и восстанавливаемый в памяти в готовый код. Второй - шифрование текстовых строк, из-за которого имена серверов, файлов и настроек нельзя прочитать напрямую. Третий - отдельные зашифрованные объекты, среди которых сценарий чтения памяти чужого процесса и шаблон рабочего процесса GitHub. Полезная нагрузка запускается в отдельном процессе, не связанном с родительским. Установка или работа приложения завершается, а вредоносный код продолжает работу почти без вывода в консоль. Дополнительно он отключает проверку сертификатов, игнорирует сигналы завершения, определяет среду непрерывной интеграции и не запускается в системах с русской локалью.
Собранные данные охватывают локальные файлы с токенами и переменными окружения, ключи SSH, конфигурации Kubernetes, кэши облачных сервисов и кошельки. Отдельно вредоносный код читает окружение процесса целиком и пытается получить маркер доступа утилиты командной строки GitHub. На рабочих узлах GitHub Actions под управлением Linux он обращается к памяти служебного процесса и отбирает значения, помеченные как секретные. Дальше идут попытки выгрузить секреты из облачных хранилищ AWS и Kubernetes. При наличии подходящего токена код создаёт ветку, выглядящую как автоматическое обновление зависимостей, и внедряет рабочий процесс, замаскированный под служебные задачи форматирования кода и проверки безопасности. Собранное сжимается, шифруется и отправляется на внешний узел. Тот же канал используется для получения команд, а отдельное подключение позволяет открыть оболочку на заражённой машине.
Риск не ограничен одним пакетом. @subql/common - общая зависимость, поэтому уже выпущенные версии утилиты командной строки, сервиса запросов и узлов для отдельных блокчейнов могут подтянуть заражённый выпуск без нового релиза самих этих пакетов. Проверка 77 найденных пакетов SubQuery выявила 19 актуальных версий с потенциальным путём к проблемной библиотеке: 16 напрямую и три через промежуточные зависимости. Диапазоны версий в родительских пакетах допускают установку 5.8.3. Жёсткое закрепление версии такого пакета само по себе зависимости не фиксирует.
Публикации предшествовала работа на временной ветке репозитория. Сначала появился коммит, заменивший рабочий процесс выпуска на короткий сценарий ручного запуска, и вышла предрелизная сборка с пометкой о безвредной проверочной публикации. Затем ветка была удалена, создана заново и получила второй коммит. Он менял номер версии и добавлял шаг, который скачивал готовый архив с внешнего узла и подменял им исходный код библиотеки непосредственно перед отправкой в реестр. Проверки подписи или контрольной суммы архива в этом шаге не было. Оба коммита неподписаны, а основная ветка репозитория на момент разбора оставалась на общем предке. Называть произошедшее вредоносным изменением основной ветки было бы преувеличением. Сообщение о находке отправлено в репозиторий SubQuery с просьбой к сопровождающим разобраться.
Версию 5.8.3 нужно исключить из разрешения зависимостей, включая транзитивные пути и файлы блокировки. Если пакет успели установить со включёнными сценариями установки или хотя бы импортировать, затронутые машины и рабочие узлы изолируют, сохраняют данные о процессах и сетевых соединениях и пересобирают из доверенных образов. Простое удаление пакета уже запущенный процесс не остановит. Далее меняют учётные данные, доступные затронутому окружению: токены непрерывной интеграции, ключи облачных сервисов, доступы к GitHub, npm, SSH, Kubernetes и хранилищам секретов. Внешний узел, через который доставлялся архив и уходили данные, блокируют на периметре и в средствах фильтрации трафика. Полезно просмотреть журналы доступа к облачным секретам и события создания и удаления рабочих процессов GitHub, а также проверить ветки и артефакты, похожие на служебные. В отчёте приведены контрольные суммы заражённого архива и загрузчика - они помогут точнее определить, попадал ли этот код в инфраструктуру.