Skoordynowany atak na łańcuch dostaw: popularne pakiety Rust zainfekowane złośliwym kodem w czasie kompilacji
Najważniejsze informacje
- •Złośliwe wersje pakietów Rusta — arrayref, internment i append-only-vec — zmodyfikowano tak, aby zależały od pakietu proc-macro1, typosquatu biblioteki proc-macro2, który uruchamiał złośliwe oprogramowanie podczas budowania przez Cargo.
- •Wieloplatformowy implant infekował systemy Linux, macOS i Windows, zbierając szczegóły dotyczące systemu oraz dane przeglądania z Chromium, a jednocześnie ustanawiał trwałość i komunikację command-and-control.
- •Zespół Rust Security Response Team usunął zainfekowane wydania i zablokował konto opiekuna pakietu, ustalając, że prawdopodobnie doszło do przejęcia maszyny dewelopera lub jego poświadczeń publikacyjnych, a nie do działania opiekuna w złych intencjach.
- •Pakiet arrayref zgromadził około 152 miliony pobrań i występuje w drzewach zależności obejmujących komponenty związane z Solaną, co tworzy szeroką powierzchnię ataku na maszynach deweloperów i w infrastrukturze CI/CD.
- •Ponieważ Cargo pomija wersje cofnięte (yanked) przy wyznaczaniu nowych drzew zależności, ale honoruje wersje już zapisane w plikach Cargo.lock, rzeczywista ekspozycja zależy od pliku lockfile przypiętego w danym projekcie.

