Izdaja Rust 1.98.0: Kompromis paketa arrayref, ki je bil v 3 mesecih prenesen 53 milijonov krat

Izšel je programski jezik Rust 1.98, ki ga je ustanovil projekt Mozilla, a ga zdaj razvija neodvisna neprofitna organizacija Rust Foundation. Jezik se osredotoča na varnost pomnilnika in ponuja orodja za doseganje visoke vzporednosti izvajanja nalog, pri čemer ne uporablja zbiralnika smeti in izvajalnega okolja (izvajalno okolje je omejeno na osnovno inicializacijo in vzdrževanje standardne knjižnice).

Rustove metode upravljanja pomnilnika so zasnovane tako, da odpravljajo napake pri manipulaciji kazalcev in ščitijo pred težavami, ki izhajajo iz upravljanja pomnilnika na nizki ravni, kot so dostop do pomnilnika po tem, ko je bil sproščen, dereferenciranje ničelnih kazalcev, prekoračitve medpomnilnika in tako naprej. Projekt razvija upravitelja paketov Cargo za distribucijo knjižnic, omogočanje gradnje in upravljanje odvisnosti. Za gostovanje knjižnic se vzdržuje repozitorij crates.io.

Varnost pomnilnika je v Rustu zagotovljena v času prevajanja s preverjanjem sklicevanj, spremljanjem lastništva objekta, spremljanjem življenjskih dob objektov (obseg) in ocenjevanjem pravilnosti dostopa do pomnilnika med izvajanjem kode. Rust zagotavlja tudi zaščito pred celoštevilskimi prelivi, zahteva obvezno inicializacijo vrednosti spremenljivk pred uporabo, bolje obravnava napake v standardni knjižnici, privzeto uporablja koncept nespremenljivih referenc in spremenljivk, ponuja močno statično tipkanje za zmanjšanje logičnih napak.

Glavne novosti:

  • Za števila s plavajočo vejico tipa f32 in f64 so implementirane algebrske metode za seštevanje, odštevanje, množenje, deljenje in ostanek, ki izvajajo optimizacije, podobne možnosti "-ffast-math" v prevajalnikih C/C++. Te metode omogočajo spreminjanje vrstnega reda operacij, kadar je to potrebno za optimizacije, kot je vektorizacija zanke. Na primer, pri izračunu "a + b + c + d" z uporabo običajnega seštevanja bo prevajalnik vedno izvedel izračun v istem vrstnem redu: "((a + b) + c) + d", vendar lahko z uporabo metode algebraic_add izraz združi kot "(a + b) + (c + d)" in vzporedno izvede "(a + b)" in "(c + d)" z uporabo ukazov SIMD. Cena uporabe algebrskih metod je nedeterminizem rezultatov izračuna, ki se lahko spreminjajo znotraj meje napake.
  • Vsi primitivni celoštevilski tipi imajo vgrajeno metodo "format_into" za pretvorbo števil v nize, ki jo je mogoče uporabiti namesto paketa itoa. Kot parameter se poda medpomnilnik NumBuffer. , katerega velikost je zagotovljeno zadostna za zapis katere koli vrednosti uporabljenega tipa v desetiški obliki. Izhod je oblikovan niz &str, katerega življenjska doba je vezana na medpomnilnik.
  • Interakcija med pasom ManuallyDrop in pametnim kazalcem Box ne povzroča več nedefiniranega vedenja.
  • Nov del API-ja je bil premaknjen v kategorijo stabilnega, vključno s stabiliziranimi metodami in implementacijami lastnosti:
    • str::substr_range
    • [T]::podrezinski_obseg
    • jedro::fmt::številčni_medpomnilnik
    • <{celo število}>::format_into
    • Pošlji/sinhroniziraj za std::process::CommandArgs
    • {fN}::algebraično_dodajanje
    • {fN}::algebraični_sub
    • {fN}::algebraic_mul
    • {fN}::algebraični_div
    • {fN}::algebraični_rem
    • Neničelno<{celo število}>::from_str_radix
    • Niz::from_utf16le
    • String::from_utf16le_lossy
    • Niz::from_utf16be
    • String::from_utf16be_lossy
    • [T]::strip_circumfix
    • str::strip_circumfix
    • Atomsko ::from_mut
    • Atomsko ::get_mut_slice
    • Atomsko ::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 bile premaknjene na drugo raven podpore, ki vključuje garancijo za gradnjo, ne pa tudi garancije za uspešno opravljen testni paket.
  • Dodana je bila podpora za platformi powerpc64-unknown-linux-gnuelfv2 in aarch64-unknown-linux-pauthtest, ki sta zdaj na 3. stopnji podpore. 3. stopnja vključuje osnovno podporo, ne pa avtomatiziranega testiranja, uradnih izdaj gradenj ali preverjanja gradenj.

Poleg tega je bil ogrožen priljubljeni paket crate arrayref, ki je bil v zadnjih 90 dneh prenesen več kot 53 milijonovkrat in ga kot odvisnost uporablja 403 paketov. Napadalci so v repozitorij crates.io objavili nove pakete z zlonamerno kodo: proc-macro1, proc-macro-en, aovine, arone, aronenao in tinymember. Nato so bile v repozitorij objavljene nove izdaje arrayref 0.3.10, internment 0.8.7 in append-only-vec 0.1.9, pri čemer je bil zlonamerni paket proc-macro1 dodan kot odvisnost. Zlonamerna različica paketa arrayref je bila objavljena 20. avgusta ob 10:15 (MSK) in je ostala aktivna do 11:41, nato pa so jo skrbniki crates.io odstranili.

Vzdrževalca paketa arrayref še niso kontaktirali, da bi razjasnili situacijo, vendar se domneva, da so napadalci prestregli njihove poverilnice. V paketu proc-macro1 je bila v skriptu za gradnjo prisotna zlonamerna sprememba, ki je naložila izvedljivo datoteko iz zunanjega imenika. strežnikaPrenesena datoteka je bila shranjena kot /tmp/rust-setup v sistemih Unix in v Windows — %TEMP%\rust-setup.ps1 ali %TEMP%\rust-setup-launch.vbs.

Vir: opennet.ru

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