Se connecter

Note

RUST, l’avantage du Secure Code

Sommaire

  1. À la découverte de Rust

  2. Caractéristiques.

  3. RUST, mais pour quoi faire ?

  4. Comparaison avec d’autres langages.

  5. Avantages & Inconvénients

  6. Accompagnement au changement

  7. Exemple de projets basés sur Rust

  8. Et Linus Torvalds, il en pense quoi ?

1. À la découverte de Rust

Création de Rust

Crée à l’origine par Graydon Hoare. Rust est un langage de programmation OpenSource repris par Mozilla Research. Il a été conçu pour assurer des performances élevées et similaire à celles offertes par C et C++. La différence principale est que Rust accentue l’aspect sécurité du code.

En 2020, les développeurs Kernel de Linux propose même que Rust devienne le nouveau code du noyau Linux.

2. Caractéristiques

Les variables

Par défaut, en Rust les variables sont immuables. En effet, une fois qu’une variable est déclaré, il n’est alors plus possible d’en modifier la valeur. Il existe deux méthodes pour modifier la valeur d’une variable. Si la valeur d’une variable est définie à 1 et qu’on la modifie ensuite à 2, le programme ne se compilera pas. Le programme suivant me renverra donc une erreur lors de la compilation.

fn main() {
    let i = 1
    println!(i)
    i = 2
    println!(i)
}

La première est de redéclarer une variable avec le même nom. Cette technique est appelée le shadowing, nous cachons notre première variable avec la seconde.

Par exemple :

fn main() {
    let i = 1
    println!(i)
    let i = 2
    println!(i)
}

La seconde méthode est l’utilisation du terme mut lors de la définition d’une variable afin de spécifier que celle-ci est mutable.

let mut i = 1

Un exemple de code en Rust avec le fameux Hello World

// Ceci est la fonction principale
fn main() {
    // Les déclarations seront exécutées lorsque le binaire compilé sera appelé.

    // Affichera le texte sur le terminal
    println!("Hello World!");
}

println ! est une macro qui affiche du texte sur la console.

Note

Un binaire peut être généré en utilisant le compilateur Rust : rustc.

$ rustc hello.rs

rustc produira un binaire hello qui pourra être exécuté.

$ ./hello

Hello World!

Gestion de la mémoire

La gestion de la mémoire est également une des caractéristiques principale du langage RUST tandis qu’en comparaison, des rapports de chercheurs en sécurité pointent du doigt la mauvaise gestion de la mémoire des langages C et C++. Les dépassements de mémoire tampon, allocations non libérées, accès à des zones mémoire invalides ou libérées, sont la cause de presque 16 % des 2288 vulnérabilités qui ont affecté le noyau Linux en 20 ans.

Rust possède une gestion fine de la mémoire, elle est gérée de manière autonome une fois créée. Lorsque vous allouez de la mémoire, vous n’avez jamais besoin de la libérer. Quand vous souhaitez la libérer, Rust s’en occupe automatiquement.

Il existe deux types de mémoires :

Stack (Pile):
  • La mémoire statique y est allouée par défaut et il existe une pile par thread.

  • Les fonctions et les variables y sont stockées.

Heap (Tas):
  • C’est le plus gros bloc de mémoire qui stocke l’ensemble des données dynamiques.

  • N’importe quel bloc de cette espace peut être alloué ou libéré à n’importe quel moment.

Il faut également savoir que dans un langage managé, un garbage collector (ramasse-miette) va vérifier régulièrement la liste des allocations mémoires déjà effectuées pour savoir si ces blocs mémoires sont encore utilisés. Le temps nécessaire à cette vérification n’est donc pas alloué à l’exécution du programme et va donc ralentir son exécution. Le compilateur Rust élimine le besoin d’un garbage collector et vérifie lors de la compilation si un problème de mémoire est présent dans le programme. S’il détecte une erreur sur la gestion de la mémoire, le programme ne sera pas compilé.

La compilation

