Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

L'équipe Microsoft Security Response Center recommande l'utilisation de Rust
Comme approche proactive pour un code plus sécurisé

Le , par Stéphane le calme

52PARTAGES

5  0 
L'équipe Microsoft Security Response Center(MSRC) identifie, surveille, répond et résout les incidents de sécurité et les vulnérabilités dans les logiciels Microsoft. Cela aide les clients de l’éditeur à gérer les risques de sécurité, à créer des capacités de défense basées sur la communauté et à développer les meilleures pratiques adoptées par d’autres acteurs de l’industrie du logiciel.

Depuis 2004, le MSRC trie toutes les vulnérabilités de sécurité Microsoft signalées. Il ressort de tout cela un fait étonnant: comme l'a expliqué Matt Miller lors de sa présentation à BlueHat IL en 2019, la majorité des vulnérabilités corrigées et associées à une CVE sont causées par des développeurs qui ont inséré par inadvertance des bogues de corruption de mémoire dans leurs codes C et C ++. Gavin Thomas, Principal Security Engineering Manager au sein de la section MSRC, note qu’alors que Microsoft augmente sa base de code et utilise plus de logiciels Open Source dans son code, ce problème ne s’améliore pas, il s’aggrave.


Environ 70% des vulnérabilités que Microsoft attribue à un CVE chaque année continuent de poser des problèmes de sécurité de la mémoire

Tant d'outils, si peu de temps

Ce n’est pas qu’il n’existe aucun outil pour aider les développeurs à écrire du code sécurisé. Le développeur dispose d’une pléthore d’outils : les outils d’analyse statique étonnamment complexes (qu’il faut au moins un mois ou deux pour apprendre), de fuzzing (ou test de données aléatoires), les analyses des défauts ainsi que les résolutions des contraintes. Il existe également des instructions pour aider les développeurs à adopter des pratiques sécurisées: le cycle de vie du développement sécurisé, des encyclopédies de directives de codage, des heures de révision du code, de nombreuses formations et des instructions de modélisation des menaces. MSRC a modifié les compilateurs et créé des mesures d’atténuation pour protéger les développeurs des erreurs. Visual Studio a même des lignes rouges ondulées pour souligner les potentiels défauts.

Ce n'est pas tout. Thomas affirme que lorsqu'une entité interne ou externe découvre une faille de sécurité, l’équipe est là pour le développeur, prête à la signaler et prête à les aider dans leur post-mortem (l’examen a posteriori afin de déterminer les causes d'un succès ou d'un échec qui permet de tirer des leçons qui pourront être réutilisées dans les prochains développements / projets).

Mais qu'est-ce que le développeur peut attendre de plus de l'ingénierie de la sécurité ? Pour commencer, ils voudront peut-être consacrer moins d'effort à l'apprentissage d'outils et de processus pour créer des fonctionnalités sans faille de sécurité.

Les langages protégés contre les vulnérabilités de corruption de mémoire

La tâche principale d’un développeur n’est pas de s’inquiéter pour la sécurité mais de faire du travail sur les fonctionnalités. Plutôt que d’investir dans de plus en plus d’outils, ainsi que dans la formation et les correctifs de vulnérabilité, qu’en est-il d’un langage de développement dans lequel ils ne peuvent pas introduire de problèmes de sécurité de la mémoire dans leur travail sur les fonctionnalités ? Cela aiderait à la fois les développeurs de fonctionnalités et les ingénieurs en sécurité, ainsi que les clients.

Un langage considéré comme protégé contre les vulnérabilités de corruption de la mémoire supprime le fardeau de la sécurité logicielle du développeur de fonctionnalités et le confie à celui-ci. Selon Thomas, plusieurs langages sont considérés comme « protégés » des vulnérabilités de corruption de la mémoire (et il cite C # comme étant l’un d’eux). Et d’assurer que de nombreuses équipes de développement de Microsoft ont embrassé le monde de l’utilisation de ces langages sécurisés pour écrire de nouvelles fonctionnalités liées aux clients.

« Le C ++ a des vertus qui le rendent attrayant et parfois essentiel : il est incroyablement rapide, il a une petite empreinte mémoire et disque, il est mature, son exécution est prévisible, sa plateforme est pratiquement inégalée et vous pouvez l’utiliser sans avoir à installer des composants supplémentaires. Si seulement les développeurs pouvaient avoir toutes les garanties de sécurité de la mémoire de langages comme .NET C # combinés à toute l’efficacité du C ++. Peut-être le pouvons-nous : l’un des langages de programmation les plus récents et les plus prometteurs qui répondent à ces exigences est le langage de programmation Rust initialement développé par Mozilla.

« Si, en tant qu'industrie, nous nous soucions vraiment de la sécurité, nous devrions nous concentrer sur les outils du développeur et ne pas être pris au dépourvu par tout l'attirail sécuritaire, le battage médiatique, les idéologies non axées sur les données et les méthodes et approches dépassées. Plutôt que de fournir des conseils et des outils pour remédier aux défauts, nous devrions nous efforcer d’empêcher le développeur d’introduire les défauts en premier lieu ».


Améliorer la sécurité, un écureuil à la fois

Thomas raconte :

« Alors que je me rendais au travail aujourd'hui, un écureuil a traversé la route devant moi. J'ai freiné rapidement et j'ai dû faire un écart pour l'éviter. Mais je n’ai pas touché l’écureuil et je ne me suis pas fait mal. Non pas parce que j'ai pris des mesures compliquées, mais parce que le système de freinage antiblocage m'empêchait de glisser dans l'autre voie et que ma ceinture de sécurité me protégeait dans mon siège. L'écureuil et moi-même étions mieux lotis à cause des dispositifs de sécurité intégrés à ma voiture qui m'ont permis d'éviter à la fois de le heurter et de causer un autre accident.

« Nous pouvons tirer des enseignements de la manière dont l'industrie automobile fait évoluer ses technologies de manière continue pour protéger les conducteurs et les usagers de la route. Le secteur de la sécurité des logiciels a le privilège de protéger le développeur de la même manière. Peut-être le temps est-il venu de supprimer les anciens langages non sécurisés et de passer à un langage de programmation système plus sûr et moderne ?

« Vous avez probablement déjà l'habitude de penser à Microsoft Security Response Center en tant que groupe répondant aux incidents et aux vulnérabilités. Nous sommes une organisation d’intervention, mais nous avons également un rôle proactif ».

Rust en bref

Rust est un langage statiquement typé initialement conçu par Graydon Hoare en 2006 dont le développement est désormais soutenu par Mozilla Research. Ses maîtres mots sont : sécurité, concurrence, rapidité et le doit en partie à son backend LLVM qui offre de nombreux outils destinés à l’optimisation des instructions.

La philosophie du langage est de fournir au développeur les outils pour écrire des programmes dont l’intégrité est plus difficilement mise en péril (p. ex. mauvaise gestion de la mémoire, de la fermeture des flux) qu’avec un autre langage qui ne se soucie pas forcément de ses problématiques dans sa conception, tout en s’efforçant d’entretenir une rapidité d’exécution redoutable.

En parallèle à cela, son compilateur est capable de détecter des bogues et/ou une mauvaise gestion des ressources avant que le programme ne s’exécute, ou même de diagnostiquer des data race lors de l’écriture de programmes conçus pour le multithread.


Grâce à sa performance, Rust se classe comme un « concurrent » direct à C et C++ (bien que les communautés ne soient en réelle « confrontation », au contraire) et peut couvrir les scénarios dans lesquels ces deux derniers sont utilisés le plus souvent. Des exemples :
  • Programmation d’un moteur de rendu HTML et CSS pour Firefox : Servo (le futur moteur de rendu web hautement multithread) ;
  • Programmation embarquée (e.g. programmation sur Raspberry Pi 3) ;
  • Programmation système (p. ex. développement du système d’exploitation Redox) ;
  • Programmation de moteurs de jeux (p. ex. Piston) ;
  • Programmation de jeux vidéo (p. ex. Hematite, Playform) ;
  • Application de bureau (p. ex. imgui) ;
  • Application en ligne de commande (p. ex. clap) ;
  • Programmation de système de contrôle de version (tel que git) : Pijul ;
  • Développement web : Rocket.

Concernant le web : Rust est amené à être supporté par WebAssembly pour le développement front-end (c.-à-d. appel au DOM, donc conception d’interface plutôt interactive, support de jQuery, Ajax).

Syntaxe

La syntaxe du langage est similaire à celle du C, étant constituée de blocs de code délimités par des accolades et de structures de contrôle comme if, else, while et for.

Cependant, la sémantique de Rust est assez différente. En effet, les blocs et les structures de contrôles sont des expressions, comme on peut le voir dans l'exemple :

Code Rust : Sélectionner tout
1
2
3
4
5
let x = if n < 10 { 
    n 
} else { 
    n - 10 
};
En C, une telle opération n'est pas possible, il faudra soit encapsuler le bloc conditionnel dans une autre fonction, soit utiliser un opérateur ternaire int x = (n < 10) ? n : n - 10;.

Ainsi, dans sa grammaire, le Rust se rapproche beaucoup plus des langages fonctionnels comme l'Haskell ou l'OCaml.

Version

En juillet 2019, l’équipe responsable de Rust a annoncé la disponibilité de la nouvelle version Rust 1.36.0. Cette version apporte de nombreux changements, notamment la stabilisation du trait Future, le crate alloc, le type MaybeUninit , NLL pour Rust 2015, une nouvelle implémentation de HashMap et le support de -- offline dans Cargo. Pour rappel, Cargo est le gestionnaire de paquets de Rust. Il se base sur crates.io et rustc afin de compiler les programmes rust pour Windows, Mac OS, Linux, WASM ainsi que les publier sur crates.io (Le registre des paquets Rust). Il est programmé en Rust et s'utilise en ligne de commande.

Plusieurs entreprises (petites et grandes) ont commencé à se servir de Rust

Selon un billet de blog de Rust, l’année écoulée a été bénéfique pour Rust. Certains plus grands noms de la technologie ainsi que des petites entreprises ont commencé à compter sur Rust comme un élément clé dans leur travail.

Parmi elles figurent npm Inc., la société derrière npm, le gestionnaire de paquets officiel de Node.js. Le 25 février passé, l’entreprise a publié un rapport d’étude avançant que le langage de programmation Rust possède une meilleure façon de gérer les dépendances que d’autres langages tels que Go, C et C++. L’équipe a donc choisi Rust pour faire une nouvelle implémentation d’un service du registre npm pour éviter à la longue les problèmes de performance.


Parmi les premières technologies auxquelles a pensé l’équipe pour réaliser sa nouvelle implémentation du service figuraient le C++, le C et le Java. Cependant, ces derniers ont vite été abandonnés par l’équipe à cause de leur gestion plus que compliquée de la mémoire. Pour Chris Dickinson, ingénieur chez npm Inc., le C et le C++ nécessitent une expertise en gestion de la mémoire afin d’éviter de faire des erreurs pouvant causer des problèmes catastrophiques. Ils constituent donc un choix avec un risque élevé pour écrire une application HTTP à l’endroit du Web.

Dans le même temps, Java a, lui aussi, été exclu de la considération en raison de l'exigence de déployer la JVM et les bibliothèques associées ainsi que tout programme sur leurs serveurs de production. Il s'agissait d'une quantité de complexité opérationnelle et de frais généraux de ressources qui était aussi indésirable que l'insécurité du C ou du C++, explique l'équipe. En résumé à cela, l’équipe indique que ces trois langages ne répondaient simplement pas aux trois critères recherchés pour pouvoir implémenter le service. Elle cherchait plutôt un langage capable de gérer la mémoire de manière sécurisée, qui peut être compilé en un binaire autonome et facilement déployable et avec des performances surpassant celles du JavaScript. Go et Rust semblaient y correspondre. Seulement, après la réécriture du système d’autorisation à l’aide de Go, l’équipe s’est dite déçue de l’absence d’une solution de gestion des dépendances au sein du langage. « La perspective d'installer des dépendances globalement et de partager des versions sur n'importe quel projet Go (la norme dans Go au moment de l'évaluation) n'était pas attrayante », s’est-elle justifiée.

Quant à l’implémentation avec Rust, ils ont dit avoir constaté un contraste frappant dans la gestion des dépendances. D’après l’équipe, Rust possède un outil en ligne de commande appelé Cargo qui partage des similitudes avec l’outil en ligne de commande de npm. Cargo coordonne les versions de chaque dépendance indépendamment pour chaque projet afin que l'environnement dans lequel un projet est construit n'affecte pas l'exécutable final, a expliqué l’équipe. Elle témoigne que même si la prise en main de Rust a pris plus de temps qu’il en fallait, les résultats en valaient la peine. À en croire les propos de l’équipe, la conception du langage Rust charge en début de processus les décisions concernant l'utilisation de la mémoire afin d'assurer la sécurité de la mémoire d'une manière différente des autres langages de programmation courants. L’équipe dit avoir réussi à réimplémenter le service d’autorisation et à déployer la version Rust pour la production qui plus d’un an après, n’a encore présenté aucun problème.

Source : Microsoft

Et vous ?

Avez-vous déjà utilisé le langage de programmation Rust ? Qu'en pensez-vous ?
Que pensez-vous de la recommandation du MSRC ?
Quelle a été la courbe de votre apprentissage de Rust ?

Voir aussi :

Microsoft voudrait participer à la sauvegarde du patrimoine culturel mondial grâce à l'IA et annonce cet objectif dans son projet « AI for Good »
Microsoft lance la préversion publique du support de l'identification sans mot de passe à Azure AD, grâce aux clés de sécurité FIDO2
Windows 1.11 et Windows Throwback sont maintenant disponibles en téléchargement sur le Microsoft Store pour vous faire replonger dans les années 80
C2Rust : un outil qui permet de faire la traduction et la refactorisation de votre code écrit en langage C vers le langage Rust
La feuille de route 2019 de Rust, est disponible et place l'année sous le signe de la maturité

Une erreur dans cette actualité ? Signalez-le nous !