Rust 1.98.0-utgivelse: Kompromittering av arrayref-pakken, som har blitt lastet ned 53 millioner ganger på 3 måneder

Programmeringsspråket Rust 1.98, grunnlagt av Mozilla-prosjektet, men nå utviklet under ledelse av den uavhengige, ideelle organisasjonen Rust Foundation, er lansert. Språket fokuserer på minnesikkerhet og tilbyr verktøy for å oppnå høy parallellitet i oppgaveutførelsen, samtidig som det ikke bruker en søppelsamler og runtime (kjøretiden er redusert til grunnleggende initialisering og vedlikehold av standardbiblioteket).

Rusts minnehåndteringsmetoder er utformet for å eliminere feil i pekermanipulering og beskytte mot problemer som oppstår fra lavnivåminnehåndtering, for eksempel tilgang til minne etter at det har blitt frigjort, dereferanse av nullpekere, bufferoverløp og så videre. Prosjektet utvikler Cargo-pakkebehandleren for å distribuere biblioteker, legge til rette for bygg og administrere avhengigheter. crates.io-depotet vedlikeholdes for å være vert for biblioteker.

Minnesikkerhet er gitt i Rust på kompileringstidspunktet gjennom referansesjekking, holde styr på objekteierskap, holde styr på objektlevetider (scopes), og vurdere riktigheten av minnetilgang under kjøring av kode. Rust gir også beskyttelse mot heltallsoverløp, krever obligatorisk initialisering av variabelverdier før bruk, håndterer feil bedre i standardbiblioteket, bruker konseptet med uforanderlige referanser og variabler som standard, tilbyr sterk statisk skriving for å minimere logiske feil.

Hovedinnovasjoner:

  • For flyttalltypene f32 og f64 er algebraiske metoder for addisjon, subtraksjon, multiplikasjon, divisjon og rest implementert, og implementerer optimaliseringer som ligner på alternativet "-ffast-math" i C/C++-kompilatorer. Disse metodene tillater endring av rekkefølgen på operasjoner når det er nødvendig for optimaliseringer som løkkevektorisering. For eksempel, når man beregner "a + b + c + d" ved hjelp av vanlig addisjon, vil kompilatoren alltid utføre beregningen i samme rekkefølge: "((a + b) + c) + d", men ved å bruke algebraisk_add-metoden kan den gruppere uttrykket som "(a + b) + (c + d)" og utføre "(a + b)" og "(c + d)" parallelt ved hjelp av SIMD-instruksjoner. Prisen ved å bruke algebraiske metoder er ikke-bestemmelsen i beregningsresultatene, som kan variere innenfor feilmarginen.
  • Alle primitive heltallstyper har en innebygd "format_into"-metode for å konvertere tall til strenger, som kan brukes i stedet for itoa-pakken. En NumBuffer-buffer sendes som en parameter. , hvis størrelse garantert er tilstrekkelig til å skrive en hvilken som helst verdi av den brukte typen i desimalform. Utdataene er en formatert streng &str, hvis levetid er bundet til bufferen.
  • Samhandling mellom ManuallyDrop-selen og Box-smartpekeren resulterer ikke lenger i udefinert oppførsel.
  • En ny del av API har blitt flyttet til kategorien stabil, inkludert metodene og implementeringene av egenskaper er stabilisert:
    • str::substr_range
    • [T]::delsegmentområde
    • kjerne::fmt::NumBuffer
    • <{heltall}>::format_inn
    • Send/synkroniser for std::process::CommandArgs
    • {fN}::algebraisk_add
    • {fN}::algebraisk_undergruppe
    • {fN}::algebraisk_multifunksjon
    • {fN}::algebraisk_div
    • {fN}::algebraisk_rem
    • Ikke-null<{heltall}>::from_str_radix
    • Streng::from_utf16le
    • String::from_utf16le_lossy
    • Streng::from_utf16be
    • String::from_utf16be_lossy
    • [T]::strip_circumfix
    • str::strip_circumfix
    • Atomisk ::fra_mut
    • Atomisk ::hent_mut_slice
    • Atomisk ::from_mut_slice
    • std::range::legacy
  • Målplattformene thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf og thumbv8r-none-eabihf har blitt flyttet til det andre støttenivået, som inkluderer en byggegaranti, men ingen garantier for å bestå testpakken.
  • Støtte er lagt til for plattformene powerpc64-unknown-linux-gnuelfv2 og aarch64-unknown-linux-pauthtest, som nå har støtte på nivå 3. Nivå 3 inkluderer grunnleggende støtte, men inkluderer ikke automatisert testing, offisielle build-utgivelser eller build-verifisering.

I tillegg ble den populære crate-pakken arrayref, som har blitt lastet ned over 53 millioner ganger de siste 90 dagene og brukes som en avhengighet av 403 pakker, kompromittert. Angripere publiserte nye pakker som inneholder ondsinnet kode i crates.io-depotet: proc-macro1, proc-macro-en, aovine, arone, aronenao og tinymember. Deretter ble nye utgivelser av arrayref 0.3.10, internment 0.8.7 og append-only-vec 0.1.9 publisert i depotet, der hver utgivelse la til den ondsinnede proc-macro1-pakken som en avhengighet. Den ondsinnede versjonen av arrayref-pakken ble publisert 20. august kl. 10:15 (MSK) og forble aktiv til kl. 11:41, hvoretter den ble fjernet av crates.io-administratorer.

Vedlikeholderen av arrayref har ennå ikke blitt kontaktet for å avklare situasjonen, men det antas at deres legitimasjon ble fanget opp av angripere. I proc-macro1-pakken var en ondsinnet endring tilstede i byggeskriptet og lastet inn en kjørbar fil fra en ekstern katalog. serverDen nedlastede filen ble lagret som /tmp/rust-setup på Unix-systemer, og i Windows — %TEMP%\rust-setup.ps1 eller %TEMP%\rust-setup-launch.vbs.

Kilde: opennet.ru

Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Kjøp pålitelig webhotell med DDoS-beskyttelse, VPS VDS-servere | ProHoster