Разработчики языка Rust предупредили о выявлении в репозитории crates.io пакета rustdecimal, содержащего вредоносный код. Пакет был основан на легитимном пакете rust_decimal и пользовался для распространения сходством в имени (тайпсквоттинг) с расчётом на то, что пользователь не обратит внимание на отсутствие символа подчёркивания, осуществляя поиск или выбирая модуль из списка.
Примечательно, что указанная стратегия оказалась успешной и по числу загрузок фиктивный пакет лишь немного отстал от оригинала (~111 тысяч загрузок rustdecimal 1.23.1 и 113 тысяч оригинального rust_decimal 1.23.1). При этом большинство загрузок пришлось на безобидный клон, не содержащий вредоносного кода.
Вредоносные изменения были добавлены 25 марта в версии rustdecimal 1.23.5, которая до выявления проблемы и блокирования пакета была загружена около 500 раз (предполагается что большая часть загрузок вредоносной версии совершена ботами) и не была использована в зависимостях у других пакетов, присутствующих в репозитории (не исключено, что вредоносный пакет был в зависимостях у конечных приложений).
Вредоносные изменения сводились к добавлению новой функции Decimal::new, в реализации которого содержался обфусцированный код для загрузки с внешнего сервера и запуска исполняемого файла. При вызове функции осуществлялась проверка переменной окружения GITLAB_CI, в случае выставления которой с внешнего сервера загружался файл /tmp/git-updater.bin. Загружаемый вредоносный обработчик поддерживал работу в Linux и macOS (платформа Windows не поддерживалась).
Предполагалось, что вредоносная функция будет выполнена в процессе тестирования на системах непрерывной интеграции. После блокировки rustdecimal администраторы crates.io выполнили анализ содержимого репозитория на наличие похожих вредоносных вставок, но не выявили проблем в других пакетах. Владельцам систем непрерывной интеграции на базе платформы GitLab рекомендуется убедиться, что тестируемые на их серверах проекты не использовали в зависимостях пакет rustdecimal.