Izdanje Rust 1.98.0: Kompromitacija paketa arrayref, koji je preuzet 53 milijuna puta u 3 mjeseca

Objavljen je programski jezik Rust 1.98, koji je osnovao Mozilla projekt, ali se sada razvija pod pokroviteljstvom neovisne neprofitne organizacije Rust Foundation. Jezik se fokusira na sigurnost memorije i pruža alate za postizanje visokog paralelizma izvršavanja zadataka, a pritom se ne koristi sakupljač smeća i okruženje za izvođenje (izvođenje je svedeno na osnovnu inicijalizaciju i održavanje standardne biblioteke).

Rustove metode upravljanja memorijom osmišljene su kako bi se uklonile pogreške u manipulaciji pokazivačima i zaštitile od problema koji proizlaze iz upravljanja memorijom na niskoj razini, kao što su pristup memoriji nakon što je oslobođena, dereferenciranje nultih pokazivača, prekoračenje međuspremnika i tako dalje. Projekt razvija upravitelj paketa Cargo za distribuciju biblioteka, olakšavanje izgradnje i upravljanje ovisnostima. Repozitorij crates.io održava se za hosting biblioteka.

Sigurnost memorije osigurana je u Rustu tijekom kompajliranja provjerom referenci, praćenjem vlasništva objekta, praćenjem životnih vijekova objekta (opsega) i procjenom ispravnosti pristupa memoriji tijekom izvođenja koda. Rust također pruža zaštitu od prekoračenja cjelobrojnih brojeva, zahtijeva obaveznu inicijalizaciju vrijednosti varijabli prije upotrebe, bolje obrađuje pogreške u standardnoj biblioteci, primjenjuje koncept nepromjenjivih referenci i varijabli prema zadanim postavkama, nudi snažno statično tipkanje za smanjenje logičkih pogrešaka.

Glavne inovacije:

  • Za tipove s pomičnim zarezom f32 i f64 implementirane su algebarske metode za zbrajanje, oduzimanje, množenje, dijeljenje i ostatak, implementirajući optimizacije slične opciji "-ffast-math" u C/C++ kompajlerima. Ove metode omogućuju promjenu redoslijeda operacija kada je to potrebno za optimizacije poput vektorizacije petlji. Na primjer, prilikom izračuna "a + b + c + d" korištenjem regularnog zbrajanja, kompajler će uvijek izvršiti izračun istim redoslijedom: "((a + b) + c) + d", ali korištenjem metode 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 korištenja algebarskih metoda je nedeterminizam rezultata izračuna, koji mogu varirati unutar margine pogreške.
  • Svi primitivni cjelobrojni tipovi imaju ugrađenu metodu "format_into" za pretvaranje brojeva u nizove znakova, koja se može koristiti umjesto paketa itoa. NumBuffer međuspremnik se prosljeđuje kao parametar. , čija je veličina zajamčeno dovoljna za zapis bilo koje vrijednosti korištenog tipa u decimalnom obliku. Izlaz je formatirani niz &str, čiji je životni vijek vezan za međuspremnik.
  • Interakcija između kabelskog snopa ManuallyDrop i pametnog pokazivača Box više ne rezultira nedefiniranim ponašanjem.
  • Novi dio API-ja premješten je u kategoriju stabilnih, uključujući metode i implementacije karakteristika koje su stabilizirane:
    • str::substr_raspon
    • [T]::podsjeka_raspon
    • core::fmt::NumBuffer
    • <{cijeli broj}>::format_u
    • Pošalji/Sinkroniziraj za std::process::CommandArgs
    • {fN}::algebraično_dodavanje
    • {fN}::algebraic_sub
    • {fN}::algebarski_mul
    • {fN}::algebraički_div
    • {fN}::algebarski_rem
    • Nenula<{cijeli broj}>::from_str_radix
    • String::from_utf16le
    • String::from_utf16le_lossy
    • String::from_utf16be
    • String::from_utf16be_lossy
    • [T]::strip_circumfix
    • str::strip_circumfix
    • Atomski ::from_mut
    • Atomski ::get_mut_slice
    • Atomski ::from_mut_slice
    • std::range::legacy
  • Ciljne platforme thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf i thumbv8r-none-eabihf premještene su na drugu razinu podrške, koja uključuje jamstvo izrade, ali ne i jamstvo za prolaz testnog paketa.
  • Dodana je podrška za platforme powerpc64-unknown-linux-gnuelfv2 i aarch64-unknown-linux-pauthtest, koje su sada na razini podrške 3. Razina 3 uključuje osnovnu podršku, ali ne uključuje automatizirano testiranje, službena izdanja ili provjeru verzija.

Osim toga, kompromitiran je popularni paket arrayref, koji je preuzet više od 53 milijuna puta u posljednjih 90 dana i koji 403 paketa koriste kao ovisnost. Napadači su u repozitorij crates.io objavili nove pakete koji sadrže zlonamjerni kod: proc-macro1, proc-macro-en, aovine, arone, aronenao i tinymember. Nakon toga, u repozitorij su objavljena nova izdanja arrayref 0.3.10, internment 0.8.7 i append-only-vec 0.1.9, a svako od njih dodaje zlonamjerni paket proc-macro1 kao ovisnost. Zlonamjerna verzija paketa arrayref objavljena je 20. kolovoza u 10:15 (MSK) i ostala je aktivna do 11:41, nakon čega su je administratori crates.io uklonili.

Održavatelj arrayrefa još nije kontaktiran radi pojašnjenja situacije, ali vjeruje se da su napadači presreli njihove vjerodajnice. U paketu proc-macro1, zlonamjerna promjena bila je prisutna u skripti za izgradnju i učitavala je izvršnu datoteku iz vanjskog direktorija. poslužiteljaPreuzeta datoteka je spremljena kao /tmp/rust-setup na Unix sustavima, a u Windows — %TEMP%\rust-setup.ps1 ili %TEMP%\rust-setup-launch.vbs.

Izvor: opennet.ru

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