Sortie de Rust 1.98.0 : Compromission du package arrayref, téléchargé 53 millions de fois en 3 mois.

Le langage de programmation Rust 1.98, fondé par le projet Mozilla mais désormais développé sous l'égide de la Fondation Rust, une organisation indépendante à but non lucratif, est disponible. Ce langage met l'accent sur la sécurité de la mémoire et fournit des outils permettant d'obtenir un parallélisme élevé dans l'exécution des tâches, sans recourir à un ramasse-miettes ni à un environnement d'exécution (l'environnement d'exécution se limitant à l'initialisation et à la maintenance de la bibliothèque standard).

Les méthodes de gestion de la mémoire de Rust sont conçues pour éliminer les erreurs de manipulation de pointeurs et protéger contre les problèmes liés à la gestion de la mémoire de bas niveau, tels que l'accès à de la mémoire libérée, le déréférencement de pointeurs nuls, les dépassements de tampon, etc. Le projet développe le gestionnaire de paquets Cargo pour distribuer les bibliothèques, faciliter les compilations et gérer les dépendances. Le dépôt crates.io est maintenu pour l'hébergement des bibliothèques.

La sécurité de la mémoire est fournie dans Rust au moment de la compilation grâce à la vérification des références, au suivi de la propriété des objets, au suivi des durées de vie des objets (portées) et à l'évaluation de l'exactitude de l'accès à la mémoire pendant l'exécution du code. Rust fournit également une protection contre les débordements d'entiers, nécessite une initialisation obligatoire des valeurs de variables avant utilisation, gère mieux les erreurs dans la bibliothèque standard, applique le concept de références et de variables immuables par défaut, propose un typage statique fort pour minimiser les erreurs logiques.

Principales nouveautés :

  • Pour les types à virgule flottante f32 et f64, des méthodes algébriques d'addition, de soustraction, de multiplication, de division et de calcul du reste sont implémentées, offrant des optimisations similaires à l'option « -ffast-math » des compilateurs C/C++. Ces méthodes permettent de modifier l'ordre des opérations lorsque cela s'avère nécessaire pour des optimisations telles que la vectorisation des boucles. Par exemple, lors du calcul de « a + b + c + d » par addition classique, le compilateur effectuera toujours le calcul dans le même ordre : « ((a + b) + c) + d ». En revanche, grâce à la méthode `algebraic_add`, il peut regrouper l'expression sous la forme « (a + b) + (c + d) » et exécuter « (a + b) » et « (c + d) » en parallèle à l'aide d'instructions SIMD. L'utilisation de méthodes algébriques a pour inconvénient le non-déterminisme des résultats de calcul, qui peuvent varier dans la marge d'erreur.
  • Tous les types entiers primitifs possèdent une méthode intégrée « format_into » permettant de convertir les nombres en chaînes de caractères, et qui peut être utilisée à la place du package itoa. Un tampon NumBuffer est passé en paramètre. Sa taille est garantie suffisante pour écrire n'importe quelle valeur du type utilisé sous forme décimale. La sortie est une chaîne formatée `&str`, dont la durée de vie est liée à celle du tampon.
  • L'interaction entre le harnais ManuallyDrop et le pointeur intelligent Box ne provoque plus de comportement indéfini.
  • Une nouvelle partie de l'API a été déplacée vers la catégorie stable, dont les méthodes et les implémentations des traits ont été stabilisées :
    • str::substr_range
    • [T]::subslice_range
    • noyau::fmt::NumBuffer
    • <{entier}>::format_into
    • Envoi/Synchronisation pour std::process::CommandArgs
    • {fN}::addition_algébrique
    • {fN}::algebraic_sub
    • {fN}::mul_algébrique
    • {fN}::algebraic_div
    • {fN}::algebraic_rem
    • NonZero<{integer}>::from_str_radix
    • Chaîne::from_utf16le
    • Chaîne::from_utf16le_lossy
    • Chaîne::from_utf16be
    • Chaîne::from_utf16be_lossy
    • [T]::strip_circumfix
    • str::strip_circumfix
    • Atomique ::from_mut
    • Atomique ::get_mut_slice
    • Atomique ::from_mut_slice
    • std::range::legacy
  • Les plateformes cibles thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf et thumbv8r-none-eabihf ont été déplacées vers le deuxième niveau de support, qui comprend une garantie de compilation mais aucune garantie de réussite de la suite de tests.
  • La prise en charge des plateformes powerpc64-unknown-linux-gnuelfv2 et aarch64-unknown-linux-pauthtest a été ajoutée et atteint désormais le niveau 3. Ce niveau inclut une prise en charge de base, mais ne comprend pas les tests automatisés, les versions officielles ni la vérification de la compilation.

De plus, le populaire paquet arrayref, téléchargé plus de 53 millions de fois ces 90 derniers jours et utilisé comme dépendance par 403 paquets, a été compromis. Des attaquants ont publié sur le dépôt crates.io de nouveaux paquets contenant du code malveillant : proc-macro1, proc-macro-en, aovine, arone, aronenao et tinymember. Par la suite, de nouvelles versions d'arrayref (0.3.10), internment (0.8.7) et append-only-vec (0.1.9) ont été publiées, chacune ajoutant le paquet malveillant proc-macro1 comme dépendance. La version malveillante d'arrayref a été publiée le 20 août à 10h15 (MSK) et est restée active jusqu'à 11h41, heure à laquelle elle a été supprimée par les administrateurs de crates.io.

Le responsable de la maintenance d'arrayref n'a pas encore été contacté pour clarifier la situation, mais il semblerait que ses identifiants aient été interceptés par des attaquants. Dans le paquet proc-macro1, une modification malveillante était présente dans le script de compilation et chargeait un fichier exécutable depuis un répertoire externe. serveurLe fichier téléchargé a été enregistré sous le nom /tmp/rust-setup sur les systèmes Unix, et dans Windows — %TEMP%\rust-setup.ps1 ou %TEMP%\rust-setup-launch.vbs.

Source: opennet.ru

Achetez un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Achetez un hébergement web fiable avec protection DDoS, serveurs VPS et VDS | ProHoster