Команда Rust Project удалила вредоносные версии трёх широко используемых крейтов из реестра crates.io. Атака на цепочку поставок началась после того, как скомпрометированный аккаунт мейнтейнера опубликовал релизы, добавлявшие зависимость-типосвоттинг, чей build-скрипт загружал и запускал удалённую нагрузку во время компиляции.
Затронуты версии arrayref 0.3.10, internment 0.8.7 и append-only-vec 0.1.9. Все они были опубликованы с одного аккаунта владельца 20 августа 2026 года и удалены в течение 86–107 минут.
Как работает атака
Вредоносный код находился в build-скрипте внедрённой зависимости. Это означает, что для запуска нагрузки было достаточно собрать проект, который разрешил эту зависимость, — вызывать что-либо из самих крейтов не требовалось.
Каждый скомпрометированный релиз содержал в манифесте одну добавленную строку — зависимость от крейта proc-macro1, типосвоттинга повсеместно используемого proc-macro2. Исходный код библиотеки proc-macro1 был точной копией proc-macro2, поэтому сборка проходила нормально и не вызывала подозрений.
Build-скрипт реконструировал адрес хоста с нагрузкой и C2-сервера из фрагментов base64 во время сборки. Затем он устанавливал собственный сертификат, чьи три метода проверки безусловно возвращали успех, отключая проверку TLS. Далее скрипт выбирал одну из четырёх нагрузок в зависимости от операционной системы и архитектуры CPU.
На Unix и macOS он записывал байты в /tmp/rust-setup, делал файл исполняемым и запускал его отсоединённым процессом с адресом C2 в качестве первого аргумента. На Windows он записывал PowerShell-скрипт в %TEMP% и запускал его скрытно через VBScript-лаунчер под wscript.exe, а затем покидал дочерний процесс — шаг, закомментированный в исходном коде как побег из job-объекта Cargo, чтобы сборка не ждала его завершения.
Доставка через «совет» Cargo
Доставка опиралась на то, что аккаунт владельца в ту же минуту, что и вредоносную публикацию, отозвал (yanked) версии arrayref 0.3.5–0.3.9. В результате скомпрометированный релиз оставался единственной версией, на которую Cargo не выдавал предупреждение.
«Доставка: 0.3.5–0.3.9 все отозваны под аккаунтом владельца, поэтому предупреждение cargo "consider updating to a version that is not yanked" — это приманка. Так я на это и наткнулся», — рассказал репортёр, пользователь GitHub jhobern.
Масштаб и цепочка зависимостей
По данным API crates.io, у arrayref 245 385 500 загрузок за всё время и 53 905 601 за 90 дней до 20 августа. На него зависят 403 различных крейта в crates.io.
Проверка цепочки зависимостей подтвердила: winit требует sctk-adwaita ^0.10.1, который требует tiny-skia ^0.11, который требует arrayref ^0.3.6. Каждое требование — это caret-диапазон на 0.3.x, а caret-диапазон на 0.3.x принимает 0.3.10.
Та же проверка показала, что blake3 объявлял arrayref зависимостью до версии 1.8.6 и убрал её в 1.8.7, опубликованной в 09:09 UTC 20 августа. Крейты blake2b_simd и blake2s_simd убрали ту же зависимость в релизах, опубликованных в 09:25 и 09:26 того же утра.
Имплант второй стадии
Имплант второй стадии связывается по HTTPS POST с путём /49890878, сохраняется через ключ реестра Run на Windows, LaunchAgent на macOS и systemd user service на Linux. Он поддерживает четыре команды: завершение работы, перенастройка C2, установка персистентности и загрузка с запуском дополнительных скриптов.
По данным компании Wiz, имплант крадёт учётные данные браузеров Chrome, Brave и Edge, запрашивая SQLite-базы логинов. Анализ исследователей Nextron показал, что проанализированный Windows-имплант запрашивает только колонки origin_url и username_value и не извлекает напрямую password_value. Однако этот анализ покрывал только Windows-нагрузку; Linux и macOS нагрузки были захэшированы и не анализировались. Тот же анализ отмечает, что крейт может быть запущен командами cargo build, cargo check и cargo test.
Индикаторы компрометации
StepSecurity опубликовала следующие индикаторы компрометации (IoCs):
- Сеть:
23.254.165.112:9089(хост с нагрузкой),23.254.165.112:443(C2),hwsrv-798836.hostwindsdns.com - Файлы:
/tmp/rust-setup,%TEMP%\rust-setup.ps1,%TEMP%\rust-setup-launch.vbs - Бинарники:
rust-crate_0.1.0,_0.2.0,_0.3.0,_0.4.0 - Аккаунты:
dtolney(crates.io id 438608, имитатор),droundy(легитимный владелец, предположительно скомпрометирован) - Email:
rchaitm@gmail.com(поддельные метаданные автора)
Кто стоит за атакой
Wiz заявила, что инфраструктура существенно пересекается с недавними северокорейскими атаками на цепочки поставок, назвав npm-компрометацию Mastra и компрометацию axios. Microsoft с высокой уверенностью атрибутирует активность Mastra группе Sapphire Sleet, а Google Threat Intelligence Group (GTIG) атрибутировала компрометацию axios актору, отслеживаемому как MIDNIGHT NEPTUNE (ранее UNC1069). Ни один вендор не атрибутировал инцидент с crates.io конкретному актору.
Защита и рекомендации
Разработчикам рекомендуется проверить каталог ~/.cargo/registry/cache на удалённые файлы крейтов и закрепить arrayref на версии 0.3.9 или более ранней. Rust Security Response Team сняла пометку «yanked» с вредоносных версий во время реагирования, чтобы предупредить разработчиков.
Патченной версии не существует, CVE-идентификатор не присвоен, а RustSec-адавизори для всех трёх крейтов не фиксируют доказательств использования вредоносных версий.
Rust Security Response Team сообщила, что получила отчёт о вредоносности крейта proc-macro1 в 07:15 UTC 20 августа и подтвердила, что крейт содержит build-скрипт, загружающий вредоносную нагрузку. В отчёте благодарится исследовательская команда Nextron Systems GmbH за первоначальное обнаружение. «Мы не считаем, что автор arrayref действовал злонамеренно, но его компьютер или учётные данные, вероятно, скомпрометированы, и мы пытаемся связаться с ним», — заявила команда.
Как был скомпрометирован аккаунт, не раскрывается. The Hacker News подтвердила через API crates.io 21 августа, что единственным указанным владельцем arrayref является пользователь 2402, David Roundy, зарегистрированный в октябре 2009 года.
Уроки для экосистемы
Cargo не имеет встроенного механизма «охлаждения» для новых публикаций. Pull request, стабилизирующий настройку global-min-publish-age, которая удерживала бы зависимости младше заданного возраста, вступил в финальный период комментариев 18 августа — за два дня до атаки — и оставался открытым и неслитым по состоянию на 21 августа. GitHub выпустил подобную настройку охлаждения по умолчанию для Dependabot в июле.
В сентябре 2025 года два вредоносных крейта, имитировавших библиотеку логирования, исполнялись только во время выполнения — это отличие crates.io отметила тогда.
Частые вопросы
Как проверить, не затронул ли меня вредонос?
Проверьте каталог ~/.cargo/registry/cache на наличие файлов удалённых версий arrayref 0.3.10, internment 0.8.7 и append-only-vec 0.1.9. Если они есть, удалите их и пересоберите проект с закреплённой безопасной версией arrayref 0.3.9 или более ранней.
Какие версии крейтов затронуты?
Затронуты arrayref 0.3.10, internment 0.8.7 и append-only-vec 0.1.9. Все они были опубликованы 20 августа 2026 года и удалены в течение 86–107 минут.
Есть ли патч для уязвимых версий?
Патченной версии не существует. Рекомендуется закрепить arrayref на версии 0.3.9 или более ранней, которая не содержит вредоносного кода.
Как вредонос попадает в систему?
Вредоносный код находится в build-скрипте зависимости proc-macro1, которая добавляется в манифест скомпрометированных версий. При сборке проекта, разрешающего эту зависимость, build-скрипт загружает и запускает удалённую нагрузку.
Какие данные крадёт вредонос?
По данным Wiz, имплант второй стадии крадёт учётные данные браузеров Chrome, Brave и Edge, запрашивая SQLite-базы логинов. Анализ Nextron показал, что Windows-имплант запрашивает только колонки origin_url и username_value.
Кто стоит за этой атакой?
Ни один вендор не атрибутировал инцидент конкретному актору. Wiz отмечает, что инфраструктура существенно пересекается с недавними северокорейскими атаками на цепочки поставок, включая npm-компрометацию Mastra и компрометацию axios.
Что делать, если я использовал затронутые версии?
Проверьте систему на индикаторы компрометации, опубликованные StepSecurity, включая файлы /tmp/rust-setup, %TEMP%\rust-setup.ps1 и %TEMP%\rust-setup-launch.vbs. При обнаружении следов вредоноса обратитесь к специалистам по реагированию на инциденты. Подобные атаки на цепочки поставок, как инцидент с AI-агентом OpenAI, показывают, что вредонос может распространяться через доверенные каналы и компоненты.
Затронуты ли российские проекты?
Информации о конкретных российских проектах нет. Однако учитывая, что на arrayref зависят 403 крейта, включая такие популярные, как winit и blake3, риск для любых проектов, использующих эти зависимости, существует. Проверьте свои проекты на наличие затронутых версий. Опыт прошлых инцидентов, например уязвимость в GitLab через парсер Oj, показывает, что атаки на зависимости затрагивают широкий круг проектов.
Источник: thehackernews.com