Pierwsza nowa zależność od dziesięciu lat

20 sierpnia 2026 roku napastnik, który przejął konto opiekuna na crates.io, oficjalnym rejestrze pakietów Rusta, wykorzystał ten dostęp, aby opublikować zatrute wersje trzech szeroko używanych pakietów: arrayref, internment i append-only-vec. Sam arrayref występuje w ponad 35 procentach wszystkich środowisk Rusta i mniej więcej w trzech na cztery środowiska, w których Rust w ogóle występuje, co czyni go jedną z najbardziej wszechobecnych małych bibliotek w całym ekosystemie, mimo że prawie nikt jej nie zauważa.

Złośliwa wersja arrayref 0.3.10 miała szczegół, który sam w sobie powinien był być sygnałem ostrzegawczym: była to pierwsza nowa zależność, jaką arrayref dodał w całej swojej dziesięcioletniej historii. Fakt, że pakiet, który przez dekadę wydawał aktualizacje bez żadnych zależności, nagle zyskuje jedną, jest dokładnie taką zmianą, jaką powinien wychwycić staranny przegląd zależności, o ile ktokolwiek go w ogóle robił.

Skrypt budowania uruchomił się, zanim jakikolwiek kod zdążył działać

Każda zatruta wersja dodawała zależność do nowego pakietu o nazwie proc-macro1, który również był złośliwy. Proc-macro1 zawierał skrypt budowania, niewielki program, który Cargo, narzędzie budowania Rusta, uruchamia automatycznie w ramach kompilacji projektu, zanim własny kod projektu w ogóle skończy się budować lub zostanie wykonany.

To właśnie to automatyczne uruchomienie sprawiło, że atak był tak cichy: programista albo potok CI nie musiał uruchamiać gotowego pliku binarnego, niczego klikać ani importować podejrzanej funkcji, aby zostać zainfekowanym. Wystarczyło uruchomić cargo build na projekcie zależnym od zatrutego pakietu, aby wyzwolić skrypt budowania i pobrać ładunek napastnika.

Wycofanie i popchnięcie: sztuczka pożyczona z npm

Napastnik wycofał też starsze, czyste wersje arrayref, od 0.3.5 do 0.3.9, z rejestru. Wycofanie nie usuwa wersji całkowicie, ale sprawia, że Cargo wyświetla swoje standardowe ostrzeżenie, że projekt powinien rozważyć aktualizację do wersji, która nie została wycofana.

Skoro każda czysta wersja była oznaczona jako wycofana, jedyną niewycofaną wersją, którą Cargo mogło polecić, była złośliwa 0.3.10, co poprzez własne narzędzia rejestru popychało programistów w stronę zatrutej wersji. Badacze bezpieczeństwa już wcześniej zauważyli dokładnie ten sam schemat wycofania i popchnięcia w poprzednich atakach na łańcuch dostaw npm, więc jego pojawienie się na crates.io sugeruje ten sam scenariusz inżynierii społecznej za pośrednictwem narzędzi, a nie nowy pomysł.

Trzy pakiety, trzy krótkie okna czasowe

Wszystkie trzy złośliwe wersje zostały opublikowane w ciągu 22-minutowego okna rano 20 sierpnia 2026 roku, a wszystkie trzy zostały usunięte w ciągu mniej więcej 90 do 107 minut od publikacji, gdy tylko Rust Security Response Team zablokował przejęte konto i wycofał pakiety.

PakietZłośliwa wersjaOpublikowano (UTC)Usunięto (UTC)Minuty online
arrayref0.3.1007:1508:4186
internment0.8.707:3409:0490
append-only-vec0.1.907:3709:25107

Okno krótsze niż dwie godziny brzmi krótko, ale crates.io nie ma żadnego wbudowanego opóźnienia między opublikowaniem nowej wersji a momentem, w którym każdy zależny projekt może ją automatycznie pobrać przy następnej kompilacji, więc nawet krótkie okno wystarczy, aby skrypt budowania dotarł do każdego projektu, który akurat jest w tym czasie ponownie kompilowany.

Kradzież danych logowania, wyłącznik awaryjny i powiązanie z Koreą Północną

Wiz Research przeanalizował ładunek i znalazł backdoora, który łączy się ze zdalnym serwerem przez HTTPS, wylicza zapisane dane logowania z Chrome, Brave i Edge, instaluje trwałość działającą na wielu systemach i potrafi wykonać cztery odrębne polecenia zdalne, w tym wyłącznik awaryjny i polecenie uruchomienia dowolnych skryptów.

Wiz odkrył również, że punkt kontaktowy backdoora dzieli infrastrukturę z kampanią Mastra, którą Microsoft przypisał grupie Sapphire Sleet, powiązanej z Koreą Północną, oraz z wcześniejszym atakiem na pakiet npm axios, który Google Cloud Threat Intelligence i Mandiant niezależnie od siebie również powiązali z Koreą Północną, co sugeruje, że ten sam typ ugrupowania, który już wcześniej włamał się do npm, pokazał teraz tę samą zdolność wobec crates.io. Odkrycie przypisuje się Nextron Systems GmbH, niemieckiej firmie zajmującej się bezpieczeństwem; Rust Security Response Team zablokował konto i wycofał wszystkie trzy wersje, a jak dotąd nie pojawił się żaden potwierdzony dowód na rzeczywiste wykorzystanie luki.

Rust rozwiązuje błędy pamięci, a nie pytanie, kto kontroluje konto

Unijny Cyber Resilience Act oraz dyrektywa NIS2 od jakiegoś czasu popychają producentów produktów krytycznych dla bezpieczeństwa i połączonych z siecią w stronę języków bezpiecznych pamięciowo, a Rust był jednym z głównych beneficjentów tego naporu. Ten incydent przypomina, że migracja do Rusta z powodów zgodności z przepisami rozwiązuje jeden problem, błędy bezpieczeństwa pamięci, takie jak przepełnienia bufora, nie dotykając zupełnie innego: kto kontroluje konto publikujące zależności projektu i co skrypt budowania ma prawo wykonać, zanim własny kod projektu w ogóle skończy się kompilować.

Właściciele, którzy zarządzili migrację do Rusta z powodów zgodności z przepisami, powinni zadać swoim zespołom inżynieryjnym trzy konkretne pytania: czy aktualizacje zależności są sprawdzane przed ich połączeniem, czy potok CI może izolować lub ograniczać to, co wolno robić skryptowi budowania, i czy ktokolwiek w ogóle zauważyłby wycofanie i ponowną publikację tego samego dnia pakietu, któremu zespół ufa od lat. Warto zauważyć, że samo odkrycie pochodzi od Nextron Systems GmbH, niemieckiej firmy, co obala każde założenie, że tego rodzaju ryzyko w łańcuchu dostaw dotyczy tylko innych.