Хакеры заразили крейты Rust с 245 млн скачиваний работающим при сборке вредоносном

изображение: grok
20 августа 2026 года неизвестный злоумышленник получил контроль над учётной записью разработчика на crates.io и выпустил заражённые версии трёх популярных Rust-библиотек с суммарным охватом в сотни миллионов загрузок. В код подмешали зависимость с обманчивым названием proc-macro1, чей скрипт сборки скачивал и запускал вредоносную программу прямо во время компиляции проекта. Опасные релизы продержались в репозитории от 86 до 107 минут, но за это время могли добраться до автоматических сборочных систем по всему миру.
Под удар попали arrayref 0.3.10, internment 0.8.7 и append-only-vec 0.1.9. Все три пакета опубликовали с одной учётной записи, после чего Rust Security Response Team удалила их из репозитория. Разработчику не требовалось вызывать функции заражённой библиотеки — достаточно было запустить cargo build, cargo check или cargo test, чтобы код внутри build script начал выполняться сам.
Механика заражения выглядит почти издевательски простой. В манифест каждой скомпрометированной библиотеки добавили ровно одну строку с зависимостью от proc-macro1, чьё название напоминает распространённый proc-macro2. Классический typosquat, рассчитанный уже не на пальцы разработчика, а на автоматический механизм разрешения зависимостей Cargo. Исходный код поддельной библиотеки почти повторяет настоящий proc-macro2, поэтому компиляция проходит без видимых проблем.
Настоящая неприятность спрятана в скрипте сборки. При запуске он собирает адрес сервера с нагрузкой и адрес командного центра из фрагментов, закодированных в Base64. После этого код отключает проверку TLS-сертификатов — все три процедуры верификации безусловно возвращают успешный результат. Дальше вредоносная часть определяет операционную систему и выбирает один из четырёх вариантов нагрузки.
Стоит обратить внимание, что старые версии arrayref с 0.3.5 по 0.3.9 злоумышленник заранее отметил как yanked практически в одну минуту с публикацией вредоносной 0.3.10. Cargo обычно предупреждает разработчика об отозванных версиях и предлагает обновиться — а обновление в этой ситуации вело прямо к заражённому релизу.
На Unix-системах и macOS данные записываются в /tmp/rust-setup, файл получает разрешение на запуск, после чего вредоносная программа стартует отдельно от процесса сборки. На Windows код сохраняет PowerShell-скрипт в %TEMP% и запускает его скрыто через VBScript и wscript.exe. В исходниках даже есть комментарий, объясняющий смысл манёвра — программа старается выбраться из job object Cargo, чтобы процесс сборки не ждал её завершения.
Индикаторы компрометации, которые уже опубликованы для разработчиков и администраторов:
- сетевой адрес 23.254.165.112 с портом 9089 для размещения нагрузки и портом 443 для командного управления;
- домен hwsrv-798836.hostwindsdns.com;
- файлы /tmp/rust-setup, %TEMP%rust-setup.ps1 и %TEMP%rust-setup-launch.vbs;
- бинарники rust-crate_0.1.0, rust-crate_0.2.0, rust-crate_0.3.0 и rust-crate_0.4.0;
- адрес автора rchaitm@gmail.com в поддельных метаданных.
Масштаб популярности заражённой библиотеки превращает эпизод в заметный инцидент для всей экосистемы Rust. По данным crates.io API, arrayref к 21 августа набрал 245 385 500 загрузок за всё время существования, а только за 90 дней до атаки — 53 905 601 раз. На crates.io обнаружилось 403 отдельных пакета, зависящих от arrayref прямо или через промежуточные компоненты.
Российские разработчики, использующие Rust в проектах для веб-серверов, встраиваемых систем или блокчейн-приложений, могли получить заражённый код через транзитивные зависимости — например, через цепочку winit → sctk-adwaita → tiny-skia → arrayref.
Вторая стадия импланта связывается с командным сервером через HTTPS POST-запрос по пути /49890878. Закрепление в системе организовано по-разному для каждой платформы:
- на Windows используется Registry Run key;
- на macOS создаётся LaunchAgent;
- на Linux вредоносная программа регистрирует пользовательский systemd-сервис;
- у импланта есть четыре команды для завершения работы, смены адреса управления, закрепления и загрузки скриптов.
Исследователи Wiz обнаружили функции для кражи данных браузеров Chrome, Brave и Edge — код обращается к SQLite-базам с сохранёнными учётными данными. Анализ Nextron Systems уточняет, что Windows-версия работала только с полями origin_url и username_value, но версии для Linux и macOS полноценному изучению пока не подвергались. Для российских пользователей это означает риск утечки логинов от корпоративных порталов, банковских кабинетов и облачных сервисов, если заражённая библиотека попала в сборочную среду.
Уточняется, что компания Wiz обнаружила существенное совпадение инфраструктуры этого инцидента с недавними атаками на цепочки поставок, которые связывали с Северной Кореей — компрометацией пакетов Mastra в npm и атакой на axios. Прямых оснований объявлять нынешнюю операцию северокорейской пока нет, но сходство почерка заслуживает внимания.
У Cargo на момент атаки не было штатного механизма задержки перед доверием к новым пакетам. Запрос на стабилизацию настройки global-min-publish-age, которая должна удерживать зависимости младше заданного срока, перешёл в финальную стадию обсуждения 18 августа — атака произошла через два дня, а pull request на 21 августа оставался открытым. У GitHub похожая функция для Dependabot была добавлена ещё в июле.
Ранее сообщалось, что киберпреступники перестали воспринимать ИИ как обычный генератор вредоносного кода и начали использовать его на всех этапах атак — от разведки до вывоза похищенных баз данных. Исследователи Gambit Security разобрали три кампании, в которых нейросети анализировали инфраструктуру жертв, отбирали наиболее ценные файлы и управляли уже начатыми взломами.
Эксперты CISOCLUB считают, что инцидент с arrayref окончательно ломает представление о безопасности сборочного конвейера. Раньше подозрительной считалась библиотека, которая пыталась украсть данные во время работы приложения, теперь опасность может скрываться значительно раньше — прямо на этапе установки и компиляции. Огромное число загрузок само по себе не превращает пакет в уязвимость, а короткое окно доступности заражённой версии не гарантирует массового заражения.
Но одна скомпрометированная учётная запись владельца популярной библиотеки становится мощным инструментом атаки. Российским командам разработки стоит проверить каталог ~/.cargo/registry/cache на наличие подозрительных файлов и внедрить практику ручной проверки свежих зависимостей перед их попаданием в производственные сборки.



