Les garanties de sécurité de la mémoire sont l’un des arguments de vente de Rust ; cependant, Rust n’est pas immunisé contre les bogues et les vulnérabilités. Comme le vérificateur d’emprunts de Rust applique le modèle de propriété, il y a un léger compromis dans le temps de compilation pendant les vérifications de sécurité.
Rust fournit une fonctionnalité pour contourner les contrôles de sécurité dans une fonction appelée « Unsafe Rust » qui vous permet d’éviter ces contrôles de sécurité à des fins de performance. Unsafe Rust est un outil puissant pour écrire des systèmes logiciels de bas niveau efficaces avec Rust.
Comprendre Unsafe Rust
Unsafe Rust est un ensemble de fonctionnalités que vous pouvez utiliser pour contourner les garanties de sécurité de Rust en échange d’un plus grand contrôle sur la mémoire. Les fonctionnalités non sûres de Rust comprennent les pointeurs bruts, les fonctions non sûres et les traits non sûrs.
L’objectif de unsafe Rust est de fournir aux développeurs la possibilité d’écrire du code système de bas niveau sans sacrifier les performances. Vous pouvez accéder aux ressources mémoire et les manipuler directement et augmenter les performances de votre application avec unsafe Rust.
Unsafe Rust est particulièrement utile pour le développement de systèmes d’exploitation, la programmation de réseaux et le développement de jeux, où les performances sont essentielles. Dans ces contextes, vous aurez besoin d’un contrôle fin sur la disposition de la mémoire du programme et sur le comportement du code. Unsafe Rust vous permet d’y parvenir en fournissant des abstractions de bas niveau pour l’implémentation d’algorithmes et de structures de données complexes.
Travailler avec Unsafe Rust
Les blocs Unsafe permettent d’utiliser les fonctionnalités de Rust qui ne sont pas sûres. Vous utiliserez les blocs non sécurisé pour définir des blocs non sécurisés contenant du code Rust valide.
Voici comment utiliser un bloc unsafe pour accéder directement à la mémoire afin de modifier une valeur :
fn main() {
let mut x = 10;
unsafe {
let raw = &mut x as *mut i32;
*raw = 20;
}
println!("x is now {}", x);
}
Le bloc x est un entier mutable. Dans le unsafe le pointeur brut vers x attribue une nouvelle valeur à x. Le code dans le non sécurisé est valide mais non sûr, et n’était pas dans un bloc non sûr ; le programme se bloque.
De plus, vous pouvez définir des fonctions non sûres en ajoutant l’élément non sécurisé avant le mot-clé fn dans vos déclarations de fonctions.
unsafe fn perform_unsafe_operation() {
// Your unsafe code here
}
Vous aurez besoin d’un bloc non sécurisé pour appeler des fonctions non sécurisées dans d’autres parties de votre programme.
fn main() {
unsafe {
perform_unsafe_operation();
}
}
Marquer les fonctions avec la balise non sécurisé Le mot-clé « unsafe » ne signifie pas que la fonction est intrinsèquement dangereuse. Il indique que la fonction contient du code dont l’utilisation nécessite une prudence accrue.
Les risques associés à l’utilisation de la rouille non sécurisée
L’utilisation incorrecte de unsafe Rust peut entraîner des erreurs de mémoire, des courses de données et d’autres vulnérabilités en matière de sécurité. Il est donc essentiel de comprendre les risques tout en suivant les meilleures pratiques associées à unsafe Rust pour écrire un code sûr et performant.
Le principal risque associé à unsafe Rust est le potentiel de bogues liés à la mémoire qui peuvent conduire à des plantages, des vulnérabilités de sécurité et des comportements de code non définis.
Les erreurs de mémoire se produisent lorsqu’un programme tente d’accéder à la mémoire de manière anormale ; le programme finit par se bloquer ou se comporter de manière imprévisible.
Les courses aux données se produisent lorsque deux ou plusieurs fils de programme accèdent simultanément à la même partie de la mémoire et qu’au moins l’un des fils modifie la valeur en mémoire, provoquant ainsi un comportement inattendu du programme.
Vous pouvez déclencher des débordements de mémoire tampon en utilisant Rust de manière inappropriée. Les débordements de mémoire tampon se produisent lorsqu’un programme écrit des données au-delà de la fin d’une mémoire tampon. Les débordements de tampon peuvent provoquer un plantage du programme ou permettre à des attaquants d’exécuter du code arbitraire.
Une autre vulnérabilité est l’utilisation après la libération (UAF) qui se produit lorsqu’un programme accède à la mémoire après la désallocation de la valeur. L’UAF peut entraîner un comportement imprévisible du programme et potentiellement introduire des vulnérabilités de sécurité.
En raison de ces vulnérabilités, lorsque l’on travaille avec du Rust non sécurisé, il est essentiel de bien comprendre la propriété de Rust et la façon dont le modèle d’emprunt fonctionne en Rust, tout en suivant les meilleures pratiques.
La gestion de la mémoire en Rust est flexible
Le modèle de propriété de Rust gère la mémoire automatiquement, ce qui réduit le risque de bogues liés à la mémoire. L’emprunt permet à plusieurs variables d’accéder aux mêmes ressources mémoire sans conflits simultanés.
La gestion de la mémoire de Rust offre la flexibilité, la sécurité et la performance nécessaires au développement de logiciels modernes, faisant de Rust un outil puissant pour écrire un code efficace et fiable.
