Izdanje Rust 1.98.0. Kompromitacija paketa arrayref, koji je imao 53 miliona preuzimanja za 3 mjeseca

Objavljen je izvod programskog jezika Rust 1.98, koji je prvotno razvijen kroz projekt Mozilla, a sada se razvija pod okriljem neovisne neprofitne organizacije Rust Foundation. Jezik je usmjeren na sigurnu obradu memorije i pruža sredstva za postizanje visokog stupnja paralelizma izvršavanja zadataka, pritom se oslanjajući na minimalnu inicijalizaciju i podršku standardnoj biblioteci, bez korištenja sakupljača smeća i runtime-a.

Metode rada s memorijom u Rustu usmjerene su na isključivanje grešaka prilikom manipulacije pokazivačima i zaštitu od problema koji nastaju zbog niskog nivoa rada s memorijom, kao što su pristupanje oblasti memorije nakon njenog oslobađanja, dereferenciranje nultih pokazivača, izlazak izvan granica bafera itd. Za distribuciju biblioteka, osiguranje gradnje i upravljanje zavisnostima, projekat se razvija koristeći alat za upravljanje paketima Cargo. Za hostovanje biblioteka podržava se repozitorij crates.io.

Sigurno upravljanje memorijom u Rust-u osigurano je tokom kompajliranja pomoću provjere referenci, praćenja vlasništva nad objektima, uzimanja u obzir vremena života objekata (vidljivost) i procjene ispravnosti pristupa memoriji tokom izvršavanja koda. Rust takođe pruža sredstva za zaštitu od prelivanja cijelih brojeva, zahtijeva obaveznu inicijalizaciju vrijednosti varijabli prije korišćenja, bolje obrađuje greške u standardnoj biblioteci, primjenjuje koncept nepromjenjivosti (immutable) referenci i varijabli kao podrazumijevano, te nudi jaku statičku tipizaciju za minimiziranje logičkih grešaka.

Glavne novosti:

  • Za tipove s pomičnom decimalnom točkom f32 i f64 implementirani su algebarski metodi za zbrajanje, oduzimanje, množenje, dijeljenje i pronalaženje ostatka, koji provode optimizacije slične opciji «-ffast-math» u C/C++ prevodilima. Takvi metodi dopuštaju promjenu redoslijeda operacija kada je to potrebno za optimizacije, poput vektorizacije petlji. Na primjer, pri izračunu «a + b + c + d» uz običnu metodu zbrajanja, prevodilac će uvijek izvršiti izračun u jednom redoslijedu «((a + b) + c) + d», dok uz algebarsku metodu algebraic_add može grupirati izraz kao «(a + b) + (c + d)» i izvršiti «(a + b)» i «(c + d)» paralelno koristeći SIMD instrukcije. Cijena upotrebe algebarskih metoda je nedeterminiranost rezultata izračuna, koji se mogu mijenjati unutar granica pogreške.
  • Za sve primitivne cjelobrojne tipove implementirana je ugrađena metoda «format_into» za pretvaranje brojeva u stringove, koja se može koristiti umjesto paketa itoa. Kao parametar se predaje NumBuffer<Self> koji ima zajamčeno dovoljno veličine za zapis bilo koje vrijednosti korištenog tipa u decimalnom obliku. Na izlazu se vraća formatirani string &str, čije trajanje ovisi o međuspremniku.
  • Interakcija između omota ManuallyDrop i pametnog pokazivača Box više ne dovodi do neodređenog ponašanja.
  • У розряд стабільних переведено нову порцію API, зокрема стабілізовані методи та реалізації типажів:
    • 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
  • Ciljne platforme thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf in thumbv8r-none-eabihf so prevedene na drugi nivo podpore, ki vključuje garancijo sestave, vendar brez garancij pri prehodu testnega nabora.
  • Dodana je podpora za platforme powerpc64-unknown-linux-gnuelfv2 in aarch64-unknown-linux-pauthtest, za katere je zagotovljen tretji nivo podpore. Tretji nivo vključuje osnovno podporo, vendar brez avtomatiziranega testiranja, objave uradnih različic in preverjanja možnostih sestave kode.

Dodatno je treba omeniti kompromitacijo priljubljenega crate-paketa arrayref, ki je imel več kot 53 milijonov prenosov v zadnjih 90 dneh in se uporablja kot odvisnost pri 403 paketih. Napadalci so v repozitorij crates.io dodali nove pakete proc-macro1, proc-macro-en, aovine, arone, aronenao in tinymember, ki vsebujejo zlonamerno kodo. Po tem so v repozitoriju objavili nove izdaje paketov arrayref 0.3.10, internment 0.8.7 in append-only-vec 0.1.9, v katere je bila dodana zlonamerna odvisnost proc-macro1. Zlonamerna različica paketa arrayref je bila objavljena 20. avgusta ob 10:15 (MSK) in je obstajala do 11:41, nato pa so jo odstranili skrbniki crates.io.

S spremljevalcem arrayref za zdaj ni bilo mogoče stopiti v stik za pojasnitev situacije, vendar se domneva, da so bili njegovi podatki za dostop ujeti s strani napadalcev. V paketu proc-macro1 je bila zlonamerna sprememba prisotna v skriptu za sestavljanje in je nalagala izvajalno datoteko z zunanjega. strežnika. Naložena datoteka v Unix sistemih je bila shranjena kot /tmp/rust-setup, v Windows pa kot %TEMP%\rust-setup.ps1 ali %TEMP%\rust-setup-launch.vbs.

Izvor: opennet.ru

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster