20 августа 2026 года в реестре пакетов crates.io появилась скомпрометированная версия популярной библиотеки arrayref. Вредоносное обновление под номером 0.3.10 незаметно добавило зависимость от пакета proc-macro1, который имитировал известный пакет proc-macro2. При сборке проекта с этой версией на компьютер жертвы загружалось и запускалось вредоносное ПО. Инцидент длился около 86 минут, однако за это время под угрозой оказались тысячи проектов, включая инструменты для работы с криптовалютами и графические интерфейсы. Для активации вредоносного кода было достаточно просто выполнить компиляцию проекта: ни одна функция библиотеки не вызывалась, а сборочный скрипт действовал незаметно. Атака была совершена через подмену пакета-зависимости, и это классический приём в атаках на цепочку поставок.
Описание
Атака началась ранним утром. В 01:17 по UTC злоумышленник создал поддельный аккаунт в GitHub, полностью повторяющий имя автора известного пакета proc-macro2. Через несколько минут появился соответствующий аккаунт на crates.io. Затем в 01:55 злоумышленник опубликовал первую версию пакета proc-macro1 - точную копию оригинального пакета, без вредоносного кода. Это была подготовка, чтобы пакет выглядел правдоподобно. В 07:11 вышла вторая версия, уже содержащая вредоносный код. А в 07:15 скомпрометированный аккаунт владельца arrayref, существовавший с 2009 года, выпустил обновление библиотеки, добавив зависимость от вредоносного пакета. Почти одновременно злоумышленник отозвал старые версии arrayref с 0.3.5 по 0.3.9 с интервалом в несколько секунд, чтобы вызвать у пользователей предупреждение об отозванной версии и подтолкнуть их к обновлению на заражённую версию. Поддельный аккаунт содержал вымышленные данные, включая несуществующий репозиторий, что должно было сделать пакет более правдоподобным при проверке.
Механизм атаки, который исследует сообщество безопасности Rust, построен на сборочном скрипте. В экосистеме Rust сборочный скрипт выполняется до компиляции основного кода. Вредоносный скрипт устанавливал связь с удалённым сервером, загружал исполняемый файл и запускал его с правами текущего пользователя. При этом библиотека arrayref продолжала работать корректно, поэтому сборка выглядела успешной, и признаки заражения были незаметны. Чтобы замаскировать активность, злоумышленник использовал скрытый запуск без ожидания завершения, поэтому процесс сборки не прерывался и не вызывал подозрений. Исполняемый файл выбирался в зависимости от операционной системы, поэтому атака срабатывала как на Windows, так и на Linux и macOS. Злоумышленник арендовал сервер для размещения вредоносного кода у американского хостинг-провайдера Hostwinds.
Масштаб угрозы оказался значительным. arrayref - одна из самых распространённых утилит в экосистеме Rust: за всё время её скачали около 245 миллионов раз. Разработчики используют её в цепочках зависимостей популярных библиотек для графического интерфейса, таких как egui и iced, а также в криптовалютных проектах, включая инструменты для Ethereum и Solana. Жертвами могли стать все, кто выполнял сборку с зависимостью arrayref в период с 07:15 до 08:41 UTC. Особенно опасна ситуация для систем непрерывной интеграции (CI): такие серверы автоматически собирают проекты при каждом изменении кода, и вредоносная версия попала бы в них без участия человека. В результате атакующий мог получить доступ к исходному коду, секретам и учётным данным, хранящимся в сборочной среде. В силу того, что arrayref входит в зависимости десятков тысяч проектов, даже короткий промежуток времени заражения создал огромный потенциальный ущерб. Многие разработчики используют автоматическое обновление зависимостей, что повышает вероятность попадания вредоносной версии в рабочие процессы.
Для проверки своей системы необходимо открыть файл блокировки зависимостей Cargo.lock. Если в нём указана версия arrayref 0.3.10 или упоминается пакет proc-macro1, это значит, что вредоносный код выполнялся на этой машине. Также стоит обратить внимание на временные файлы с характерными именами, появление которых может указывать на следы атаки, и на сетевые подключения к известному командному серверу. При обнаружении признаков заражения следует считать систему скомпрометированной: нужно сменить все пароли, ключи и токены, включая секреты систем непрерывной интеграции, а затем пересобрать всё программное обеспечение из чистых источников. Необходимо также проверить и другие машины, которые имели доступ к заражённой системе. В случае подтверждения заражения важно не только сменить учётные данные, но и изучить историю выполнения команд, а также журналы сетевых подключений.
Реестр crates.io уже удалил вредоносные версии, однако отозванные версии остаются доступными для существующих файлов блокировки. Пользователям, которые не затронуты атакой, рекомендуется закрепить версию arrayref 0.3.9 и не обновлять зависимости автоматически, особенно при появлении предупреждений об отозванных версиях. Инцидент подчёркивает важность проверки происхождения библиотек и осторожности при обновлении даже самых надёжных компонентов. Пока неизвестно, какие именно данные могли быть собраны вредоносным кодом, поэтому пострадавшим следует проявить максимальную осторожность и рассмотреть возможность полной переустановки операционной системы. Тем временем разработчикам стоит ещё раз пересмотреть свои списки зависимостей и убедиться, что в их проекты не попали посторонние пакеты. Ситуация остаётся предметом активного расследования, и Rust-сообщество продолжает анализировать поведение вредоносного кода.
Индикаторы компрометации
IPv4 Port Combination
- 23.254.165.112:443
- 23.254.165.112:9089
Domain
- hwsrv-798836.hostwindsdns.com
URL
- https://23.254.165.112:9089/
- rchaitm@gmail.com
SHA256
- 25ad700976873c76af785cb99b33c48db7df8b81f21d1e9e06b3676b9a9373ae
- 61198155da51b838772eecf5bfaac6cbc4dcc388dccc56658fc28a8e831b34d4
- b5c1b5b0763a8809a644a8f92224653f0aca623a98eecc714d27f74b80fbe436