Исследовательская группа по киберугрозам компании Socket обнаружила две вредоносные библиотеки (crates) для языка Rust - faster_log и async_println, которые маскировались под популярную легитимную библиотеку fast_log. Пакеты, опубликованные злоумышленником под псевдонимами rustguruman и dumbnbased, содержали рабочий код для ведения логов, чтобы усыпить бдительность, но также включали скрытые функции. Эти функции сканировали исходные файлы проектов на наличие приватных ключей от кошельков Solana и Ethereum, а затем пересылали найденные совпадения на жестко заданный командный сервер (C2, Command and Control) через HTTP POST-запросы. Общее количество загрузок двух пакетов составило 8424 раза. Они были опубликованы в реестре crates.io 25 мая 2025 года.
Описание
После получения отчета от Socket с требованием удалить пакеты и заблокировать учетные записи их публикации, команда безопасности crates.io действовала незамедлительно. В течение часа был получен ответ от Карлоса Эуроса, представителя crates.io. Вскоре после этого команда безопасности выполнила три ключевых действия: сохранила все файлы пакетов faster_log и async_println для последующего анализа, одновременно удалив их listings из реестра, чтобы предотвратить дальнейшие загрузки; заблокировала учетные записи dumbnbased и rustguruman, лишив их возможности совершать любые действия в реестре; опубликовала официальное уведомление о безопасности с деталями проведенных действий и расследования. Эксперты Socket выразили благодарность команде безопасности crates.io, Группе реагирования на угрозы безопасности Rust (Rust Security Response WG) и Фонду Rust за оперативные и решительные действия, способствующие безопасности экосистемы.
Автоматический сканер Socket AI Scanner сразу идентифицировал faster_log как известное вредоносное программное обеспечение. Этот пакет является классическим примером тайпсквоттинга - он использует опечатку в названии легитимного fast_log, дословно копирует его описание (README) и ссылку на репозиторий, чтобы ввести разработчиков в заблуждение.
Технический анализ кода показал, что вредоносные библиотеки читают файлы или целые директории, переданные вызывающим кодом, и сканируют строки исходного кода на Rust по трем шаблонам. Первый шаблон находит приватные ключи Ethereum - строки, начинающиеся с 0x и содержащие 64 шестнадцатеричных символа. Второй шаблон ищет токены в кодировке Base58 длиной от 32 до 44 символов, что соответствует адресам или ключам Solana. Третий шаблон выявляет байтовые массивы в квадратных скобках, которые могут содержать сырые данные ключей. Каждое найденное совпадение упаковывается в структуру данных с указанием типа, точного значения, пути к исходному файлу и номера строки. Затем все найденные элементы отправляются в виде JSON-массива по протоколу HTTPS на заранее определенный C2-сервер с использованием библиотеки reqwest. Важно отметить, что вредоносная нагрузка выполняется во время работы приложения или тестов, а не на этапе сборки.
Встроенный комментарий злоумышленника «Жестко заданная конечная точка, как и требовалось» может указывать на координацию между сообщниками, где один исполнитель реализует код по спецификации другого. Этот комментарий также можно расценить как слабую попытку создать правдоподобное отрицание, представляя выбор C2 как требование третьей стороны. Другие комментарии, такие как «Поиск строк base58 (типичные адреса/ключи Solana)», прямо раскрывают цель - хищение секретов, в частности приватных ключей Solana и Ethereum из файлов разработчиков и сборок.
Оба пакета написаны на чистом Rust и зависят только от стандартных библиотек и reqwest, поэтому их поведение идентично на Linux, macOS и Windows. Под угрозой оказывается любая среда с установленной цепочкой инструментов Rust и исходящим сетевым доступом. На момент обнаружения у пакетов не было зависимых проектов в реестре crates.io.
Страгия злоумышленника заключалась в создании двух учетных записей издателей на crates.io, связанных с соответствующими профилями на GitHub. Опубликованные пакеты имитировали легитимный fast_log, копируя его оформление и документацию, что помогало им проходить поверхностную проверку. Адрес C2-сервера был стилизован под сервис RPC блокчейна, что позволяло вредоносному трафику маскироваться под легитимные запросы разработчиков к сетевым ресурсам.
Данная кампания наглядно демонстрирует, как минимальный код и простой обман могут создать серьезный риск для цепочки поставок программного обеспечения. Функциональный логгер с знакомым названием и скопированным описанием может пройти casual-проверку, в то время как небольшая скрытая процедура пересылает приватные ключи кошельков под контролем злоумышленников. К сожалению, этого достаточно для компрометации компьютеров разработчиков и систем непрерывной интеграции.
Специалистам по безопасности следует ожидать появления аналогичных пакетов в других экосистемах, которые будут повторять эту тактику с небольшими вариациями. Вероятные изменения включают перенос триггеров в скрипты сборки или процедурные макросы, расширение области сканирования зараженной системы, добавление обфускации и ротацию C2-серверов. Можно прогнозировать частую смену командных серверов, их геофильтрацию и добавление задержек в ответах для большего сходства с легитимным RPC-трафиком.
Данный инцидент следует рассматривать как компрометацию цепочки поставок. Необходимо удалить упомянутые пакеты из всех проектов, а затем немедленно обернуть любые секреты, которые могли присутствовать в исходном коде, тестах или конфигурационных файлах, включая строковые литералы и байтовые массивы. Рекомендуется внедрить сканирование секретов на уровне файлов, ограничить исходящий трафик из сетей разработчиков и систем CI/CD, а также настроить детектирование наблюдаемых шаблонов, таких как POST-запросы с JSON-телом, содержащим поле с контентом, или макросы, которые читают исходные файлы.
Инструменты безопасности Socket предлагают комплексную защиту от подобных рисков. Приложение Socket для GitHub обеспечивает сканирование pull request в реальном времени, помечая подозрительные или вредоносные пакеты до их слияния в основную ветку. Командная строка Socket выводит предупреждения во время установки пакетов, помогая командам обнаруживать опасный код на ранней стадии. Расширение для браузера аннотирует страницы пакетов при их просмотре, выявляя случаи подмены и рискованное поведение. Интеграция Socket MCP расширяет эту защиту на среды с искусственным интеллектом, обнаруживая и предупреждая о вредоносных пакетах до того, как предложения, сгенерированные большими языковыми моделями, внедрят их в код. В сочетании с грамотным управлением секретами и контролем исходящего трафика эти уровни защиты создают эффективную стратегию обороны в глубину.
Индикаторы компрометации
Malicious Crates
- faster_log
- async_println
URLs
- https://github.com/dumbnbased
- https://github.com/rustguruman
- https://mainnet.solana-rpc-pool.workers.dev/