Rust est un langage compilé, le code source sera donc transformé en code machine avant d’être exécuté par un ordinateur. Le principal avantage est qu’il n’est ainsi pas nécessaire d’appeler un programme annexe pour son exécution et sera alors plus rapide.

Certains outils nous seront utiles pour la compilation de programmes codés en Rust :
  • Rustfix : Outil permettant la réparation des avertissements lors de la compilation ou permettant la transition d’édition.

  • Clippy : Outil de vérification de bugs, lisibilité du code et problèmes de performances.

  • Cargo : Gestionnaire de paquetage de Rust.

Attention

Pour le moment, la sécurité de cargo repose sur la bonne sécurité du site web crates.io ainsi que celle du dépôt, hébergé sur GitHub, contenant l’index du registre de crates. Pour les cas les plus sensibles, il peut être préférable d’opter pour une méthode d’installation alternative pour les dépendances.

Rust garanti qu’aucune erreur ne sera présente lors de l’exécution du programme. Pour cela la vérification lors de la compilation est intransigeante, aucune erreur n’est permise.

Lors de la compilation, une des étapes primordiale est le « Borrow Checking ». Le borrow checker est la « sauce secrète » de ce langage. Il est responsable du bon respect d’un grand nombre de propriétés définies.
  • Les variables soient initialisées avant d’être utilisées.

  • On ne peut pas déplacer une valeur pendant qu’elle est empruntée.

  • On ne peut pas muter un emplacement pendant qu’il est emprunté de manière immuable.

3. RUST, mais pour quoi faire ?

La réelle réponse est : A peu près tout.

Si la sécurité de la mémoire vous préoccupe, alors Rust satisfera vos besoins. Actuellement, la majorité des acteurs du monde de Rust proviennent du C ou du C++. Rust va venir implémenter des composants pour simplifier le travail du développeur notamment, encore une fois, la gestion de la mémoire ou encore le téléchargement et l’installation des dépendances lier à votre projet.

RUST a été créé pour être un langage « haute-performance ». Il peut être combiné à d’autres technologies, particulièrement lors de la création d’application ou de sites web. Certains framework web comme Rocket permettent de faciliter la construction d’application web sécurisée.

Il est également possible de développer des jeux entièrement ou partiellement en Rust. Un Github est même disponible pour populariser le langage Rust dans le monde du developpement de jeu vidéo.

Enfin, si vous souhaitez vous lancer dans le développement embarqué avec Rust, The Embedded Rust Book est également disponible.

A qui s’adresse Embedded Rust ?

Embedded Rust est destiné à tous ceux qui veulent faire de la programmation embarquée tout en profitant des concepts de plus haut niveau et des garanties de sécurité que le langage Rust fournit.

4. Les différences avec des langages moins sécurisés

Si nous comparons Rust avec le C++, nous pouvons lister leurs propres avantages et inconvénients. Les principaux avantages du C++ sont dus à sa grande communauté et sa longévité, C++ ayant plus de 30 ans. C++ sera donc votre choix si vous souhaitez un langage supporté par de nombreux compilateurs et possédant un large choix de framework. D’autre part, si vous cherchez un code sûr que vous souhaitez éviter les fuites de mémoire et des comportements indéfinis alors, vous opterez pour Rust. La sémantique simple et bien définie de Rust facilite la prévention des comportements indésirables, ce qui favorise la sécurisation du code.

Le tableau ci-dessous, issu d’une étude réalisée en 2017, montre que le C reste tout de même plus optimisé en termes de performance. Il reste supérieur sur l’énergie consommée, sur le temps d’exécution et sur la mémoire occupée. Mais, comme dans la vie, on ne peut pas tout avoir ! Si le Rust reste légèrement moins performant sur certains points, la différence est vite oubliée avec les gains en sécurité grâce notamment à la gestion de la mémoire.

5. Avantages & Inconvénients

Avantages

  • Gestion de la mémoire autonome.

  • Développement multiplateforme.

  • Communauté en forte croissance.

  • Documentation.

