Microsoft encourage le développement de pilotes en Rust
Rouille, caisses et cargos

Microsoft a détaillé dans un article de blog comment des travaux en cours se dirigeaient vers le support du langage Rust dans les pilotes. L’entreprise prépare le terrain, mettant en place les premiers éléments. Selon elle, il s’agit d’une demande forte de l’industrie, mais ce n’est pas si simple.
Microsoft est fan du Rust. On le sait depuis plusieurs années, quand l’éditeur s’était largement penché sur les qualités du langage, et avant tout son typage fort. Microsoft avait vu le potentiel à l’utilisation, et on comprend pourquoi : bien que le Rust ne puisse garantir un code sans erreur, il élimine de manière inhérente de nombreuses classes de bugs liés à la mémoire. Par « bugs », Microsoft entend bien « failles de sécurité ». Un point relevé par de nombreuses structures, de l’ANSSI en France à la Maison-Blanche.
« Microsoft et l’industrie dans son ensemble ont adopté Rust comme un outil essentiel pour réduire les bugs, améliorer la sécurité et encourager une programmation sûre et maintenable. Avec ses garanties de compilation autour de la sécurité de la mémoire et une ergonomie forte, Rust est un outil puissant pour la programmation au niveau des systèmes », écrit ainsi Microsoft dans un billet publié hier soir.
En 2023, Windows 11 a été le premier système de l’entreprise à recevoir ses premières lignes de code en Rust dans le noyau. On ne sait pas si cette proportion a augmenté depuis, mais la firme se penche maintenant sur un autre domaine sensible : les pilotes. Et puisque 85 % (selon Microsoft) des écrans bleus proviennent de ces derniers et que 70 % des failles de sécurité sont liées à la mémoire, on comprend que l’éditeur soit intéressé par une hausse générale de la qualité.
Premières briques
Selon Microsoft, les développeurs sont « nombreux » à demander désormais la possibilité d’écrire leurs pilotes en Rust. Traditionnellement, ils sont écrits en C, et toute l’infrastructure de pilotes dans Windows tend vers ce langage. L’objectif, indique l’entreprise, est donc « de faire en sorte que les développeurs Rust puissent tirer parti des mêmes bibliothèques et en-têtes dans le WDK que les développeurs C ».
Ce n’est cependant pas simple, comme ce que l’on observe dans le noyau Linux depuis trois ans. Même quand la volonté est là, il s’agit d’un travail de longue haleine, car de nombreux éléments doivent être modifiés. Il faut notamment aménager le Windows Driver Kit (WDK).
Un dépôt GitHub a donc été mis en place pour montrer les avancées dans ce domaine. On y trouve actuellement une série de crates, c’est-à-dire des morceaux de code compilés. Par exemple, wdk-build, une bibliothèque permettant de configurer un script de construction Cargo (le gestionnaire de paquets de Rust) pour effectuer la liaison en aval du WDK et créer les liaisons Rust. Citons également wdk-sys pour la génération des liaisons FFI (Foreign Function Interface) aux API disponibles dans WDK, ou encore wdk-alloc, pour gérer l’allocation des pilotes.
Ces crates (littéralement « caisses » en anglais) permettent la construction de fichiers binaires valides aux formats WDM, KDMF et UMDF. Cela signifie que ces pilotes peuvent être chargés et exécutés dans un environnement Windows 11.
Réduire la proportion de code non sécurisé
Puisqu’il s’agit des premières briques, la solution actuelle n’est pas entièrement satisfaisante. L’infrastructure n’étant pas prête, le résultat final mélange du code sûr et du code non sécurisé. Des problématiques que l’on a déjà vues dans la bataille autour du Rust dans le noyau Linux. La solution est fonctionnelle, mais pas idéale. Rien n’empêche cependant ces pilotes de fonctionner pleinement, s’ils sont accompagnés des certificats requis.
Pour simplifier les démarches dans un environnement restant assez brut, Microsoft fournit également cargo-wdk. L’entreprise indique que les développeurs ont habituellement accès à des modèles Visual Studio pour faciliter la création de pilotes. Cargo-wdk est là pour compenser cette absence dans le cas du Rust : il crée des projets de pilotes vides avec tous les liens, étapes de construction et dépendances nécessaires préremplies.

Par exemple, la commande « cargo wdk new – kmdf » crée un modèle de pilote KMDF vide, tandis que « cargo wdk build » lance la construction et signale les erreurs rencontrées en appelant INFVerif. Dans le futur, cargo-wdk fournira les mêmes outils de génération et options de configuration que Visual Studio. À « moyen terme », il fournira par exemple l’installation automatique des dépendances (dont WDK lui-même), le support de NT_TARGET_VERSION, des modèles de pilotes supplémentaires, le support complet d’ARM64 ou encore le déploiement sur des machines de test.
Un long travail
Sans surprise, la prochaine grosse étape pour le projet est de pouvoir laisser les développeurs écrire l’intégralité du code des pilotes en langage sécurisé. « Bien que Rust non sécurisé offre toujours des avantages tels qu’une vérification de type forte, des abstractions à coût nul et une bonne compatibilité FFI, nous reconnaissons que de nombreux développeurs recherchent une expérience où la majorité du code du pilote peut être écrite en Rust sécurisé », écrit Microsoft.
Un travail est donc en cours au sein de l’équipe Windows Driver Kit pour créer les abstractions sûres nécessaires. Elles permettront d’exploiter un plus grand nombre d’aspects du langage et de réduire les blocs de code non sécurisés. Parallèlement, « d’autres équipes au sein de Microsoft travaillent au développement de structures et d’API sécurisées au-delà de WDF », à la fois pour les pilotes tiers et le noyau Windows. Une partie de ce travail est déjà présente dans le noyau de Windows 11.
Microsoft indique que le chemin sera long, en raison notamment « de la complexité et de la nature générique des API du noyau Windows ». Le travail en cours fait intervenir plusieurs équipes pour mutualiser les efforts et le code présent dans le dépôt GitHub évoluera. Ce qui explique d’ailleurs que la solution soit présentée de cette manière et pas publiée officiellement sur une page officielle : elle est considérée comme « solide » pour les besoins de l’équipe qui l’a développée, mais doit se frotter à une utilisation plus large. En outre, Microsoft reconnait qu’il existe de nombreux modèles de pilotes et de scénarios que Windows doit prendre en charge. Quand le projet approchera de sa finalisation, toutes les crates seront publiées sur crates.io.
Enfin, l’entreprise affirme « que les langages à mémoire sécurisée tels que Rust représentent l’avenir de l’ingénierie logicielle sécurisée ». Dans les mois qui viennent, Microsoft publiera des informations sur les meilleures pratiques autour de Rust pour les pilotes, permettra la soumission de ces derniers à WHCP (Windows Hardware Compatibility Program), ainsi que l’analyse statique par CodeQL.