Si la popularité du langage Rust monte en puissance, de nombreuses bases de code que l'on retrouve aussi bien dans des systèmes critiques, des applications que des bibliothèques, sont toujours écrits en C. Une situation propice à une floraison d'outils (comme C2Rust qui traduit le code C99 en Rust unsafe) capables de transcrire automatiquement du code C vers Rust mais qui ne tirent pas partie de sa fonction safe pour éviter les erreurs mémoire. Malgré des décennies de recherche, ces problèmes restent fréquents dans de nombreuses applications et des études récentes menées par Google et Microsoft estiment que 70% des vulnérabilités de sécurité sont liées à une gestion incorrecte de la mémoire.
Deux chercheurs en sécurité, Aymeric Fromherz, de l'équipe Prosecco à l'Inria Paris et Jonathan Protzenko, du groupe de recherche Rise de Microsoft, ont peut être trouvé une solution. Dans un papier de recherche, ils annoncent avoir développé un sous-composant de C, Mini-C, qui évite les schémas et les caractéristiques communes au langage C qui ne peuvent pas être traduits directement en langage Rust safe. "Nous explorons plutôt une voie différente, et étudions ce qu'il faudrait faire pour traduire le C en Rust safe c'est-à-dire pour produire un code qui est trivialement sûr en mémoire, parce qu'il respecte le système de types de Rust sans caveats", expliquent les chercheurs. "Notre travail présente plusieurs contributions originales : une traduction orientée type d'un sous-ensemble de C vers Rust safe ; une nouvelle analyse statique basée sur des « arbres divisés » qui permet d'exprimer l'arithmétique des pointeurs de C [possibilité d'effectuer des calculs sur des adresses mémoire, ndlr] en utilisant les tranches et les opérations de division de Rust ; une analyse qui déduit exactement quels emprunts doivent être mutables ; et une stratégie de compilation pour les types struct de C compatible avec la distinction de Rust entre les allocations non possédées et possédées."
Les conversions de code C vers Rust safe de HACL et EverParse réussies
Un premier test de conversion basé sur la bibliothèque de chiffrement HACL (80 000 lignes de code C) et sur EverParse, une bibliothèque de formateurs et de sérialiseurs vérifiée composée de 1 400 lignes de code C a été réalisé. Aux dires des chercheurs ce galop d'essai a été concluant : "La conversion HACL a nécessité des modifications minimales du code tandis que la conversion EverParse a fonctionné sans modification du code source." Ainsi, le code Rust présentait le même profil de performance que le code C d'origine, malgré l'ajout de fat pointers et de runtime bounds checks.
Les auteurs indiquent par ailleurs que leur HACL compilé en Rust a été intégré à la bibliothèque cryptographique libcrux, dont certaines parties ont été ajoutées au NSS de Mozilla et à OpenSSH. "Notre évaluation montre que pour les quelques éléments qui violent la discipline d'aliasing de Rust [lorsque deux variables ou plus font référence au même objet, ndlr], les réécritures automatisées et précises suffisent, et les quelques copies stratégiques insérées ont un impact négligeable sur les performances", font savoir Aymeric Fromherz et Jonathan Protzenko.
Commentaire