Wydanie Rust 1.98.0. Kompromitacja pakietu arrayref, który miał 53 miliony pobrań w ciągu 3 miesięcy

Opublikowano wersję języka programowania Rust 1.98, który został opracowany przez projekt Mozilla, a obecnie rozwijany jest pod auspicjami niezależnej organizacji non-profit Rust Foundation. Język koncentruje się na bezpiecznym zarządzaniu pamięcią i oferuje środki do osiągania wysokiego poziomu równoległego przetwarzania zadań, przy tym omijając potrzeby stosowania garbage collectora i runtime (runtime ogranicza się do podstawowej inicjalizacji oraz utrzymania standardowej biblioteki).

Metody zarządzania pamięcią w Rust mają na celu eliminację błędów przy manipulacji wskaźnikami oraz ochronę przed problemami wynikającymi z niskopoziomowego zarządzania pamięcią, takimi jak dostęp do pamięci po jej zwolnieniu, dereferencjonowanie wskaźników zerowych, czy przekroczenie granic bufora itd. Aby ułatwić dystrybucję bibliotek, budowanie oraz zarządzanie zależnościami, projekt rozwija menedżer pakietów Cargo. Wsparcie dla repozytoriów bibliotek zapewnia repozytorium crates.io.

Bezpieczne zarządzanie pamięcią w Rust jest zapewnione podczas kompilacji poprzez kontrolę referencji, śledzenie własności obiektów, uwzględnianie czasu życia obiektów (zakresu widoczności) oraz ocenę prawidłowości dostępu do pamięci w czasie wykonywania kodu. Rust oferuje również narzędzia do ochrony przed przepełnieniami liczbowymi, wymaga obowiązkowej inicjalizacji wartości zmiennych przed użyciem, lepiej obsługuje błędy w standardowej bibliotece, stosuje koncepcję niemutowalności (immutable) referencji i zmiennych domyślnie oraz oferuje silne statyczne typowanie w celu minimalizacji błędów logicznych.

Główne nowości:

  • Dla typów zmiennoprzecinkowych f32 i f64 zaimplementowano metody algebraiczne dla dodawania, odejmowania, mnożenia, dzielenia i obliczania reszty, które realizują optymalizację podobną do opcji „-ffast-math” w kompilatorach C/C++. Takie metody pozwalają na zmianę kolejności operacji, gdy jest to konieczne dla optymalizacji, takich jak wektoryzacja pętli. Na przykład, przy obliczaniu „a + b + c + d” przy użyciu standardowego dodawania, kompilator zawsze wykona obliczenia w określonej kolejności „((a + b) + c) + d”, natomiast przy użyciu metody algebraic_add może zgrupować wyrażenie jako „(a + b) + (c + d)” i wykonać „(a + b)” oraz „(c + d)” równolegle z wykorzystaniem instrukcji SIMD. Kosztem stosowania metod algebraicznych jest niedeterministyczność wyników obliczeń, które mogą się różnić w granicach błędu.
  • Dla wszystkich pierwotnych typów całkowitych zaimplementowano wbudowaną metodę „format_into” do konwertowania liczb na łańcuchy, która może być używana zamiast pakietu itoa. Jako parametr przekazywany jest bufor NumBuffer, którego rozmiar jest gwarantowany jako wystarczający do zapisania dowolnej wartości używanego typu w postaci dziesiętnej. Na wyjściu zwracany jest sformatowany łańcuch &str, którego czas życia jest powiązany z buforem.
  • Interakcja między ManuallyDrop a inteligentnym wskaźnikiem Box nie prowadzi już do nieokreślonego zachowania.
  • Nowa porcja API została wprowadzona do stabilnej wersji, w tym ustabilizowane metody i implementacje traitów:
    • str::substr_range
    • [T]::subslice_range
    • core::fmt::NumBuffer
    • ::format_into
    • Send/Sync dla std::process::CommandArgs
    • {fN}::algebraic_add
    • {fN}::algebraic_sub
    • {fN}::algebraic_mul
    • {fN}::algebraic_div
    • {fN}::algebraic_rem
    • NonZero::from_str_radix
    • String::from_utf16le
    • String::from_utf16le_lossy
    • String::from_utf16be
    • String::from_utf16be_lossy
    • [T]::strip_circumfix
    • str::strip_circumfix
    • Atomic::from_mut
    • Atomic::get_mut_slice
    • Atomic::from_mut_slice
    • std::range::legacy
  • Platformy docelowe thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf i thumbv8r-none-eabihf zostały przeniesione na drugi poziom wsparcia, co oznacza gwarancję kompilacji, ale brak gwarancji na przejście zestawu testów.
  • Dodano wsparcie dla platform powerpc64-unknown-linux-gnuelfv2 i aarch64-unknown-linux-pauthtest, dla których zapewniono trzeci poziom wsparcia. Trzeci poziom obejmuje podstawowe wsparcie, ale bez automatyzacji testowania, publikacji oficjalnych wersji i weryfikacji możliwości kompilacji kodu.

Dodatkowo warto wspomnieć o kompromitacji popularnego pakietu crate arrayref, który miał ponad 53 mln pobrań w ciągu ostatnich 90 dni i był stosowany jako zależność w 403 pakietach. Hakerzy opublikowali w repozytorium crates.io nowe pakiety proc-macro1, proc-macro-en, aovine, arone, aronenao i tinymember, zawierające złośliwy kod. Po tym w repozytorium opublikowano nowe wydania pakietów arrayref 0.3.10, internment 0.8.7 i append-only-vec 0.1.9, które jako zależność miały złośliwy pakiet proc-macro1. Złośliwa wersja pakietu arrayref została opublikowana 20 sierpnia o 10:15 (MSK) i istniała do 11:41, po czym została usunięta przez administratorów crates.io.

Nie udało się jeszcze skontaktować z twórcą arrayref, aby wyjaśnić sytuację, ale przypuszcza się, że jego dane logowania zostały przechwycone przez hakerów. W pakiecie proc-macro1 złośliwa zmiana była obecna w skrypcie kompilacyjnym i ładowała plik wykonywalny z zewnętrznego serwera. serweryPobierany plik w systemach Unix był zapisywany jako /tmp/rust-setup, a w Windows jako %TEMP%\rust-setup.ps1 lub %TEMP%\rust-setup-launch.vbs.

Źródło: opennet.ru

Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS 🔥 Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS - ProHoster