Inconvénients

  • Temps de compilation plus élevé en raison des nombreuses vérifications du code.

  • Certaines librairies peuvent ne pas être disponibles.

  • Nouvelle technologie impliquant des formations et un accompagnement pour les équipes de développement.

6. Côté PSSI, un changement qui peut faire peur

L’implémentation du Rust dans un milieu professionnel impliquera une modification de la Politique de Sécurité des Systèmes d’information (PSSI). En effet, Rust renforçant la sécurité de son système d’information, il est intéressant de définir les règles d’utilisation de ce langage si celui-ci est adopté par une entreprise. Par exemple, nous pouvons imaginer en incorporant dans notre PSSI l’obligation d’un code entièrement Safe et en empêchant la mise en production de code utilisant le paramètre Unsafe.

L’Agence Nationale de la Sécurité des Systèmes d’Information (ANSSI) fournit un guide de programmation pour le développement d’applications en Rust avec des règles et des bonnes pratiques pour un passage en production d’Application en Rust.

Il est possible d’interfacer Rust avec d’autres langages, permettant aux développeurs de ne pas avoir à tout retravailler, mais de générer efficacement du code pour utiliser les fonctions Rust dans d’autres environnements (C ou C++ par exemple). Cette interopérabilité permettra aux entreprises de progresser pas-à-pas dans leurs migrations vers Rust.

Le passage à Rust peut représenter également un coup financier, notamment pour la formation des développeurs. Compter en moyenne 2000 € par personne pour une formation de trois jours. Mais la sécurité d’un système d’information à forcément un prix et les enjeux actuels forcent les RSSI à mettre des mesures en place de plus en plus poussées. Le coût d’une migration vers Rust d’une application peut représenter un coût élevé pour une entreprise mais cela peut s’avérer nécessaire en fonction du domaine d’activité de celle-ci. Lorsque l’on regarde les langages de programmation, on se rend compte du nombre croissant de vulnérabilités sur chacun d’eux, augmentant ainsi la surface d’attaque des entreprises les utilisant. La sécurisation du code est donc un enjeu majeur pour quiconque souhaite sécuriser son environnement.

../_images/vuln_overtime.png

Au fil des ans, le C a montré un nombre de vulnérabilités très important. C’est le langage le plus vulnérables avec près de 47% de toutes les vulnérabilités connues sur les langages de programmation avec de très nombreuses des vulnérabilités concernant la mémoire (buffer overflow etc..). L’OWASP, la communauté travaillant pour améliorer la sécurité des logiciels, recommande également l’utilisation de langages managés comme Rust afin de se prémunir des problèmes par rapport à la qualité du code des applications.

Le sondage « Stack Overflow Developer Survey 2022 » montre que le Rust est adopté par une grande partie de la communauté des développeurs. Ce sondage montre que 87% des développeurs apprécie travailler avec Rust et souhaite continuer à l’utiliser. C’est la septième année que Rust se retrouve en tête de classement.

Rust a donc encore de beaux jours devant lui.

7. Exemple de projets basés sur Rust

Liste de projet utilisant Rust :

  • Discord

  • Dropbox

  • Firefox

  • Android

  • Microsoft : Composants Windows

  • AWS

  • Facebook

Cela nous montre que le langage est adopté par de grandes entreprises qui ont su voir en Rust un moyen rapide et efficace de sécurisé leurs codes et donc les applications qu’ils proposent.

8. Et Linus Torvalds, il en pense quoi ?

Linus Torvalds voit les avantages de ce projet. Bien qu’il encourage une approche lente mais régulière de l’introduction de Rust dans Linux, il ajoute que l’utilisation d’interfaces Rust pour les pilotes et d’autres programmes non essentiels du noyau est la suite logique.

« Je suis convaincu que cela va arriver. Ce ne sera peut-être pas Rust, mais il arrivera que nous ayons différents langages pour écrire ce genre de choses, et le C ne sera pas le seul.»

Linux confirme son intérêt pour Rust, le langage de programmation conçu par Mozilla. Une mise à jour vient officialiser la place de Rust comme second langage du noyau Linux.

Source :