В релизах OVHcloud CLI на 94 минуты подменили архивы

Злоумышленник заменил архивы в пяти существующих релизах командной утилиты OVHcloud CLI — v0.11.0–v0.15.0. Вредоносные файлы были доступны на GitHub до 94 минут, с 12:47 до 14:21 UTC 19 октября, и затрагивали macOS, Linux x86_64 и arm64, а также Windows x86_64.
OVHcloud сообщила, что захвачен был аккаунт контрибьютора. Исходный код, теги релизов и конвейер сборки не менялись: злоумышленник загрузил скомпилированную Go-сборку поверх архивов, опубликованных с апреля по сентябрь. Целью сборки была кража секретов, хранящихся на диске машины, где она запускалась.
Какие способы установки оказались рискованными
Риск касался только тех, кто загрузил или обновил CLI в указанное окно. В частности, это официальный установочный скрипт, скачивание архива со страницы GitHub Releases, CI-задачи без закреплённого хеша и команда обновления самой утилиты в некоторых ручных установках на macOS и Linux.
В версии v0.15.0 атакующий заменил шесть файлов: архивы для macOS, Linux и Windows на поддерживаемых платформах, а также checksums.txt. Поэтому опубликованные контрольные суммы соответствовали уже подменённым бинарным файлам. Архивы для Linux i386, Windows i386 и arm64, а также WebAssembly-сборки не затрагивались.
Homebrew не входил в число уязвимых путей: используемый в тот момент cask содержал исходные SHA-256, поэтому менеджер пакетов должен был отклонить несовпадающую загрузку. Не пострадали и установки через go install, самостоятельная сборка из исходного кода и Docker-образ, который не пересобирался в период инцидента.
Как проверить и что предпринять
OVHcloud считает скомпрометированными релизы v0.11.0–v0.15.0, тогда как v0.10.0 названа чистой. Установка, выполненная до 12:47 UTC 19 октября и не обновлявшаяся в период подмены, содержит исходный файл. Подозрительный бинарник не следует запускать ради проверки: сведения о Go-сборке можно извлечь командой go version -m без исполнения файла.
Для вредоносной Linux arm64-сборки v0.15.0 исследователи указали псевдоверсию v0.15.1-0.20261013083505-5ead8ef9b43d+dirty, коммит 5ead8ef вместо 760fd72, на который указывает тег v0.15.0, и параметр -ldflags="-s -w". При этом признак +dirty сам по себе не доказывает заражение: он присутствует и в чистой версии v0.16.0.
Компания удалила подменённые вложения и вечером выпустила v0.16.0 как неизменяемый релиз с аттестацией. GitHub не позволяет менять файлы такого релиза. Проверить скачанный архив можно через gh release verify-asset v0.16.0 FILE.
Почему подмена стала возможной
GitHub позволяет пользователю с правами записи удалить файлы, прикреплённые к релизу, и загрузить новые с теми же именами, если для релиза не включена неизменяемость. URL скачивания при этом не меняется. OVHcloud не активировала эту настройку для прежних релизов; после инцидента опцию включили.
Компания не раскрыла, какие именно файлы читала вредоносная программа, куда она отправляла данные и сколько копий успели скачать. Если подозрительная сборка запускалась или её происхождение нельзя подтвердить, бизнесу следует считать все доступные ей секреты раскрытыми: сначала сменить их с другой машины, затем удалить бинарник и установить v0.16.0. Простое обновление программы не отзывает уже скопированные ключи.

