La société Microsoft a dévoilé les travaux associés au projet CHERIoT (Capability Hardware Extension to RISC-V for Internet of Things), visant à bloquer les problèmes de sécurité dans le code existant écrit en C et C++. CHERIoT propose une solution permettant de protéger les bases de code existantes en C/C++ sans avoir besoin de les réécrire. La protection est mise en œuvre par un compilateur modifié utilisant un ensemble d'instructions processeur (ISA) étendu, fournies par le processeur, qui suit l'accès à la mémoire, vérifie la correcte manipulation des pointeurs et assure l'isolation des blocs de code.
Le projet a été conçu en tenant compte du fait que la nature de bas niveau du langage C devient une source d'erreurs lors de la gestion de la mémoire, menant à des problèmes tels que les débordements de tampon, l'accès à la mémoire déjà libérée, la déréférenciation de pointeurs ou le double libération de mémoire. La pratique montre que même de grandes entreprises comme Google et Microsoft, qui ont une politique de révision strictes des modifications et utilisent des méthodes modernes de développement et des outils d'analyse statique, ne peuvent garantir l'absence d'erreurs dans la gestion de la mémoire (par exemple, environ 70% des vulnérabilités dans les produits logiciels de Microsoft et Google sont causées par des manipulations de mémoire non sécurisées).
Le problème peut être résolu en utilisant des langages de programmation garantissant une gestion sécurisée de la mémoire, ou en ajoutant des vérifications supplémentaires à des pointeurs ordinaires, par exemple en utilisant des pointeurs de type MiraclePtr (raw_ptr), qui effectuent des vérifications additionnelles lors des accès aux zones de mémoire libérées. Cependant, de telles méthodes conviennent davantage pour le nouveau code, alors que la réécriture de projets existants en C/C++ est assez problématique, surtout s'ils sont destinés à être exécutés dans des environnements à ressources limitées, tels que les systèmes embarqués et les dispositifs Internet des objets.
Les composants matériels de CHERIoT sont conçus sous la forme d'un microcontrôleur basé sur l'architecture RISC-V, mettant en œuvre une architecture de processeur sécurisée CHERI (Capability Hardware Extension to RISC-V), offrant un modèle d'accès contrôlé à la mémoire basé sur les « capabilities » (chaque opération de lecture et d'écriture en mémoire est autorisée). Sur la base de l'architecture du jeu d'instructions (ISA) fournie dans CHERIoT, un modèle logiciel a été construit, garantissant la sécurité des opérations en mémoire au niveau des objets individuels, fournissant une protection contre l'accès à une mémoire déjà libérée et réalisant un léger système d'isolation de l'accès à la mémoire. Ce modèle de protection logicielle se reflète directement dans le modèle linguistique C/C++, ce qui permet de l'appliquer pour sécuriser les applications existantes (il suffit de les recompiler et de les exécuter sur du matériel prenant en charge l'ISA CHERIoT).
La solution proposée permet de bloquer les erreurs qui entraînent un dépassement de la mémoire par rapport à l'objet, interdit la substitution des pointeurs (tous les pointeurs doivent être générés à partir de pointeurs déjà existants), suit l'accès à la mémoire après libération (tout accès à la mémoire via un pointeur incorrect ou un pointeur pointant vers un objet libéré génère une exception). Par exemple, l'utilisation de CHERIoT permet d'implémenter une vérification automatique des limites, de suivre le temps de vie des zones de mémoire et d'assurer l'intégrité des pointeurs dans les composants traitant des données non dignes de confiance, sans apporter de modifications au code.
Le projet comprend la spécification d'une architecture de jeu d'instructions élargie CHERIoT, une implémentation de référence d'un CPU 32 bits RISC-V avec support de l'ISA CHERIoT, et un outillage modifié LLVM. Les schémas du prototype du CPU et les descriptions des blocs matériels en Verilog sont distribués sous la licence Apache 2.0. Le noyau Ibex du projet lowRISC a été utilisé comme base pour le CPU. Le modèle de code de l'ISA CHERIoT est défini en langage Sail et est distribué sous licence BSD.
Un prototype de système d'exploitation en temps réel, CHERIoT RTOS, est également proposé, offrant la possibilité d'isoler des compartiments, même sur des systèmes embarqués avec 256 Mo de RAM. Le code de CHERIoT RTOS est écrit en C++ et distribué sous la licence MIT. Les composants de base du système d'exploitation, tels que le chargeur, le planificateur et le système de distribution de la mémoire, sont formés sous forme de compartiments.
Un compartiment dans CHERIoT RTOS est une combinaison isolée de code et de variables globales, ressemblant à une bibliothèque partagée, mais contrairement à celle-ci, il peut modifier son état (mutable) et être exécuté dans un contexte de sécurité distinct. Aucun code externe ne peut transférer le contrôle au code dans le compartiment ni accéder aux objets, à part appeler des points d'entrée spécialement définis et utiliser des pointeurs vers des objets explicitement transmis lors de l'appel d'un autre compartiment. L'intégrité et la confidentialité des codes et des objets globaux dans le compartiment sont garanties.
Source : opennet.ru
