Сигурност

Редакция Overclock.bg ·

Атака в Rust: заразен arrayref с 245 млн. тегления

Атака в Rust: заразен arrayref с 245 млн. тегления

На 20 август нападатели публикуваха в crates.io заразени версии на три популярни Rust библиотеки — arrayref@0.3.10, internment@0.8.7 и append-only-vec@0.1.9. Кодът на самите крейтове остана непокътнат; вместо това към тях беше добавена зависимост от proc-macro1 — типосквот на широко използвания proc-macro2, чийто build script сваля и изпълнява отдалечен двоичен файл. Само arrayref има около 245 милиона изтегляния за целия си живот и близо 54 милиона за последните 90 дни, а 403 други крейта зависят от него.

Ключовото тук е моментът на изпълнение. Build скриптовете в Rust се въртят по време на компилация, не при стартиране на програмата. Тоест едно обикновено cargo build в CI или на служебния лаптоп е било достатъчно, за да се задейства зловредният код — без никой да пуска готовия бинарник.

Как работи капанът

Според техническия анализ на StepSecurity и разбора на SafeDep адресът на сървъра е бил разделен на base64 фрагменти и сглобяван по време на компилация, за да не се хване при търсене по низове. Скриптът тегли платформено специфичен файл от 23.254.165.112:9089 през TLS с изключена проверка на сертификата и подава втори адрес (23.254.165.112:443) като аргумент на payload-а.

Има версии за Linux x86-64, Windows x86-64 и macOS (x86-64 и ARM64). На Unix файлът се записва в /tmp/rust-setup, маркира се като изпълним и се пуска, без да се чака резултат. На Windows се създава %TEMP%\rust-setup.ps1, стартиран през скрит VBScript под wscript.exe. И в двата случая процесът се откача от Cargo (през std::mem::forget(child)), така че билдът приключва „успешно“, а зловредният процес продължава да живее.

Втората степен се закрепва в системата — Registry Run ключ на Windows, LaunchAgent на macOS, systemd на Linux — и приема четири команди: спиране, смяна на C2 адреса, инсталиране на persistence и изпълнение на скриптове. Изброява профилите на Chrome, Brave и Edge през SQLite базите с запазени пароли. Тук Wiz коригираха първоначалното си твърдение: имплантът изброява запазените входове, но не изтегля самия криптиран материал на паролите.

Засечена аномална мрежова връзка по време на билд с arrayref Снимка: StepSecurity

Час и половина прозорец

Хронологията, описана от BleepingComputer, е стегната. В 01:17 UTC е създаден GitHub профил, имитиращ разработчика David Tolnay. В 01:55 излиза безобидната версия proc-macro1@1.0.106, а в 07:11 — зловредната 1.0.107. В 07:15 се появява arrayref@0.3.10, а старите версии 0.3.5–0.3.9 са изтеглени от индекса. В 07:54 сигналът стига до екипа, в 08:03 crates.io трие proc-macro1, а в 08:41 пада и arrayref@0.3.10.

Общо трите заразени версии са били онлайн между 86 и 107 минути. Официалният пост в блога на Rust уточнява, че освен тях са изтрити всички версии на proc-macro1, proc-macro-en, aovine, arone, aronenao и tinymember, а акаунтът на автора е заключен превантивно — екипът не смята, че той действа злонамерено, а по-скоро че компютърът или ключовете му са компрометирани. Откритието е на изследователския екип на Nextron Systems.

Какво да направите

Издаден е RUSTSEC-2026-0260 за arrayref. Кръпка няма — засегната е само 0.3.10, а решението е връщане към 0.3.9 или по-стара. Първата проверка е в локалния кеш:

ls ~/.cargo/registry/cache/*/ | grep -E "arrayref-0.3.10|internment-0.8.7|append-only-vec-0.1.9|proc-macro1"

Проверете и Cargo.lock файловете, наличието на /tmp/rust-setup или %TEMP%\rust-setup.ps1, както и трафик към 23.254.165.112 по портове 9089 и 443. Ако сте компилирали в прозореца от около 07:15 до 09:25 UTC на 20 август, третирайте машината като компрометирана: ротирайте креденшъли и CI токени и пресъздайте билда от чиста среда. The Hacker News отбелязва, че засега няма данни за реално използване на заразените версии.

Контекст

Wiz откриват сериозно припокриване с севернокорейски кампании: endpoint /49890878 се среща в кампанията Mastra, приписвана от Microsoft на Sapphire Sleet, а C2 адресът споделя SSL издател с нейната инфраструктура и живее в същия диапазон 23.254.164.0/23 на Hostwinds. Официална атрибуция обаче няма.

Неприятната част е, че Cargo няма общ еквивалент на npm --ignore-scripts — нито в stable, нито в nightly. Докато build скриптовете се изпълняват безусловно, компилацията си остава пълноценен вектор за изпълнение на код. Затова и екосистемите наоколо реагират нервно: скорошният хак на Hugging Face забави моделите на OpenAI точно заради изисквания за изолация на средите. А колко бързо се движат нещата, показва и активно експлоатираната RCE дупка в Zimbra.

Заключение

Реакцията беше образцова — 47 минути от сигнала до изтриването. Но 86 минути са предостатъчни за автоматизиран CI, който билдва на всеки push. Ако поддържате Rust проекти, това е добър повод да заковете версиите, да включите --locked в CI и да следите какви мрежови връзки прави билд машината ви.

Харесва ви? Отбележете ни и ще ни виждате по-нагоре в Google.

Предпочитан източник в Google

Прочетете още