Typosquatting в crates.io: вредоносные пакеты Rust запустили загрузчик
20 августа 2026 года в репозитории crates.io опубликовали вредоносные выпуски пакетов Rust arrayref и proc-macro1. Пакеты создали с использованием typosquatting, то есть подмены названия, рассчитанной на сходство с легитимными проектами.
В версии arrayref 0.3.10 появилась зависимость от proc-macro1 версии 1.0.107. Этот пакет имитировал легитимный proc-macro2. Его исходный код представлял собой механически переименованную копию оригинальной библиотеки. Благодаря этому проекты могли компилироваться в обычном режиме, пока вредоносное поведение оставалось скрытым.
Затронутые выпуски впоследствии удалили из crates.io.
Вредоносный код запускался во время компиляции
Компрометация была инициирована во время компиляции. Cargo собирает все объявленные необязательные зависимости, даже если родительский крэйт их не использует. Поэтому проекты, подключившие arrayref 0.3.10, также собирали proc-macro1 1.0.107 и выполняли его скрипт build.rs.
Скрипт использовал зависимости с функциями декодирования Base64, TLS и HTTP. С их помощью он загружал архитектурно-специфичный полезный груз с адреса 23.254.165.112:9089. Проверка TLS-сертификата была отключена. Адрес управления, переданный полезному грузу, составлял 23.254.165.112:443.
Поведение на разных платформах
На Linux, x86-64 macOS и ARM64 macOS скрипт выполнял следующие действия:
- записывал загруженный бинарный файл в
/tmp/rust-setup; - делал файл исполняемым;
- запускал его в фоновом режиме, отсоединённом от компилятора;
- передавал адрес C2 в качестве аргумента;
- перенаправлял стандартные потоки ввода, вывода и ошибок в null.
В Windows скрипт записывал PowerShell-полезную нагрузку и VBScript-загрузчик во временную директорию, после чего запускал их скрыто через wscript.exe.
Загрузчик был разработан для выхода из объекта задачи Cargo. Это позволяло процессу продолжать работу после завершения компиляции. Дескриптор дочернего процесса намеренно утекал, поэтому процесс не ожидал его завершения.
Как вредоносный пакет попал к пользователям
Вредоносная зависимость распространялась через arrayref после того, как версии с 0.3.5 по 0.3.9 были отозваны, то есть помечены как yanked. После этого Cargo предупреждал пользователей и отдавал предпочтение единственному неотозванному выпуску, версии 0.3.10.
arrayref широко используется транзитивно через такие пакеты, как tiny-skia, sctk-adwaita и winit. Поэтому кампания потенциально затронула проекты, использующие экосистемы графического интерфейса Rust, включая egui, eframe и iced.
Отчет получен из сервиса CTT Report Hub. Права на отчет принадлежат его владельцу.
Ознакомиться подробнее с отчетом можно по ссылке.



