Rust-атака на crates.io: вредонос в трёх популярных крейтах с 245 млн загрузок

Команда 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