Izdanje Rust 1.98.0. Kompromitacija paketa arrayref, koji ima 53 milijuna preuzimanja u posljednja 3 mjeseca

Objavljen je novi izlaz programskog jezika Rust 1.98, koji je izvorno razvijen od strane Mozille, a trenutno ga razvija neprofitna organizacija Rust Foundation. Jezik se fokusira na sigurnu upravljanje memorijom i pruža sredstva za postizanje visokog paralelizma izvršavanja zadataka, a da pri tome ne koristi sakupljač smeća i runtime (runtime se svodi na osnovnu inicijalizaciju i podršku standardnoj biblioteci).

Metode upravljanja memorijom u Rust-u usmjerene su na isključivanje grešaka prilikom manipulacije pokazivačima i zaštitu od problema koji nastaju zbog niskonivojskog rada s memorijom, kao što su pristupanje memorijskom području nakon što je oslobođeno, dereferenciranje nultih pokazivača, izlazak iz okvira bafera itd. Za distribuciju biblioteka, osiguranje gradnje i upravljanje ovisnostima, projekt se razvija preko upravitelja paketa Cargo. Za hosting biblioteka podržava se repozitorij crates.io.

Sigurna manipulacija memorijom osigurava se u Rustu tijekom kompilacije provjerom referenci, praćenjem vlasništva nad objektima, uzimanjem u obzir vremena života objekata (opseg vidljivosti) i ocjenom točnosti pristupa memoriji tijekom izvršavanja koda. Rust također pruža sredstva za zaštitu od cjelobrojnih prekoračenja, zahtijeva obaveznu inicijalizaciju vrijednosti varijabli prije upotrebe, bolje obrađuje greške u standardnoj biblioteci, primjenjuje koncept nepromjenjivosti (immutable) referenci i varijabla kao zadano te nudi snažnu statičku tipizaciju za minimiziranje logičkih grešaka.

Glavne novine:

  • Za tipove s pomičnom zarezom f32 i f64 implementirane su algebarske metode za zbrajanje, oduzimanje, množenje, dijeljenje i pronalaženje ostatka, koje provode optimizaciju sličnu opciji „-ffast-math“ u C/C++ kompajlerima. Takve metode dopuštaju promjenu reda operacija kada je to potrebno za optimizacije, poput vektorizacije petlji. Na primjer, pri izračunavanju „a + b + c + d“ s običnim zbrajanjem, kompajler će uvijek izvršavati izračun u jednom redu „((a + b) + c) + d“, dok će korištenje metode algebraic_add omogućiti grupiranje izraza kao „(a + b) + (c + d)“ i izvršiti „(a + b)“ i „(c + d)“ paralelno pomoću SIMD instrukcija. Cijena primjene algebarskih metoda je nedeterminiranost rezultata izračuna, koji se mogu mijenjati unutar pogreške.
  • Za sve primitivne cjelobrojne tipove implementirana je ugrađena metoda „format_into“ za pretvorbu brojeva u nizove, koja se može koristiti umjesto paketa itoa. Kao parametar se predaje spremnik NumBuffer<Self>, čija veličina je zajamčeno dovoljna za zapisivanje bilo koje vrijednosti korištenog tipa u decimalnom obliku. Na izlazu se vraća formatirani niz &str, čije vrijeme života je vezano uz spremnik.
  • Interakcija između obavijestanja ManuallyDrop i pametnog pokazivača Box više ne dovodi do neodređenog ponašanja.
  • U stabilne verzije prebačen je novi set API-ja, uključujući stabilizirane metode i implementacije tipa:
    • str::substr_range
    • [T]::subslice_range
    • core::fmt::NumBuffer
    • <{integer}>::format_into
    • Send/Sync za 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
  • Ciljane platforme thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf i thumbv8r-none-eabihf su prebačene na drugi nivo podrške, koji podrazumeva garantovanu gradnju, ali bez garancije za prolaz kvestionara.
  • Dodana je podrška za platforme powerpc64-unknown-linux-gnuelfv2 i aarch64-unknown-linux-pauthtest, za koje je obezbeđena treća nivo podrške. Treći nivo pokriva osnovnu podršku, ali bez automatizovanog testiranja, objavljivanja zvaničnih verzija i provere mogućnosti gradnje koda.

Dodatno se može primetiti kompromitacija popularnog crate-paketa arrayref, sa više od 53 miliona preuzimanja u poslednjih 90 dana i korišćenog kao zavisnost u 403 paketa. Napadači su postavili nove pakete proc-macro1, proc-macro-en, aovine, arone, aronenao i tinymember u repozitorijum crates.io, koji sadrže zlonamerni kod. Nakon toga su u repozitorijumu objavljene nove verzije paketa arrayref 0.3.10, internment 0.8.7 i append-only-vec 0.1.9, u koje je kao zavisnost dodat zlonamerni paket proc-macro1. Zlonamenska verzija paketa arrayref je postavljena 20. avgusta u 10:15 (MSK) i postojala je do 11:41, nakon čega je uklonjena od strane administratora crates.io.

Nije uspelo da se stupi u kontakt sa pratiocem arrayref za razjašnjenje situacije, ali se pretpostavlja da su njegovi podaci kompromitovani od strane napadača. U paketu proc-macro1, zlonamerna izmena je postojala u skripti za gradnju i vršila preuzimanje izvršne datoteke sa spoljnog poslužitelja. Preuzeta datoteka na Unix sistemima se čuvala kao /tmp/rust-setup, a na Windows-u — %TEMP%\rust-setup.ps1 ili %TEMP%\rust-setup-launch.vbs.

Izvor: opennet.ru

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster