Подменённые сборки OVHcloud CLI с похитителем учётных данных оставались доступны 94 минуты

Подменённые сборки OVHcloud CLI с похитителем учётных данных оставались доступны 94 минуты

19 октября 2026 года в пяти опубликованных релизах официального CLI OVHcloud с v0.11.0 по v0.15.0 появились подменённые бинарные файлы. Вместо обычных сборок на те же адреса загрузили похититель учётных данных. Теги не перемещали, конвейер сборки не запускался, исходный код не менялся. Файлы собрали на стороне и загрузили поверх существующих релизов, поэтому формально выпуски остались прежними.

Описание

Подмена стала возможна из-за отключённой неизменяемости релизов: аккаунт с правом записи мог заменить файлы в выпуске, вышедшем месяцами ранее, сохранив прежние адреса. По данным опубликованного разбора, вся замена заняла около 25 минут. Сначала обновился релиз v0.15.0, затем его файл контрольных сумм, следом более старые версии. Контрольные суммы переписали последними, поэтому опубликованные значения совпадали с подменёнными файлами и проверка по ним ничего не выявляла.

Подмену заметил клиент, чей конвейер сверяет хеш-сумму архива для Linux arm64 с закреплённым заранее значением. Сборка не сошлась, а разбор метаданных сборки описан в обращении к репозиторию. Через 94 минуты после первой загрузки, в 14:21, OVHcloud удалил подменённые файлы. В 17:16 того же дня вышел релиз v0.16.0 с неизменяемым набором файлов и аттестацией сборки. OVHcloud сообщила о примерно 250 скачиваниях за это время и оценивает хосты, где запускали такие файлы, как скомпрометированные.

Цепочка началась почти за год до подмены. 20 октября 2025 года разработчик установил на личный MacBook расширение редактора color-picker-universal версии 2.8.91; расширение поставило постоянную службу Node.js и связалось с внешним узлом. OVHcloud считает корпоративный ноутбук незатронутым, а загрузки объясняет украденными ключами. В марте 2026 года в четырёх личных репозиториях того же аккаунта принудительно перезаписали историю и спрятали в скриптах установки загрузчики GlassWorm с управлением через блокчейн Solana. За четыре дня до подмены аккаунт удалил ветки с именами, похожими на проверку конвейера.

Воспроизведение шло в изолированной сети на копии страницы релизов: установочный скрипт скачал архив из последнего релиза, распаковал его и ни разу не сверил контрольные суммы. Через четыре секунды после запуска сборка прочитала 18 путей к файлам с учётными данными и упаковала собранное в архив объёмом 1949 байт. Затем архив ушёл на внешний узел в виде JSON, похожего на запрос к сети Solana. В перечне целей - хранилища учётных данных ИИ-агентов, ключи AWS, GCP, Azure и doctl, конфигурации Docker, Kubernetes и Terraform, токены NPM, SSH-ключи и настройки git. Каждый следующий запуск повторял сбор заново.

Реплей разошёлся с частью публичных описаний. Установочный скрипт никогда не предлагал сборку для arm64 Linux: имя файла собиралось из машинной архитектуры, файла с таким именем в релизах не было, и установка завершалась ошибкой. Homebrew не был путём заражения, поскольку рецепт фиксирует хеш-суммы по архитектурам и отклонил бы подменённый файл. Между тем опубликованные перечни затронутых способов установки включали оба этих пути. Признак подмены тоже не однозначен: локальная сборка без флага версии печатает вместо номера служебное слово undefined, поэтому сам по себе такой вывод заражение не доказывает.

Отдельно проверили загрузчик GlassWorm. Файл восстановили из коммита, оставшегося доступным после отката истории 21 октября, и запустили в изолированной среде против управляющего канала в блокчейне Solana. Видимыми в файле остаются 181 байт, остальное - невидимые символы-селекторы, которые декодируются в обёртку с ключом AES. Вторая стадия ждёт десять секунд, завершается при русской локали или часовом поясе и опрашивает девять публичных узлов сети Solana в поисках примечания к транзакции со ссылкой на следующую стадию. Если недоступен только управляющий адрес, загрузчик продолжает опрос без сбоев; если недоступны все девять узлов, он падает с ошибкой в журнале Node.js.

Сейчас управляющий адрес неактивен: список транзакций пуст, что согласуется с прекращением работы четырёх каналов GlassWorm 26 мая 2026 года при участии CrowdStrike. Машины с оставшимся загрузчиком продолжают опрашивать канал, и владелец может включить его снова одной транзакцией. Для реальных загрузок CLI факт отправки данных не установлен: известно лишь, что набор собираемых файлов совпадает с описанным в публикации OVHcloud. Опубликованные хеш-суммы покрывают не все платформы, поэтому часть подменённых архивов осталась без проверенных значений.

Индикаторы компрометации

Комментарии: 0