Table of Contents
Le rôle critique des registres de matériel dans la sécurité du système
Les registres matériels sont l'interface principale par laquelle les logiciels contrôlent et communiquent avec des composants matériels physiques — processeurs, contrôleurs de mémoire, moteurs DMA, interfaces réseau et accélérateurs cryptographiques. Chaque registre est un emplacement de mémoire de taille fixe qui contient des valeurs de configuration, d'état ou de données. Comme ces registres influencent directement le comportement matériel, tout accès non autorisé ou incorrect peut entraîner une escalade des privilèges, une corruption de données ou un compromis persistant du système.
Cet article présente un examen complet des considérations de sécurité lors de l'accès et de la modification des registres du matériel. Il couvre le paysage des menaces, les modèles de privilèges, les vulnérabilités du monde réel et les meilleures pratiques pour la programmation sécurisée des registres.
Comprendre les registres de matériel et leurs modèles d'accès
Les deux schémas prédominants sont mémory-mappered I/O (MMIO) et port-mappered I/O (PMIO)[. Dans MMIO, les registres sont assignés aux adresses dans l'espace d'adresse physique du système et peuvent être lus/écrits en utilisant des instructions normales de chargement/d'entreposage. PMIO (common in x86) utilise des instructions spéciales comme et et un espace d'adresse distinct d'E/S. Les deux approches nécessitent des modes d'exécution privilégiés – généralement le mode noyau ou un environnement d'exécution fiable – pour empêcher les applications utilisateur non privilégiées de manipuler directement le matériel.
Les types de registres typiques sont les suivants :
- Registres de contrôle – Configurer le fonctionnement du périphérique (p. ex., activer les interruptions, régler les débits baud).
- Registres d'état – État de l'appareil de déclaration (p. ex., lien vers le haut/vers le bas, tampon plein).
- Registres de données – Transférer des données entre le logiciel et le matériel.
- Registres de configuration[ – Définissez des paramètres comme les modes de puissance ou les assignations de canaux DMA.
Comme les registres ont souvent des effets secondaires — une lecture peut effacer un drapeau d'interruption, un écrit peut déclencher une remise à zéro du matériel — même un accès apparemment bénin peut avoir des conséquences sur la sécurité si ce n'est pas soigneusement géré.
Le paysage de la menace pour l'accès au registre
Les attaquants ciblent les registres matériels pour subvertir l'intégrité du système. Les principales menaces sont les suivantes :
Escalation de privilèges via la manipulation de registre
Un objectif classique des exploits du noyau est d'acquérir la capacité d'écrire pour contrôler les registres qui gèrent la protection mémoire ou les modes CPU. Par exemple, sur x86, le Control Register 0 (CR0) contient des bits qui contrôlent la recherche et la protection d'écriture. Si un attaquant peut écrire des valeurs arbitraires en CR0 à partir d'un contexte non privilégié (disons par un pilote du noyau vulnérable), ils peuvent désactiver les protections mémoire et injecter du code. De même, ARM=s System Control Register (SCTLR) gère les caches, l'alignement et l'activation MMU.
Corruption des données et déni de service
Les modifications incorrectes de registre peuvent causer des pannes, des pertes de données ou une corruption silencieuse de données. Par exemple, écrire une configuration invalide à un registre de contrôleur mémoire peut causer des erreurs de mémoire non corrigées, affectant toutes les applications. Dans les systèmes critiques de sécurité (automotif, médical, industriel), cette corruption a des conséquences physiques.
Tampering et portes arrières
Certains appareils contiennent des registres de débogage ou de test qui, s'ils sont activés pendant le fonctionnement normal, confèrent un contrôle excessif. Un exemple bien connu est l'interface JTAG présente sur de nombreux SoCs. Si le registre de contrôle d'accès JTAG n'est pas verrouillé pendant le démarrage, un attaquant avec un accès physique ou logique peut arrêter le processeur, lire la mémoire et modifier l'état.
Niveaux de privilèges et mécanismes de contrôle de l'accès
Les processeurs modernes imposent des niveaux de privilèges multiples pour faciliter l'accès aux registres.
x86 Anneaux
Les processeurs Intel et AMD x86 supportent quatre niveaux de privilèges (Ring 0–3), bien que la plupart des systèmes d'exploitation n'utilisent que le Ring 0 (kernel) et le Ring 3 (utilisateur). Les instructions d'accès comme ou /] ne peuvent être exécutées que dans le Ring 0. De plus, le champ I/O Privilege Level (IOPL)[ dans le registre EPLAGS et le I/O Permission Bitmap[ dans le segment de l'État de tâche peut accorder à certains OIP l'accès à des tâches à ring inférieur, une fonctionnalité parfois utilisée abusivement par les techniques de contournement du noyau.
Niveaux d'exception de la MRA
L'architecture ARMv8‐A définit quatre niveaux d'exception : EL0 (utilisateur), EL1 (kernel/OS), EL2 (hyperviseur) et EL3 (écran sécurisé).La plupart des registres MMIO ne sont accessibles qu'à partir d'EL1 et de plus. Le System Control Register (SCR EL3) est utilisé pour configurer l'état de sécurité (Secure/Non-Secure).
Modes de privilèges RISC‐V
Le logiciel de mode machine, qui est généralement un petit logiciel de démarrage de ROM ou de chien de garde, a un accès illimité à tous les logiciels de contrôle et de statut (registres de contrôle et d'état). Les accès en mode superviseur sont médiés par les champs mstatuss. Les logiciels de protection de la mémoire physique (PMP) permettent à M‐mode de définir les régions de mémoire physique auxquelles S‐mode et U‐mode peuvent accéder, y compris les régions MMIO.
L'application du principe du moins privilège signifie : (1) ne jamais exposer l'accès direct aux registres à l'espace utilisateur, (2) en mode noyau, restreindre les écrits aux registres ayant des implications en matière de sécurité, et (3) utiliser l'isolement renforcé du matériel (p. ex. hyperviseur, TrustZone) pour séparer les plans de contrôle des registres.
Vulnérabilités communes et exploitation réelle dans le monde
Plusieurs problèmes de sécurité de premier plan ont impliqué la manipulation de registres matériels.
Registres de sélection des lignes Rowhammer et DRAM
Rowhammer exploite une faiblesse physique dans DRAM en activant à plusieurs reprises une ligne pour induire des retournements de bits dans les lignes adjacentes. Bien que le vecteur d'attaque primaire soit l'accès à la mémoire, l'activation de la ligne implique l'écriture à des registres d'adresses de lignes DRAM. Les attaquants ont utilisé des séquences de commande d'expulsion de cache et de contrôleur mémoire pour accélérer le martelage de la ligne.
Registres de fusion et de spectre latéral-channel
Les vulnérabilités de Meltdown et Spectre ont exploité la spéculation du processeur et le moment où le registre lit/écrit pour fuiter la mémoire du noyau. Par exemple, Meltdown s'est appuyé sur l'exécution hors-commande qui charge toujours les valeurs du registre même lorsque l'adresse n'est pas accessible. La correction exigeait l'ajout d'instructions de barrière (p. ex. ) et la modification des registres de table de page pour séparer les mappages du noyau et de l'utilisateur (Kaiser/PTI).
Attaques DMA via les registres d'Endpoint
Les moteurs Direct Memory Access (DMA), contrôlés par des registres dans des appareils tels que les contrôleurs Thunderbolt ou les cartes réseau, peuvent lire/écrire la mémoire du système sans intervention CPU. Si un attaquant peut reconfigurer des registres de descripteurs DMA – par exemple en exploitant une vulnérabilité du pilote ou en installant un périphérique PCIe malveillant –, il peut contourner les protections OS et voler des données sensibles.
Meilleures pratiques pour la programmation sécuritaire de l'enregistrement
L'application de pratiques éprouvées réduit considérablement le risque de vulnérabilités liées aux registres.
Accès restreint et privilégié
Évitez d'exporter les régions de mémoire de registre vers l'espace utilisateur via , sauf si cela est absolument nécessaire et lorsque cela est inévitable, utilisez un pilote sécurisé qui valide chaque accès. Sur Linux, utilisez les cadres de gestion des ressources et pour éviter les conflits d'accès.
Valider tous les écrits de l'enregistrement
Traitez chaque enregistrement comme une entrée non fiable, même si l'appelant est un code de noyau. Implémentez des vérifications pour s'assurer que les patrons de bits valides sont écrits. De nombreux registres ont des bits réservés qui doivent être zéro; écrire des bits vers des champs réservés peut causer des trous de comportement ou de sécurité non définis. Utilisez la validation matérielle si disponible: certains SoCs fournissent un write‐once ou locked attribut qui empêche toute modification ultérieure des registres critiques après la configuration initiale (p. ex., configuration de démarrage sécurisée).
Prévenir les TECTOU et les conditions de course
Les attaquants peuvent exploiter les courses du temps de contrôle d'utilisation (TOCTOU) si l'accès au registre n'est pas atomique. Par exemple, vérifier un registre d'état pour -idle-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Utiliser les barrières de mémoire et commander
Les accès au registre ne sont pas commandés par défaut; le CPU ou le bus peut les réordonner pour des performances. Un appareil peut recevoir un écrit avant une lecture précédente terminée, causant une mauvaise opération. Insérez des barrières (p. ex. , sur ARM; , sur x86) pour faire respecter l'ordre du programme.
Mettre en oeuvre la prévention de l'accès en mode de surveillance (SMAP/SMEP)
Sur x86, SMAP empêche le code noyau d'accéder à la mémoire espace utilisateur, et SMP empêche l'exécution du code espace utilisateur en mode noyau. Bien que ces fonctionnalités ne concernent pas directement les registres, elles bloquent les attaques qui manipulent les valeurs de registre pour forcer l'exécution du noyau d'adresses contrôlées par l'utilisateur.
Mécanismes de sécurité du matériel pour protéger l'accès aux registres
Les fournisseurs de processeurs et les concepteurs de plateformes ont ajouté des fonctionnalités matérielles pour créer des chemins de confiance pour la manipulation de registres.
Secure Boot et mesured Boot
Lors du démarrage sécurisé, chaque composant du firmware vérifie le prochain avant d'accorder la possibilité d'écrire des registres protégés. Le ROM de démarrage verrouille généralement les interfaces JTAG, debug et de programmation. Le démarrage mesuré prolonge cette option en enregistrant les valeurs de registre (par exemple, pour les registres de configuration de la plate-forme TPM, PCR) qui peuvent être attestées ultérieurement.
Environnements d'exécution fiables (ETE)
Les registres critiques, tels que ceux qui contrôlent l'unité de protection de la mémoire, les clés cryptographiques ou les interruptions sécurisées, ne sont accessibles que depuis le monde sécurisé. De même, les extensions de protection logicielle Intel (SGX) et la virtualisation encryptée AMD (SEV) protègent l'accès aux registres dans les enclaves ou les machines virtuelles cryptées.
Modules de sécurité matérielle (HSM) et TPM
Les puces de sécurité dédiées gèrent souvent des registres qui contrôlent les clés cryptographiques, l'attestation et l'état du cycle de vie. Par exemple, un TPM peut stocker un secret persistant dans ses registres internes et refuser de le publier si la plateforme est dans un état non conforme.
Firmware sécurisé et développement de moteurs
La sécurité de l'accès aux registres dépend en fin de compte du code qui les programme.
Normes de codage et analyse statique
Utilisez des normes de codage comme MISRA C ou CERT C pour éviter un comportement non défini qui pourrait corrompre les valeurs des registres. Des outils d'analyse statique (p. ex. Coverity, PVS-Studio) peuvent détecter des barrières manquantes, des courses TECTOU et des erreurs arithmétiques.
Essais flous et dynamiques
Des outils comme syzkaller pour Linux peuvent explorer les chemins de code liés aux registres et identifier les pannes ou les corruptions de mémoire. Le flou sur le matériel dans la boucle peut également exposer les conditions de course que les modèles logiciels manquent. Testez toujours avec une injection de défaut sur hyperviseur ou matériel (par exemple, des attaques laser) pour vérifier la résilience contre les modifications inattendues des registres.
Vérification formelle des registres critiques
Pour les registres les plus sensibles (p. ex. configuration des unités de protection de la mémoire, état de démarrage sécurisé), les méthodes de vérification formelle peuvent mathématiquement prouver que des valeurs incorrectes ne sont jamais écrites. Des outils comme Bedrock ou VCC ont été utilisés pour la vérification du firmware.
Vérification et suivi Accès au registre
Même avec des protections fortes, la surveillance de l'exécution peut détecter la manipulation de registres anormales. La plupart des processeurs modernes incluent des registres de l'unité de surveillance de la performance (PMU) qui peuvent compter les événements comme -MMIO écrit à une plage d'adresses spécifique. Le traçage à l'échelle du système (p. ex., points de trace Linux, ARM CoreSight) peut capturer les modèles d'accès aux registres et les écritures non autorisées.
Envisager de mettre en œuvre la limitation du taux d'accès aux registres[.Par exemple, Intels Le verrouillage du registre spécifique[ empêche les écritures fréquentes à certains registres de gestion de puissance qui pourraient être utilisés pour des attaques de déni de service thermique ou de glissade d'horloge.
Conclusion
Chaque lecture ou écriture dans un registre peut porter atteinte à l'intégrité du système, à des secrets de fuite ou à des privilèges non autorisés. Les développeurs et les architectes de systèmes doivent considérer la manipulation de registre comme une opération privilégiée qui nécessite une conception, une validation et une surveillance minutieuses. En comprenant le modèle de menace, de l'escalade des privilèges aux attaques de canaux latéraux, et en appliquant les pratiques exemplaires décrites ci-dessus (privilège le moins élevé, atomeité, barrières, application du matériel et essais approfondis), les organisations peuvent construire des systèmes résilients aux exploits fondés sur les registres.
La sécurité matérielle n'est jamais terminée; les attaquants développent de nouvelles techniques comme l'injection de défauts ou l'analyse micro-architecturale du moment, la sécurité de l'accès aux registres continuera de dépendre à la fois des progrès matériels et de l'ingénierie logicielle disciplinée.