Rust 1.100 ще въведе опционални периоди на изчакване за сигурност (security cooldowns) в Cargo, предоставяйки на разработчиците възможност да забавят интегрирането на наскоро публикувани зависимости в своите проекти.
Планирана за 12 ноември 2026 г., новата версия цели да даде време на екипите по сигурност и поддръжниците на пакети да открият злонамерени обновления, преди автоматизираните процеси по изграждане да ги изтеглят.
Функционалността е достъпна в бета версия, но все още не е достигнала до стабилното издание на Rust. Нейният период на изчакване по подразбиране остава нула, така че самото обновяване няма автоматично да активира защитата. Екипите трябва изрично да зададат минимална възраст на пакетите, за да намалят излагането на риск през критичните часове след появата на ново издание.
Изследователи от Socket.dev документираха зловредния пакет (crate) proc-macro1, стоящ зад инцидент от август, засегнал arrayref, internment и append-only-vec.
Неговият скрипт за компилиране изтегляше злонамерен код, показвайки как една доверена зависимост може да внесе зловреден софтуер в системите на разработчиците без видими промени в кода на самото приложение.
Rust 1.100 въвежда периоди на изчакване за сигурност в Cargo
Трите компрометирани издания са останали в crates.io съответно за 86, 90 и 107 минути преди да бъдат премахнати, според екипа за реагиране на инциденти по сигурността на Rust, цитиран от Socket.
Всички те са изчезнали в рамките на два часа, но автоматичните обновления все пак са могли да достигнат до работните станции на разработчиците и системите за непрекъсната интеграция (CI), преди защитниците да са успели да ги анализират.
По време на инцидента атакуващите са добавили вредоносна зависимост към иначе доверени пакети. Докладите за компрометираните издания на пакети в Rust обясняват как Cargo е изпълнил зловредния скрипт по време на компилация, което е позволило изпълнение на код още преди разработчиците да са използвали засегнатата библиотека.
Това превръща избора на зависимости в стратегическо решение за сигурност, а не просто в рутинна поддръжка. Работата по периода на изчакване започна още преди тази атака. Проследяващият проблем (tracking issue) беше отворен на 18 май, а nightly версията на Cargo получи поддръжка на 21 юни.
Промяната за стабилизиране беше обединена на 28 август, като функционалността е включена за Rust 1.100 в предварителните бележки по изданието.
Как работи периодът на изчакване
Разработчиците могат да активират седемдневен период на изчакване в .cargo/config.toml, като зададат global-min-publish-age = "7 days" под секцията [registry].
Cargo приема периоди, изразени в секунди, минути, часове, дни, седмици или месеци. Правилото incompatible-publish-age по подразбиране е настроено на "deny", така че екипите обикновено не се нуждаят от допълнителна конфигурация на механизма за разрешаване на зависимости (resolver).
Когато Cargo подбира зависимости, инструментът изключва издания, които са по-нови от зададения лимит. Той може да избере по-стара версия, която отговаря на изискванията на проекта. Ако нито една не отговаря, процесът по разрешаване на зависимости се прекратява с грешка, вместо да се приеме съвсем ново издание само за да се завърши изграждането.
Това стриктно поведение адресира специфичен риск: киберпрестъпниците биха могли да публикуват зловреден софтуер и да оттеглят безопасните версии, принуждавайки по-либерална политика да избере компрометираното обновление.
По време на инцидента през август нападателите оттеглиха легитимни версии на arrayref. Cargo също така докладва за пропуснатите версии и тяхната възраст, помагайки на разработчиците да разберат кои обновления са блокирани.
Този подход споделя обща цел със защитата чрез изчакване в GitHub Dependabot, която забавя рутинните обновления на версиите. Cargo обаче поставя проверката за възраст директно в процеса на подбор на зависимости, вместо да разчита единствено на външен автоматизиран бот.
Cargo запазва версиите, които вече са записани в Cargo.lock, дори когато тяхната възраст е под праговата стойност. Следователно активирането на периода на изчакване няма да премахне злонамерено издание, което вече е фиксирано в проекта. Функционалността също така изключва cargo install, зависимости от Git, локални пътища и регистри без времеви отпечатъци за публикуване.
За спешни корекции разработчиците могат да изпълнят CARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE=allow cargo update -p some-crate --precise 1.2.3, замествайки примерния пакет и версия.
Това изключение важи за конкретната команда, включително за непреките зависимости, които тя разрешава. След като бъдат записани в заключващия файл (lockfile), тези версии остават използваеми при нормални настройки.
Периодът на изчакване печели време; той не сканира кода и не гарантира безопасност. По-ранни злонамерени Rust библиотеки за регистриране на събития (logging) крадяха ключове от криптопортфейли, като същевременно поддържаха стандартните си функции, показвайки защо познатото поведение не може да бъде критерий за доверие. Зловреден код, който успее да остане неоткрит, може просто да надживее периода на изчакване.
Socket обърна внимание и на предупреждение от септември относно атакуващи, насочени срещу членове на Rust проекти и собственици на пакети чрез фалшиви предложения за работа и проекти. Киберпрестъпниците са организирали видеоразговори, след което са се опитвали да убедят жертвите да инсталират софтуер или да изпълнят определени команди.
Тази кампания подчертава проблема със сигурността на потребителските акаунти, стоящ зад отравянето на софтуерни пакети: забавянето на обновленията не спира престъпниците да откраднат достъпа, използван за публикуване на злонамерен код.
Индикатори за компрометиране (IoCs):-
| Тип | Индикатор | Докладвана роля |
|---|---|---|
| Зловреден пакет (crate) | proc-macro1 | Скриптът за компилиране изтегля зловреден код |
| Компрометиран пакет (crate) | arrayref | Пренася зловредна зависимост |
| Компрометиран пакет (crate) | internment | Пренася зловредна зависимост |
| Компрометиран пакет (crate) | append-only-vec | Пренася зловредна зависимост |
| SHA хешове | Не са публикувани | Няма предоставени стойности |
Забележка: IP адресите и домейните умишлено са обезвредени (напр. [.]), за да се предотврати случайно разрешаване или създаване на хипервръзки. Възстановете оригиналния им вид само в рамките на контролирани платформи за разузнаване на заплахи като MISP, VirusTotal или вашата SIEM система.