Атака на цепочку поставок Rust затронула crate arrayref и связанные пакеты
Команда безопасности Rust сообщила об атаке на инфраструктуру crates.io - официального каталога библиотек и компонентов для проектов на Rust. Злоумышленники опубликовали вредоносные версии нескольких пакетов, включая популярный crate arrayref. Инцидент представляет интерес для всех разработчиков, которые используют сторонние зависимости и автоматическую сборку приложений.
Проблема стала известна 20 августа после сообщения о подозрительном пакете proc-macro1. Проверка показала, что его скрипт сборки загружал вредоносную полезную нагрузку во время компиляции. Такой подход особенно опасен: разработчик может не заметить угрозу при обычном добавлении зависимости, поскольку вредоносный код запускается не непосредственно в приложении, а на этапе его построения.
В ходе расследования специалисты обнаружили и удалили несколько пакетов с похожими названиями: proc-macro-en, aovine, arone, aronenao и tinymember. Все версии этих компонентов следует считать небезопасными. Позднее выяснилось, что атака на цепочку поставок Rust arrayref 0.3.10 была организована через публикацию скомпрометированной версии широко используемой библиотеки arrayref.
Версия arrayref 0.3.10 получила зависимость от вредоносного proc-macro1. Одновременно с этим легитимные версии arrayref были отозваны, или yanked, что могло направить пользователей к заражённому релизу. Таким образом, разработчики, обновлявшие пакет в обычном порядке, могли получить опасную версию без явных признаков компрометации.
Rust Security Response Team оперативно удалила arrayref 0.3.10 и вернула в каталог ранее отозванные безопасные версии. Пострадали также два других пакета того же сопровождающего - internment и append-only-vec. Скомпрометированные релизы этих библиотек удалили, а учётную запись автора на crates.io временно заблокировали для предотвращения дальнейшего распространения угрозы.
Подробное описание инцидента и перечень затронутых релизов опубликованы в материале о компрометации crate arrayref и атаке на цепочку поставок Rust. При этом специалисты не считают, что автор arrayref намеренно участвовал во взломе. Наиболее вероятным сценарием называется компрометация компьютера сопровождающего или кража его учётных данных. Команда безопасности пытается связаться с разработчиком, чтобы уточнить обстоятельства произошедшего.
Опасные пакеты находились в открытом доступе ограниченное время, однако этого оказалось достаточно для потенциального заражения локальных окружений. Версия arrayref 0.3.10 была доступна 86 минут, internment 0.8.7 - около 90 минут, а append-only-vec 0.1.9 - 107 минут. Нельзя исключать, что за этот период некоторые проекты успели автоматически загрузить указанные зависимости через CI/CD-системы.
Для пользователей важна не только уязвимость crate arrayref Rust, но и сам механизм атаки. В отличие от ошибки в коде библиотеки, вредоносная публикация может выполнять действия на машине разработчика, в процессе сборки или внутри инфраструктуры непрерывной интеграции. Если сборка обладает доступом к переменным окружения, токенам публикации, закрытым репозиториям или облачным ресурсам, последствия могут выйти далеко за пределы одного приложения.
Разработчикам следует проверить lock-файлы, локальные кэши Cargo и журналы сборочных систем. Особое внимание нужно уделить проектам, которые использовали arrayref, internment, append-only-vec или любой из перечисленных подозрительных пакетов в период их доступности. Также рекомендуется пересобрать приложения в чистом окружении, обновить секреты CI/CD и проверить историю публикаций артефактов.
Инцидент наглядно показывает, насколько важна безопасность зависимостей Rust crates.io. Даже проект с хорошей репутацией может стать частью атаки, если злоумышленник получает доступ к аккаунту сопровождающего. Поэтому одной проверки исходного кода недостаточно: необходимо контролировать изменения версий, подписи и хэши, поведение build-скриптов, права пакетов и сетевую активность во время компиляции.
Практика, которую можно назвать проверкой вредоносных пакетов Rust, должна включать автоматическое сканирование зависимостей, фиксацию версий в Cargo.lock, регулярный аудит транзитивных компонентов и запрет сборочным процессам на лишний доступ к секретам. В крупных организациях полезно использовать внутренние зеркала crates.io и предварительно разрешать новые версии после анализа.
Для защиты Rust-проектов от supply chain атак также стоит разделять окружения разработки, тестирования и выпуска, ограничивать права токенов и включать оповещения о неожиданных изменениях зависимостей. Обновления желательно проводить постепенно, проверяя diff lock-файла и фактический состав загружаемых компонентов.
О случившемся сообщила исследовательская команда Nextron Systems GmbH, которая первой обнаружила подозрительную активность и передала информацию специалистам Rust. Своевременное удаление пакетов снизило масштаб угрозы, однако разработчикам всё равно необходимо самостоятельно проверить свои системы: удаление релиза из каталога не отменяет его возможное присутствие в кэшах, контейнерах и уже собранных артефактах.

