Крейт Rust запустил вредоносное ПО во время компиляции. 86 минут.
Крейт Rust с четырьмя макросами и 260 миллионами загрузок добавляет одну зависимость, и `cargo build` запускает бинарник незнакомца на вашей машине.
Крейт Rust с четырьмя макросами и 260 миллионами загрузок добавляет одну зависимость, и `cargo build` запускает бинарник незнакомца на вашей машине. 20 августа 2026 года: arrayref 0.3.10 появляется на crates.io, зависящий от proc-macro1 — не proc-macro2, настоящего — чей скрипт сборки загружает полезную нагрузку, помещает ее в /tmp/rust-setup и запускает ее в фоновом режиме, пока ваш проект компилируется. Чистые версии удалены, поэтому собственное предупреждение Cargo направляет вас к зараженной версии. 86 минут спустя она удаляется.
Читать письменное издание (на английском) ↗
Что освещается в этом видео
- cargo build запускает бинарник незнакомца
- Доказательства: Rust Blog, SafeDep, Hacker News
- Это The Daily Diff, посмертный анализ
- Хронология: 02:11 подготовка → 07:15 опубликовано → 08:41 удалено
- Механизм: build.rs, без песочницы, приманка yank
Переведенная стенограмма
Переведено с оригинального английского повествования. Доступные аудио и субтитры контролируются YouTube.
cargo build запускает бинарник незнакомца
0:00 Крейт Rust с четырьмя макросами и четвертью миллиарда загрузок добавляет одну зависимость, и cargo build запускает бинарник незнакомца на вашей машине. 20 августа 2026 года. arrayref 0.3.10 появляется на crates.io, зависящий от proc-macro1. Не proc-macro2, настоящий: отличается на одну цифру, и его скрипт сборки запускает полезную нагрузку, пока ваш проект компилируется. Команда безопасности Rust удаляет его 86 минут спустя.
Доказательства: Rust Blog, SafeDep, Hacker News
0:22 SafeDep публикует разбор. Hacker News: 554 балла. Как это происходит, почему Cargo это допускает, и кто виноват. Это The Daily Diff, посмертный анализ. Два часа ночи, UTC.
Это The Daily Diff, посмертный анализ
0:33 Аккаунт под названием d-tolney, на одну букву отличающийся от David Tolnay, который поддерживает половину Rust, публикует proc-macro1 1.0.106: настоящий
Хронология: 02:11 подготовка → 07:15 опубликовано → 08:41 удалено
0:41 proc-macro2, переименованный. В стадии подготовки. 07:11. Версия 1.0.107 добавляет скрипт сборки, плюс base64, TLS и HTTP-клиент. Для парсера токенов. 07:15. Аккаунт сопровождающего переиздает arrayref как 0.3.10 и отменяет все старые версии. Cargo печатает: рассмотрите возможность обновления до версии, которая не отменена. Единственная оставшаяся — зараженная.
1:02 Предупреждение — это приманка. В ту же минуту фирма по безопасности сообщает об этом Rust. 07:54, проблема в RustSec. 08:29, проблема в репозитории; злоумышленник отвечает 0.3.11 и второй вредоносной зависимостью. 08:41, удалено. Восемьдесят шесть минут. Почему? Первое: Cargo собирает каждую объявленную зависимость, вызванную или нет. Одной строки манифеста достаточно.
1:21 Второе: скрипт сборки запускается на вашей машине, от вашего имени, с вашими SSH-ключами и токеном cargo,
Механизм: build.rs, без песочницы, приманка yank
1:26 прежде чем ваш код скомпилируется. Без песочницы, по замыслу: так крейты находят C-библиотеки. Третье: внутри настоящий proc-macro2, поэтому сборка проходит успешно. Полезная нагрузка: TLS-клиент, который доверяет любому сертификату, получает бинарник, помещает его в /tmp/rust-setup и запускает его в фоновом режиме. В Windows он обходит job object Cargo через wscript; так говорится в комментарии к исходному коду. Вторая стадия, согласно ветке RustSec: инструмент удаленного доступа, нацеленный на
1:52 браузеры и криптокошельки. Поэтично, поскольку крупнейшие пользователи arrayref включают secp256k1 и Solana. git blame. Модель Cargo, пятьдесят пять процентов: зависимости запускают код на вашей машине во время компиляции, без песочницы, и предупреждение yank направляло людей к
git blame — разделение
2:07 яду. Один аккаунт, тридцать: одна учетная запись переиздает крейт, которому доверяет четверть миллиарда загрузок. Цифра один, пятнадцать: одно нажатие клавиши от самого доверенного крейта Rust, и никто не читает дерево. Радиус поражения: 2 285 загрузок за 86 минут. Менее десяти процентов трафика, потому что большинство lockfile содержали 0.3.9. crates.io говорит, что нет доказательств использования.
Радиус поражения: 2 285 загрузок
2:27 Два человека в ветке RustSec не согласны; один находит службу systemd. На Hacker News главная ветка не о вредоносном ПО. Это страница крейта, где 0.3.10 теперь никогда не существовало. Вердикт, посмертный анализ: NEEDS REVIEW. Восемьдесят шесть минут на удаление, блог-пост в тот же день, аккаунт заблокирован: эта часть — SHIP IT. Но страница крейта показывает, что ничего не произошло, cargo audit молчит о кэшированной
Вердикт + понедельничная линия
2:48 копии, а скрипты сборки по-прежнему запускаются от вашего имени. Понедельник: запустите команду поиска из блога Rust и относитесь к предупреждению yank как к вопросу, а не к инструкции. Присылайте мне инцидент, о котором вам до сих пор не разрешено говорить, в комментариях или на daily diff dot dev. И это весь diff на сегодня. Я Нико из Axrisi. Объединяйте ответственно.
Источники
- Rust Blog, "Supply chain attack on arrayref" (security-response, Aug 20, 2026)blog.rust-lang.org
- RUSTSEC-2026-0260 (arrayref)github.com
- RustSec issue #3161 (the original report, IOCs, victims)github.com
- SafeDep technical analysissafedep.io
- GitHub issue on the repo (0.3.11 spotted)github.com
- crates.iocrates.io
- Hacker News (554 points)news.ycombinator.com
- BleepingComputerwww.bleepingcomputer.com



