Uscita di Rust 1.98.0. Compromissione del pacchetto arrayref, che conta 53 milioni di download in 3 mesi

È stato pubblicato il rilascio del linguaggio di programmazione Rust 1.98, originariamente sviluppato da Mozilla, ora supportato da un'organizzazione indipendente senza scopo di lucro, la Rust Foundation. Il linguaggio si concentra sulla gestione sicura della memoria e fornisce strumenti per raggiungere un elevato parallellismo nell'esecuzione delle attività, senza utilizzare un garbage collector e un runtime (il runtime si limita all'inizializzazione di base e alla gestione della libreria standard).

I metodi di gestione della memoria in Rust mirano a evitare errori nella manipolazione dei puntatori e a proteggere da problemi derivanti dal lavoro a basso livello con la memoria, come l'accesso a porzioni di memoria dopo che sono state liberate, la dereferenziazione di puntatori nulli, l'uscita dai limiti del buffer, ecc. Per la distribuzione delle librerie, la compilazione e la gestione delle dipendenze, viene sviluppato il gestore di pacchetti Cargo. È supportato un repository per la pubblicazione delle librerie, crates.io.

La gestione sicura della memoria in Rust è garantita durante la compilazione attraverso il controllo dei riferimenti, il tracciamento della proprietà degli oggetti, la considerazione del tempo di vita degli oggetti (ambiti di visibilità) e la valutazione della correttezza dell'accesso alla memoria durante l'esecuzione del codice. Rust fornisce anche strumenti per proteggere da overflow interi, richiede l'inizializzazione obbligatoria delle variabili prima dell'uso, gestisce meglio gli errori nella libreria standard, applica il concetto di riferimenti e variabili immutabili per impostazione predefinita e offre una forte tipizzazione statica per minimizzare gli errori logici.

Novità principali:

  • Per i tipi di numeri in virgola mobile f32 e f64 sono stati implementati metodi algebrici per somma, sottrazione, moltiplicazione, divisione e calcolo del resto, che realizzano ottimizzazioni simili all'opzione «-ffast-math» nei compilatori C/C++. Tali metodi consentono di modificare l'ordine delle operazioni quando necessario per ottimizzazioni, come la vettorializzazione dei cicli. Ad esempio, nel calcolo di «a + b + c + d» utilizzando la somma normale, il compilatore eseguirà sempre i calcoli in un ordine specifico «((a + b) + c) + d», mentre utilizzando il metodo algebraic_add potrà raggruppare l'espressione come «(a + b) + (c + d)» e calcolare «(a + b)» e «(c + d)» in parallelo utilizzando istruzioni SIMD. Il costo dell'applicazione dei metodi algebrici è l'indeterminatezza dei risultati del calcolo, che possono variare entro un margine di errore.
  • Per tutti i tipi primitivi interi è stato implementato un metodo integrato «format_into» per convertire i numeri in stringhe, che può essere utilizzato al posto del pacchetto itoa. Come parametro viene passato un buffer NumBuffer, la cui dimensione è garantita per essere sufficiente a registrare qualsiasi valore del tipo utilizzato in forma decimale. In output viene restituita una stringa formattata &str, la cui durata è collegata al buffer.
  • L'interazione tra il wrapper ManuallyDrop e il puntatore intelligente Box ora non porta a comportamenti indefiniti.
  • Una nuova serie di API è stata trasformata in versioni stabili, inclusi i metodi stabilizzati e le implementazioni delle trait:
    • str::substr_range
    • [T]::subslice_range
    • core::fmt::NumBuffer
    • ::format_into
    • Send/Sync per std::process::CommandArgs
    • {fN}::algebraic_add
    • {fN}::algebraic_sub
    • {fN}::algebraic_mul
    • {fN}::algebraic_div
    • {fN}::algebraic_rem
    • NonZero::from_str_radix
    • String::from_utf16le
    • String::from_utf16le_lossy
    • String::from_utf16be
    • String::from_utf16be_lossy
    • [T]::strip_circumfix
    • str::strip_circumfix
    • Atomic::from_mut
    • Atomic::get_mut_slice
    • Atomic::from_mut_slice
    • std::range::legacy
  • Le piattaforme target thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf e thumbv8r-none-eabihf sono state portate al secondo livello di supporto, che prevede una garanzia di compilazione, ma senza garanzie durante il superamento del set di test.
  • È stato aggiunto il supporto per le piattaforme powerpc64-unknown-linux-gnuelfv2 e aarch64-unknown-linux-pauthtest, per le quali è stato garantito il terzo livello di supporto. Il terzo livello comprende un supporto di base, ma senza test automatizzati, pubblicazione di build ufficiali e verifica della capacità di compilazione del codice.

Inoltre si segnala la compromissione del popolare pacchetto crate arrayref, che ha superato i 53 milioni di download negli ultimi 90 giorni ed è utilizzato come dipendenza da 403 pacchetti. Gli aggressori hanno inserito nel repository crates.io i nuovi pacchetti proc-macro1, proc-macro-en, aovine, arone, aronenao e tinymember, contenenti codice dannoso. Successivamente sono state pubblicate nuove versioni dei pacchetti arrayref 0.3.10, internment 0.8.7 e append-only-vec 0.1.9, nei quali è stata aggiunta come dipendenza il pacchetto dannoso proc-macro1. La versione dannosa del pacchetto arrayref è stata pubblicata il 20 agosto alle 10:15 (MSK) e ha avuto una durata fino alle 11:41, dopo di che è stata rimossa dagli amministratori di crates.io.

Non è stato possibile contattare il maintainer di arrayref per chiarire la situazione, ma si ipotizza che le sue credenziali siano state intercettate da malintenzionati. Nel pacchetto proc-macro1 la modifica dannosa era presente nello script di costruzione e scaricava un eseguibile da una fonte esterna. serverIl file caricato nei sistemi Unix veniva salvato come /tmp/rust-setup, mentre in Windows come %TEMP%\rust-setup.ps1 o %TEMP%\rust-setup-launch.vbs.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS - ProHoster