💀 Атака на Rust: 3 пакета с 245 млн загрузок заражены Вредоносный код выполнялся не при вызове функций пакета, а в скрипте сборки зависимости — достаточно было одного cargo build, cargo check или cargo test. Атакующий добавил в arrayref 0.3.10, internment 0.8.7 и append-only-vec 0.1.9 зависимость от proc-macro1 — пакета, имитирующего имя proc-macro2. Сборка проекта выбирала поддельный пакет, скрипт сборки скачивал и запускал вредоносную нагрузку с C2-адресом, составленным из base64-фрагментов. Легитимный владелец arrayref Дэвид Раунди не виноват: его аккаунт скомпрометировали. Версии удалили через 86–107 минут, но за это время атака прошла полный цикл. Механика доставки — отдельный урок. В ту же минуту, когда публиковалась вредоносная 0.3.10, аккаунт владельца пометил как отозванные все предыдущие версии 0.3.5–0.3.9. Cargo перестал предупреждать о старой версии — единственной неотозванной осталась 0.3.10. Плюс диапазон с символом ^0.3.6 принимает 0.3.10, а цепочка winit → sctk-adwaita → tiny-skia → arrayref используется минимум 403 пакетами. По данным hackernews, Microsoft связывает похожую активность с Sapphire Sleet, но атрибуции по crates.io пока нет. Второй стадии хватало для полноценной работы: HTTPS POST на /49890878, кража логинов из SQLite-баз Chrome, Brave и Edge, закрепление через ключ Run реестра, LaunchAgent и пользовательскую службу systemd. IoC от StepSecurity: 23.254.165.112:9089 (хост вредоносной нагрузки), /tmp/rust-setup, %TEMP%\rust-setup.ps1, исполняемые файлы rust-crate_0.1.0–0.4.0. Фиксация версий оказалась нелишней: blake3 убрал зависимость от arrayref в 1.8.7, blake2b_simd и blake2s_simd — в версиях тем же утром. Меня цепляет не сам троян, а разница в защите от новых угроз между npm и Cargo. GitHub ввёл задержку Dependabot для новых пакетов в июле. Функция global-min-publish-age находится на этапе финального обсуждения в Cargo с 18 августа — за два дня до атаки. 86 минут компрометации — это вечность, если считать в часах между публикацией и следующей сборкой CI. И да, ни один SAST-сканер не отметит сетевой вызов в скрипте сборки, если не проверяет происхождение зависимости. #Rust #supplychain #crates #SapphireSleet