20 sierpnia 2026 r. badacze bezpieczeństwa zidentyfikowali skoordynowany atak na łańcuch dostaw wymierzony w trzy szeroko wykorzystywane pakiety (crate) języka Rust opublikowane w serwisie crates.io. Skompromitowane pakiety — arrayref w wersji 0.3.10, internment 0.8.7 oraz append-only-vec 0.1.9 — zmodyfikowano tak, aby zawierały złośliwą zależność wykonującą zdalny kod podczas standardowej kompilacji. Zespół Rust Security Response Team niezwłocznie usunął dotknięte wydania i zablokował konto opiekuna pakietu, oświadczając, że prawdopodobnie doszło do przejęcia maszyny prawowitego dewelopera lub jego poświadczeń publikacyjnych, a nie do działania opiekuna w złych intencjach.
Zależność-typosquat dostarczyła ładunek
Atak wykorzystywał pakiet o nazwie proc-macro1, będący typosquatem podszywającym się pod prawowitą bibliotekę proc-macro2. Gdy Cargo rozwiązywał tę zależność, automatycznie uruchamiał złośliwy skrypt budowania, który odtwarzał adresy serwerów command-and-control z danych zaciemnionych za pomocą Base64, wyłączał weryfikację TLS i pobierał przeznaczony dla danej platformy ładunek z serwera kontrolowanego przez atakujących. Ponieważ do kompromitacji doszło w czasie budowania, już sama kompilacja projektu, który pośrednio (tranzytywnie) zależał od jednego ze złośliwych pakietów, mogła zainfekować stację roboczą dewelopera lub host ciągłej integracji — nawet jeśli kod aplikacji nigdy bezpośrednio nie wywoływał żadnej podejrzanej funkcji.
Podszywanie wymierzone było w jeden z najbardziej wszechobecnych elementów składowych ekosystemu Rusta — proc-macro2 stanowi podstawę obsługi makr dla dużej części publikowanych pakietów — a rejestry takie jak crates.io, npm i PyPI przydzielają nazwy pakietów według zasady „kto pierwszy, ten lepszy”, co od dawna czyni typosquatting jedną z ulubionych technik ataków na łańcuch dostaw w różnych ekosystemach językowych.
Działanie wieloplatformowego backdoora
Złośliwe oprogramowanie działało w systemach Linux, macOS i Windows. W systemach Linux i macOS zapisywało plik wykonywalny w katalogach tymczasowych i uruchamiało go w trybie odłączonym. W systemie Windows wykorzystywało skrypty PowerShell i Visual Basic do obejścia polityk wykonywania i uruchamiania ukrytych procesów. Backdoor drugiego stopnia profilował następnie zainfekowany system, zbierając nazwy użytkowników, nazwy hostów, zainstalowane aplikacje oraz dane przeglądania z przeglądarek opartych na Chromium. Ustanawiał trwałość na poziomie użytkownika poprzez klucze autostartu w rejestrze, usługi użytkownika systemd lub LaunchAgents w macOS, utrzymywał komunikację z punktem końcowym command-and-control i obsługiwał zdalne instrukcje umożliwiające dalsze wykonywanie kodu oraz zmiany konfiguracji.
Firma bezpieczeństwa Socket udokumentowała tę kompromitację na X:
Popular Rust crates compromised: Affected versions of arrayref, internment, and append-only-vec were modified to depend on proc-macro1, a malicious typosquat of proc-macro2. Its build script downloaded and executed malware during Cargo builds. Analysis:
— Socket (@SocketSecurity), August 20, 2026
Szersza ekspozycja ekosystemu i działania naprawcze
Incydent ma istotne znaczenie dla ekosystemu Rusta i sąsiadującej z nim infrastruktury blockchain. Sam pakiet arrayref zgromadził przed kompromitacją około 152 miliony pobrań i występuje w drzewach zależności obejmujących komponenty związane z Solaną oraz popularne frameworki interfejsów graficznych. Choć projekty leżące dalej w łańcuchu zależności nie były same w sobie skompromitowane, chyba że jawnie rozwiązały i zbudowały złośliwe wersje, rozpowszechnione tranzytywne użycie tego pakietu tworzy szeroką powierzchnię ataku obejmującą środowiska deweloperskie, potoki CI/CD oraz zautomatyzowaną infrastrukturę wydawania, które często przechowują wrażliwe tokeny i materiały podpisowe.
Epizod wpisuje się również w szerszą falę kompromitacji rejestrów pakietów. W sierpniu 2025 r. kampania śledzona jako rk0x wykorzystywała skradzione poświadczenia opiekunów pakietów do publikowania złośliwych wersji popularnych pakietów Rusta, wykradających poświadczenia z przeglądarek i portfele kryptowalutowe, a npm i PyPI wielokrotnie mierzyły się z własnymi kampaniami typosquattingowymi oraz przejmowania kont. Backdoor w XZ Utils z marca 2024 r. pokazał z kolei, jak pojedyncza szeroko używana biblioteka open source może stać się wąskim gardłem sięgającym ogromnej liczby systemów położonych dalej w łańcuchu zależności.
Badacze zidentyfikowali dodatkowe kontrolowane przez atakujących pakiety pomocnicze (staging) — proc-macro-en, aovine, arone, aronenao i tinymember — które następnie usunięto z rejestru. Aktor zagrożeń cofnął ponadto (yanked) wcześniejsze prawowite wersje pakietu arrayref, potencjalnie kierując rozwiązywanie zależności ku złośliwemu wydaniu, zanim interweniowali administratorzy. Zgodnie z regułami rozwiązywania zależności w Cargo wersje cofnięte (yanked) są pomijane przy wyznaczaniu nowych drzew zależności, jednak wersje już zapisane w pliku Cargo.lock nadal podlegają budowaniu, więc rzeczywista ekspozycja zależy od przypiętych plików lockfile, a nie wyłącznie od stanu rejestru.
Organizacjom zaleca się audyt plików Cargo.lock, inwentarzy zależności i dzienników budowania pod kątem dotkniętych wersji oraz powiązanych wskaźników kompromitacji. Każdy system, w którym skompilowano jedno ze złośliwych wydań, należy traktować jako potencjalnie skompromitowany, co wymaga rotacji sekretów dostępnych dla środowiska budowania, analizy kryminalistycznej w poszukiwaniu znanych artefaktów sieciowych i hostowych oraz ponownego budowania oprogramowania ze zweryfikowanych czystych środowisk. Obrońcy powinni również monitorować połączenia ze zidentyfikowaną infrastrukturą command-and-control oraz wyniki deterministycznego algorytmu generowania domen powiązanego z implantem. Narzędzia ekosystemu wspierają takie postępowanie: cargo tree wylicza zależności tranzytywne do przeglądu, a baza danych advisory RustSec, wykorzystywana przez cargo audit, kataloguje wersje pakietów o znanych podatnościach.
Źródło: Metaverse Post