Twórcy języka Rust ostrzegli przed wykryciem w repozytorium crates.io pakietu rustdecimal, zawierającego złośliwy kod. Pakiet ten oparty był na legalnym pakiecie rust_decimal, a jego rozprzestrzenienie posługiwało się podobieństwem nazwy (typosquatting), licząc na to, że użytkownik nie zwróci uwagi na brak znaku podkreślenia podczas wyszukiwania lub wybierania modułu z listy.
Interesujące jest to, że wskazana strategia okazała się skuteczna, a pod względem liczby pobrań, fikcyjny pakiet ledwie ustępował oryginałowi (~111 tysięcy pobrań rustdecimal 1.23.1 i 113 tysięcy oryginalnego rust_decimal 1.23.1). Większość pobrań dotyczyła nieszkodliwego klonu, który nie zawierał złośliwego kodu. Złośliwe zmiany dodano 25 marca w wersji rustdecimal 1.23.5, która przed wykryciem problemu i zablokowaniem pakietu została pobrana około 500 razy (przypuszcza się, że większość pobrań złośliwej wersji została dokonana przez boty) i nie była używana w zależnościach innych pakietów obecnych w repozytorium (nie można wykluczyć, że złośliwy pakiet był w zależnościach końcowych aplikacji).
Złośliwe zmiany polegały na dodaniu nowej funkcji Decimal::new, w realizacji której znajdował się zainfekowany kod do pobierania z zewnętrznego serwera i uruchamiania pliku wykonywalnego. Po wywołaniu funkcji sprawdzano zmienną środowiskową GITLAB_CI, w przypadku jej ustawienia zewnętrzny serwer pobierał plik /tmp/git-updater.bin. Pobierany złośliwy program obsługiwał systemy Linux i macOS (platforma Windows nie była obsługiwana).
Zakładano, że złośliwa funkcja zostanie wykonana podczas testowania na systemach ciągłej integracji. Po zablokowaniu rustdecimal, administratorzy crates.io przeprowadzili analizę zawartości repozytorium w poszukiwaniu podobnych złośliwych wstawek, ale nie wykryli problemów w innych pakietach. Właściciele systemów ciągłej integracji opartych na platformie GitLab powinni upewnić się, że testowane na ich serwerach projekty nie używały w zależnościach pakietu rustdecimal.
Źródło: opennet.ru
