Vydanie Rust 1.98.0. Kompromitácia balíka arrayref, ktorý má 53 miliónov stiahnutí za 3 mesiace

Vydaná verzia programovacieho jazyka Rust 1.98, pôvodne vyvinutého projektom Mozilla, no teraz rozvíjaného pod záštitou nezávislej neziskovej organizácie Rust Foundation. Jazyk je zameraný na bezpečnú manipuláciu s pamäťou a poskytuje prostriedky na dosahovanie vysokej paralelnosti vykonávania úloh, pričom sa zaobíde bez využitia garbage collectora a runtime (runtime je obmedzené na základnú inicializáciu a podporu štandardnej knižnice).

Metódy práce s pamäťou v Rust sú zamerané na vylúčenie chýb pri manipulácii s ukazovateľmi a ochranu pred problémami vyplývajúcimi z nízkoúrovňovej práce s pamäťou, ako sú prístup k pamäťovým oblastiam po ich uvoľnení, dereferencovanie nulových ukazovateľov, pretečenie buffera a podobne. Na distribúciu knižníc, zabezpečenie zostavenia a správu závislostí sa vyvíja balíkový manažér Cargo. Na hostenie knižníc sa podporuje repozitár crates.io.

Bezpečné zaobchádzanie s pamäťou je v Rust zabezpečené už pri kompilácii prostredníctvom kontroly odkazov, sledovania vlastníctva objektov, zohľadňovania životnosti objektov (rozsah viditeľnosti) a posudzovania správnosti prístupu k pamäti počas vykonávania kódu. Rust tiež poskytuje prostriedky na ochranu pred celočíselnými pretečeniami, vyžaduje povinnú inicializáciu hodnôt premenných pred použitím, lepšie spracováva chyby v štandardnej knižnici, aplikuje koncept nemennosti (immutable) odkazov a premenných ako predvolené a ponúka silnú statickú typizáciu na minimalizáciu logických chýb.

Hlavné novinky:

  • Pre typy s pohyblivou desatinnou čiarkou f32 a f64 sú implementované algebraické metódy na sčítanie, odčítanie, násobenie, delenie a získanie zvyšku, ktoré realizujú optimalizáciu podobnú možnosti „-ffast-math“ v kompilátoroch C/C++. Tieto metódy umožňujú zmenu poradia operácií, keď je to potrebné pre optimalizácie, ako je vektorizácia cyklov. Napríklad pri výpočte „a + b + c + d“ pri použití bežného sčítania kompilátor vždy vykoná výpočet v jednom poradí „((a + b) + c) + d“, avšak pri použití metódy algebraic_add môže zoskupiť vyjadrenie ako „(a + b) + (c + d)“ a vykonať „(a + b)“ a „(c + d)“ paralelne pomocou inštrukcií SIMD. Cena aplikácie algebraických metód spočíva v nedeterminovateľnosti výsledkov výpočtu, ktoré sa môžu líšiť v rámci presnosti.
  • Pre všetky primitívne celistvé typy je implementovaná vstavaná metóda „format_into“ na prevod čísel na reťazce, ktorá sa môže použiť namiesto balíka itoa. Ako parameter sa odovzdáva vyrovnávací priestor NumBuffer<Self>, ktorého veľkosť je zaručene dostatočná na zapísanie akejkoľvek hodnoty používaného typu v desiatkovej forme. Na výstupe sa vracia naformátovaný reťazec &str, ktorého životnosť je viazaná na vyrovnávací priestor.
  • Interakcia medzi obalom ManuallyDrop a inteligentným ukazovateľom Box teraz nevedie k nedefinovanému správaniu.
  • Do oblasti stabilných bol prenesený nový balík API, vrátane stabilizovaných metód a implementácií traitov:
    • str::substr_range
    • [T]::subslice_range
    • core::fmt::NumBuffer
    • <{integer}>::format_into
    • Send/Sync pre std::process::CommandArgs
    • {fN}::algebraic_add
    • {fN}::algebraic_sub
    • {fN}::algebraic_mul
    • {fN}::algebraic_div
    • {fN}::algebraic_rem
    • NonZero<{integer}>::from_str_radix
    • String::from_utf16le
    • String::from_utf16le_lossy
    • String::from_utf16be
    • String::from_utf16be_lossy
    • [T]::strip_circumfix
    • str::strip_circumfix
    • Atomic<T>::from_mut
    • Atomic<T>::get_mut_slice
    • Atomic<T>::from_mut_slice
    • std::range::legacy
  • Cieľové platformy thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf a thumbv8r-none-eabihf boli prevedené na druhú úroveň podpory, ktorá zahŕňa záruku zostavenia, ale bez záruk pri prechode testovým súborom.
  • Pridaná podpora platforiem powerpc64-unknown-linux-gnuelfv2 a aarch64-unknown-linux-pauthtest, pre ktoré je zabezpečená tretia úroveň podpory. Tretia úroveň pokrýva základnú podporu, ale bez automatizovaného testovania, zverejňovania oficiálnych zostavení a overovania možnosti zostavenia kódu.

Okrem toho sa dá spomenúť kompromitácia populárneho crate-paketového systému arrayref, ktorý mal viac ako 53 miliónov stiahnutí za posledných 90 dní a používa sa ako závislosť v 403 pakete. Útočníci umiestnili do repozitára crates.io nové balíky proc-macro1, proc-macro-en, aovine, arone, aronenao a tinymember, ktoré obsahovali škodlivý kód. Následne boli v repozitári zverejnené nové verzie balíkov arrayref 0.3.10, internment 0.8.7 a append-only-vec 0.1.9, do ktorých bola pridaná škodlivá závislosť proc-macro1. Škodlivá verzia balíka arrayref bola umiestnená 20. augusta o 10:15 (MSK) a existovala do 11:41, po čom bola odstránená správou crates.io.

Zástupcovi balíka arrayref sa zatiaľ nepodarilo spojiť, aby objasnil situáciu, ale predpokladá sa, že jeho prihlasovacie údaje boli zachytené útočníkmi. V balíku proc-macro1 bola škodlivá zmena prítomná v skripte na zostavenie a vykonávala sťahovanie spustiteľného súboru z vonkajšieho zdroja. serveraStiahnutý súbor v Unix systémoch sa ukladal ako /tmp/rust-setup, a vo Windows ako %TEMP%\rust-setup.ps1 alebo %TEMP%\rust-setup-launch.vbs.

Zdroj: opennet.ru

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster