Pourquoi Rust ?
Rust est un langage de programmation qui a gagné en popularité grâce à ses caractéristiques de sécurité et de performance. Contrairement à C et C++, Rust offre une gestion de la mémoire plus sûre, réduisant ainsi les risques de bugs tels que les dépassements de tampon et les erreurs de libération de mémoire. Ces problèmes sont souvent à l’origine de vulnérabilités critiques dans les systèmes logiciels.
C'est d'ailleurs cet aspect sécuritaire que Google met en avant :
« Les microprogrammes servent d'interface entre le matériel et les logiciels de niveau supérieur. En raison de l'absence de mécanismes de sécurité standard dans les logiciels de niveau supérieur, les vulnérabilités du code des microprogrammes peuvent être dangereusement exploitées par des acteurs malveillants. Les téléphones modernes contiennent de nombreux coprocesseurs chargés de gérer diverses opérations, et chacun d'entre eux exécute son propre microprogramme. Souvent, les microprogrammes sont constitués d'importantes bases de code héritées du passé, écrites dans des langages peu sûrs pour la mémoire, tels que le C ou le C++. Le manque de sécurité de la mémoire est la cause principale des vulnérabilités d'Android, de Chrome et de nombreuses autres bases de code.
« Rust offre une alternative au C et au C++ sans risque pour la mémoire, avec des performances et une taille de code comparables. En outre, il prend en charge l'interopérabilité avec le C sans surcharge. L'équipe Android a déjà discuté de Rust pour les firmwares bare-metal et a développé une formation spécifique pour ce domaine ».
L'initiative de Google
Google a récemment réécrit le firmware des machines virtuelles protégées dans son Android Virtualization Framework en utilisant le langage de programmation Rust et souhaite que vous fassiez de même, à condition que vous vous occupiez de firmware.
Dans un article publié jeudi, les ingénieurs d'Android Ivan Lozano et Dominik Maier se penchent sur les détails techniques du remplacement du code C et C++ par le langage Rust. « Vous verrez à quel point il est facile de renforcer la sécurité avec des remplacements Rust, et nous démontrerons même comment la chaîne d'outils Rust peut gérer des cibles spécialisées bare-metal », ont déclaré Lozano et Maier.
Facile n'est pas un terme que l'on entend généralement à propos d'un langage de programmation connu pour sa courbe d'apprentissage abrupte. Il n'est pas non plus facile d'amener les développeurs C et C++ à voir le monde avec des lentilles teintées de Rust.
Quoiqu'il en soit, Google opte pour une adoption incrémentale :
« Notre approche incrémentale, qui se concentre sur le remplacement du nouveau code et du code existant le plus risqué (par exemple, le code qui traite des données externes non fiables), permet d'obtenir un maximum d'avantages en matière de sécurité avec un minimum d'efforts. Le simple fait d'écrire tout nouveau code en Rust réduit le nombre de nouvelles vulnérabilités et, au fil du temps, peut conduire à une réduction du nombre de vulnérabilités existantes.
« Vous pouvez remplacer une fonctionnalité C existante en écrivant un shim Rust fin qui fait la traduction entre une API Rust existante et l'API C attendue par la base de code. L'API C est reproduite et exportée par le shim pour que la base de code existante puisse s'y référer. Le shim sert d'enveloppe à l'API de la bibliothèque Rust, en faisant le lien entre l'API C existante et l'API Rust. Il s'agit d'une approche courante lors de la réécriture ou du remplacement de bibliothèques existantes par une alternative Rust ».
L'entreprise a également une vision quant au choix d'un composant à remplacer :
« Lors du choix d'un composant à remplacer, il convient de privilégier les composants autonomes qui font l'objet de tests rigoureux. Idéalement, la fonctionnalité du composant peut être fournie par une implémentation open-source facilement disponible qui supporte les environnements bare-metal.
« Les analyseurs qui gèrent des formats de données ou des protocoles standard et couramment utilisés (tels que XML ou DNS) sont de bons candidats initiaux. Cela garantit que l'effort initial se concentre sur les défis de l'intégration de Rust avec la base de code et le système de construction existants plutôt que sur les particularités d'un composant complexe et simplifie les tests. Cette approche facilite l'introduction ultérieure de Rust ».
Les défis de la transition
Malgré les avantages, la transition vers Rust n’est pas sans défis. L’un des principaux obstacles est la résistance des développeurs expérimentés en C et C++ à adopter un nouveau langage. De plus, Rust est connu pour sa courbe d’apprentissage abrupte, ce qui peut décourager certains programmeurs.
Il y a quelques jours, l'un des responsables du projet Rust pour Linux - créé pour intégrer le code Rust dans le noyau Linux basé sur le langage C - a démissionné, invoquant la résistance des développeurs du noyau Linux.
« Vous n'allez pas nous forcer à apprendre Rust », a déclaré un contributeur du noyau Linux lors d'une discussion animée au début de l'année à l'occasion d'une conférence.
Rendez-vous à 28:40
Néanmoins, Google encourage ceux qui le souhaitent à le faire. Citant le manque de mécanismes de sécurité de haut niveau dans les microprogrammes, qui sont souvent écrits dans des langages peu sûrs pour la mémoire tels que C ou C++, Lozano et Maier affirment que Rust offre un moyen d'éviter les bogues de sécurité de la mémoire tels que les débordements de mémoire tampon et l'utilisation après la libération qui représentent la majorité des vulnérabilités importantes dans les grandes bases de code.
« Rust offre une alternative au C et au C++ en matière de sécurité de la mémoire, avec des performances et une taille de code comparables », notent-ils. « En outre, il prend en charge l'interopérabilité avec le C sans surcoût.
Le gouvernement américain recommande Rust à la place de C/C++
Le gouvernement américain a récemment insisté sur ce thème, avec le soutien d'entreprises technologiques de premier plan et d'initiatives à but non lucratif visant à réécrire en Rust des projets et des composants open source essentiels. L'année dernière, l'Agence pour la cybersécurité et la sécurité des infrastructures (Cybersecurity & Infrastructure Security Agency) a recommandé aux fournisseurs de logiciels de « faire de la réduction et de l'élimination des vulnérabilités liées à la sécurité de la mémoire dans leurs gammes de produits un objectif d'entreprise de premier plan ».
Google était déjà convaincu par l'idée, ayant conclu que ses développeurs Rust sont deux fois plus productifs que ses ingénieurs C++.
« Nous reconnaissons le rôle essentiel de Rust dans la construction de logiciels sûrs et fiables à tous les niveaux de la pile », a déclaré Lars Bergstrom, directeur de l'ingénierie pour les langages de programmation Android chez Google et président du conseil d'administration de la Rust Foundation.
« Chez Google, nous augmentons l'utilisation de Rust dans Android, Chromium, et plus encore, afin de réduire les vulnérabilités liées à la sécurité de la mémoire. Nous sommes déterminés à collaborer avec l'écosystème Rust pour favoriser son adoption et fournir aux développeurs les ressources et la formation dont ils ont besoin pour réussir. Ce travail sur l'intégration de Rust dans les systèmes embarqués et les microprogrammes porte sur une autre partie essentielle de la pile ».
Conclusion
La déclaration de Google sur la facilité de remplacer C et C++ par Rust dans le firmware est une étape importante vers une programmation plus sûre et plus efficace. Bien que la transition puisse être difficile, les avantages à long terme en termes de sécurité et de productivité sont indéniables. Pour les entreprises technologiques, adopter Rust pourrait bien être la clé pour développer des logiciels plus robustes et sécurisés.
Source : Google
Et vous ?
Quels sont les avantages et les inconvénients que vous voyez dans l’utilisation de Rust par rapport à C et C++ ?
Pensez-vous que la courbe d’apprentissage de Rust est un obstacle majeur pour son adoption généralisée ? Pourquoi ou pourquoi pas ?
Comment évaluez-vous l’impact de la sécurité mémoire de Rust sur la qualité globale du code ?
Avez-vous des expériences personnelles ou des anecdotes sur la transition d’un projet de C/C++ à Rust ?
Quels types de projets ou d’industries bénéficieraient le plus de l’adoption de Rust selon vous ?
Comment les entreprises peuvent-elles encourager leurs développeurs à apprendre et à adopter Rust ?
Voyez-vous des domaines où C et C++ resteraient indispensables malgré les avantages de Rust ?
Quels outils ou ressources recommanderiez-vous pour apprendre Rust efficacement ?