Table of Contents
Le rôle critique de la sécurité des démarrages dans les systèmes FPGA
Les glissières programmables sur le terrain (FPGA) sont de plus en plus déployées dans des applications sensibles à la sécurité et critiques pour la sécurité telles que le contrôle industriel, l'aérospatiale, la défense, les télécommunications et l'Internet des objets (IoT). Leur nature reconfigurable les rend vulnérables aux attaques malveillantes pendant le processus de démarrage. Un bitstream FPGA non sécurisé peut être intercepté, modifié ou remplacé par un bitstream voyou qui compromet l'ensemble du système.
Le processus de démarrage d'un FPGA commence généralement par un petit code immuable (souvent stocké dans une mémoire programmable une fois ou une ROM sécurisée) qui initialise le périphérique, lit une image firmware signée à partir de la mémoire externe (p. ex. flash SPI), vérifie son intégrité et son authenticité, puis le charge dans le tissu FPGA. Sans bootloader sécurisé, un attaquant peut remplacer le bitstream par une version trojan-rided, injecte des portes arrières ou force le périphérique à un état d'insécurité. Boot sécurisé empêche ces attaques en établissant une racine de confiance ancrée dans le matériel. Le bootloader lui-même doit être conçu avec la même rigueur que les algorithmes cryptographiques qu'il implémente.
Comprendre le concept de chargeuse de démarrage sécurisée
Un chargeur d'amorçage sécurisé pour les systèmes FPGA est un module matériel dédié ou une routine de firmware qui s'exécute avant l'application principale. Il effectue plusieurs étapes critiques:
- initialisation de pré-démarrage:[ Configure les interfaces d'horlogerie, d'entrée/sortie et de mémoire de base pour que le chargeur puisse accéder au firmware stocké.
- Vérification cryptographique:[ Lisez l'image du firmware signée, récupère la clé publique (ou la clé symétrique) et valide la signature numérique ou le hachage. Cette étape garantit que le firmware est authentique et n'a pas été altéré.
- Chaîne de confiance: Le chargeur de démarrage lui-même est authentifié par la racine matérielle de confiance de FPGA (p. ex., un processeur sécurisé intégré, PUF, ou une clé programmable une fois).Chaque étape suivante vérifie la suivante, formant une chaîne ininterrompue.
- Chargeur de la tolérance aux défauts:[ Si la vérification passe, l'image du firmware est chargée dans la mémoire de configuration FPGA. Si la vérification échoue, le chargeur de démarrage entre dans un état sûr, arrêtant le système ou déclenchant une alerte.
Dans de nombreuses familles FPGA (par exemple Xilinx Zynq, Intel Agilex), il existe des fonctionnalités de sécurité matérielles spécifiques telles que les décrypteurs AES, les vérificateurs HMAC et le stockage de clés eFUSE. Le chargeur de démarrage VHDL doit s'interfacer avec ces blocs tout en maintenant la logique de contrôle dans le tissu. La séparation entre crypto accélérée matérielle et logique souple est une décision clé de conception.
La racine de la confiance et la chaîne de confiance
La racine de confiance (RoT) est un élément immuable au sein de la FPGA qui fournit les identifiants cryptographiques initiaux. Il peut s'agir d'une clé programmable une fois (OTP) brûlée dans des blocs eFUSE, d'une fonction physiquement insoluble (PUF) qui génère une clé de périphérique unique, ou d'un microcontrôleur sécurisé dédié intégré sur la même matrice. Le chargeur d'amorçage utilise cette touche pour valider la clé publique ou la clé symétrique utilisée pour la vérification du firmware. La chaîne de confiance s'étend du RoT au chargeur d'amorçage, puis à l'application principale, et éventuellement aux couches logicielles subséquentes (p. ex., noyau du système d'exploitation).
Considérations de conception pour la mise en œuvre de la LHDV
Le développement d'un chargeur d'amorçage sécurisé dans VHDL nécessite un équilibre des performances, de la sécurité et de la fiabilité.
Mécanismes d'authentification
Le noyau d'un chargeur d'amorçage sécurisé est la capacité de vérifier l'intégrité et l'authenticité du firmware.
- Signatures numériques (cryptographie asymétrique):[ L'image du firmware est signée avec une clé privée (par exemple, ECDSA, RSA). Le chargeur d'amorçage tient la clé publique correspondante. Un hachage du firmware (SHA-256) est calculé, puis la signature est vérifiée à l'aide de la clé publique. Les méthodes asymétriques offrent une sécurité forte mais nécessitent des ressources matérielles modérées.
- Message des codes d'authentification (symétrique):[ En utilisant une clé secrète partagée, le chargeur de démarrage calcule un HMAC sur le firmware et le compare à une balise HMAC annexée. La vérification symétrique est plus rapide que asymétrique mais nécessite une distribution sécurisée de la clé. De nombreux FPGA intègrent des cœurs AES-GCM qui peuvent effectuer un chiffrement/décryptage authentifié, permettant à la fois la confidentialité et l'intégrité.
- Vérification basée sur le hash (simplifiée):[ Dans les systèmes moins critiques, le chargeur d'amorçage peut calculer un simple hachage CRC ou SHA et comparer avec un digest stocké. Sans clé secrète, cela ne détecte que la corruption accidentelle, et non la manipulation malveillante. Il doit être combiné avec un stockage sécurisé pour le hachage.
Pour les systèmes de production, ECDSA (Elliptic Curve Digital Signature Algorithm) sur une courbe de 256 bits (secp256r1) est un choix populaire en raison de sa taille de signature relativement petite et de l'efficacité de l'implémentation matérielle. Le chargeur de démarrage doit inclure une machine à état fini (FSM) qui séquence le calcul SHA-256 et puis alimente le digest dans l'unité de vérification ECDSA.
Stockage sécurisé des clés cryptographiques
La sécurité du chargeur d'amorçage dépend du fait que les clés de vérification restent secrètes et immuables. Les options pour stocker les clés dans les systèmes FPGA incluent:
- eFUSE / OTP memory:[ Les fusibles programmables une fois à l'intérieur de la FPGA peuvent stocker une clé racine ou un digest de clé publique. Une fois soufflés, ils ne peuvent pas être changés, fournissant une ancre forte. Cependant, le nombre de fusibles est limité (souvent 256 bits), et ils sont généralement utilisés pour une clé racine symétrique.
- RAM avec piles (BBRAM):[ Certains FPGA offrent une petite quantité de RAM qui conserve les données lors de la perte de puissance si une batterie de secours est présente.
- Mémoire externe sécurisée:[ Un élément de sécurité hors puce (par exemple ATECC608A) qui stocke les clés et effectue des opérations cryptographiques à l'extérieur.
- Génération de clé basée sur le PUF:[ Les FPGA modernes (par exemple, Xilinx Zynq UltraScale+) fournissent un PUF qui génère une clé de périphérique unique basée sur les variations de fabrication. Cette clé n'est pas stockée explicitement; elle est régénérée chaque fois que le PUF est interrogé à l'aide de données d'aide.
Dans VHDL, le chargeur d'amorçage doit récupérer la clé à partir de la source sécurisée et la transmettre au noyau cryptographique. Pour eFUSE ou BBRAM, le fournisseur FPGA fournit des cellules primitives dédiées (par exemple, `SYSMON` pour la surveillance de la température/tension Xilinx, `BSCAN` pour l'accès JTAG). Le chargeur d'amorçage doit initialiser la récupération de la clé FSM au démarrage et gérer les conditions d'erreur (par exemple, si l'eFUSE n'a pas été programmé).
Intégration des modules de sécurité matérielle (HSM)
Les FPGA intègrent souvent des accélérateurs matériels qui déchargent les fonctions cryptographiques de la logique douce.
- Accélérateurs cryptographiques hardware:[ Modules dédiés pour AES, SHA-256 et RSA/ECDSA. Dans les FPGA de Xilinx, le catalogue IP Vivado fournit des cœurs `AES-GCM`, `SHA-256` et `ECDSA`. Dans les appareils Intel/Altera, le bloc `Accélérateurryptographique` peut être utilisé. Ces cœurs exécutent des ordres de grandeur plus rapidement que les implémentations douces et résistent mieux aux attaques de canaux latéraux.
- Filmateur de nombre aléatoire de vérité (TRNG):[ Requis pour générer des nonces, des calendriers clés ou des défis aléatoires dans le flux de démarrage. Le TRNG devrait être entropiquement sonore et certifié (p. ex., NIST SP 800-90A).
- Fonction physique non-clonable (PUF): Comme mentionné, les PUF génèrent des clés spécifiques au périphérique et peuvent également être utilisés pour lier le chargeur de démarrage à une instance FPGA spécifique, empêchant le vol de bitstream.
- Secure Monitor:[ Un processeur de sécurité dédié qui surveille la tension, la température et les problèmes d'horloge. Si une attaque est détectée, il peut effacer les registres de clés sensibles ou réinitialiser le chargeur de démarrage.
Le chargeur de démarrage VHDL doit configurer ces HSM si nécessaire (par exemple, régler la clé dans le moteur AES), gérer le flux de données entre eux, et gérer les interruptions ou les signaux d'état. L'interface utilise généralement AXI4-Stream ou un protocole spécifique au fournisseur. La machine de contrôle du chargeur de démarrage doit être conçue pour attendre que le HSM puisse effectuer les opérations, vérifier les erreurs et réessayer ou échouer gracieusement.
Tolérance et robustesse des fautes
Le chargeur d'amorçage doit fonctionner de façon fiable dans des conditions défavorables. Les principales techniques de tolérance aux défauts sont les suivantes :
- Triple Modular Redundancy (TMR): Les machines à état critique (p. ex., le contrôleur de démarrage) peuvent être tripliées et votées pour masquer les perturbations à un événement (SEU).
- Watchdog Timers:[ Un chien de garde matériel qui doit être réinitialisé périodiquement par le chargeur de démarrage pendant l'opération normale. Si le chargeur de démarrage est suspendu en raison d'un problème, le chien de garde déclenche une réinitialisation du système.
- Protection de Glitch de puissance: Le chargeur de démarrage doit vérifier que l'alimentation est stable avant de commencer des opérations critiques. Utilisez la réinitialisation de l'alimentation intégrée (POR) de la FPGA et un moniteur de tension pour s'assurer que VCC est dans la tolérance.
- Error Recovery:[ Si une vérification de signature échoue en raison d'une erreur transitoire (p. ex., erreur de lecture de mémoire), le chargeur d'amorçage peut réessayer un nombre limité de fois avant de déclarer une défaillance permanente. Il devrait également enregistrer des erreurs (p. ex., utiliser un registre d'état) à des fins diagnostiques.
- Stockage d'images redondantes : Entreposez deux copies de l'image du firmware (or et mise à jour) en mémoire flash. Si l'image primaire échoue à la vérification, le chargeur de démarrage peut revenir à l'image dorée. Cette approche empêche la briquetage lors d'une mise à jour ratée.
La mise en œuvre de ces caractéristiques dans la LHDV nécessite une planification des ressources prudente. Par exemple, la RRT triplie la logique des ESM et des électeurs, augmentant l'utilisation de la LUT de 3-4x.
Stratégies de codage VHDL pour le chargeur de démarrage
La rédaction d'un chargeur d'amorçage sécurisé dans VHDL exige une modularité, une clarté et une conformité aux pratiques de codage sécurisés.
Conception et hiérarchie modulaires
Décomposer le chargeur de démarrage en modules distincts :
- boot controller:[ FSM de haut niveau qui coordonne la séquence de démarrage. Il orchestre la réinitialisation, la récupération des clés, la vérification cryptographique et le chargement du firmware.
- crypto wrapper:[ Encapsule les cœurs cryptographiques (SHA-256, ECDSA ou AES-GCM). Fournit une interface de registre pour le contrôleur pour démarrer les opérations et lire l'état.
- mem interface:[ Poigne la communication avec la mémoire flash externe (SPI, QSPI, ou parallèle).
- key store: Gère l'accès au stockage sécurisé des clés (eFUSE, BBRAM, PUF). Peut inclure une routine de décomptage des clés si la clé stockée est chiffrée sous une clé maître.
- error handler: Recueille les codes d'erreur, contrôle les LED ou les broches d'état, et gère le retour à l'image dorée (si implémenté).
Chaque module devrait avoir une interface clairement définie utilisant des enregistrements ou des tableaux VHDL pour regrouper les lignes de contrôle et de données. Par exemple, le crypto wrapper pourrait avoir une entrée `start`, un flux `data in`, une sortie `ack` et une sortie `digest`. Utilisez `pragma` ou `synthesis translation off/on` pour le code testbench seulement, jamais dans la synthèse.
Machine d'État Finite (FSM) pour séquence de démarrage
Le contrôleur de démarrage FSM est le cœur du chargeur de démarrage.
- IDLE: Attendez que le signal de réinitialisation soit activé pour désassert.
- INIT: Initialiser l'interface mémoire, définir les diviseurs d'horloges et configurer les noyaux cryptographiques. Attendez les signaux prêts.
- GET KEY: Lisez la clé publique ou la clé racine à partir d'un stockage sécurisé. Si la récupération de la clé échoue, allez à l'état FAIL.
- READ HEADER: Lisez l'en-tête du firmware depuis la mémoire externe. L'en-tête contient la longueur du firmware, sa version, sa signature et ses métadonnées optionnelles. Valider l'en-tête CRC.
- LOAD AND HASH:[ Enfilez l'image du firmware dans le noyau SHA-256 tout en le stockant simultanément dans la mémoire de configuration (ou le tamponnage). Cela peut être fait en parallèle si la bande passante de la mémoire le permet.
- VÉRIFY: Après le calcul du digest SHA-256, lancez l'ECDSA pour vérifier l'opération avec la clé publique et la signature stockées depuis l'en-tête.
- LOAD OK: Si la vérification passe, signal à la logique de configuration FPGA pour charger le bitstream à partir du tampon (ou de l'emplacement flash externe confirmé comme valide). Assister un signal prêt pour l'étape suivante.
- FAIL: Si la vérification échoue ou si une erreur est détectée, entrez un état sûr. Revenez à l'écran avec l'image dorée (si disponible). Si aucune image dorée, maintenez le périphérique dans réinitialiser et affirmez une broche d'alerte. Certains systèmes peuvent autoriser un mode de récupération via JTAG.
Implémentez ce FSM avec un seul processus en utilisant deux sorties (état, next state) et combinatoire. Utilisez une réinitialisation synchrone pour assurer le démarrage déterministe. Protégez le FSM contre les états illégaux en utilisant un cas par défaut qui réinitialise à IDLE. Pour TMR, répétez le FSM trois fois et donnez à chaque état un registre à un électeur.
Gestion des clés sécurisées dans VHDL
La manipulation des clés cryptographiques dans VHDL nécessite une extrême prudence. Les données clés ne doivent jamais apparaître en texte clair en dehors du module sécurisé désigné.
- Utilisez un module séparé et isolé pour le stockage des clés. Le reste du chargeur d'amorçage n'accède à la clé que par une interface dédiée qui renvoie un signal prêt. La clé est transférée au cœur de crypto via un registre interne qui est effacé après utilisation.
- Ne jamais commenter ou enregistrer les valeurs de clé. Dans la simulation, utilisez des bancs de test chiffrés ou évitez d'imprimer des variables de clé.
- Si les clés sont stockées dans eFUSE ou BBRAM, le code VHDL doit utiliser des primitives fournisseurs qui map directement sur le matériel. Ne pas implémenter des décodeurs personnalisés qui pourraient être observés.
- Pour les clés basées sur PUF, inclure la logique de traitement des données de l'aide (par exemple, le code de correction d'erreur) dans le module key store. La sortie PUF est éphémère; le chargeur d'amorçage doit régénérer la clé à chaque fois.
- Envisager d'utiliser un fusible programmable une fois pour verrouiller l'accès JTAG ou débogage après la programmation de clé, en empêchant la lecture de la clé par le port de test.
Gestion et récupération des erreurs
Une manipulation d'erreurs robuste est essentielle pour un chargeur d'amorçage sécurisé. Les mécanismes suivants devraient être mis en œuvre:
- Mémorie ECC: Si le flash externe utilise ECC, le chargeur de démarrage doit vérifier et corriger les erreurs monobit et signaler les erreurs multibit.
- Comptes de temps: Pour chaque opération cryptographique, définissez un délai. Si le noyau ne renvoie pas un résultat dans une fenêtre spécifiée (p. ex. en raison de l'EVP ou du glit), signalez une erreur.
- Vérification redondante:[ Vérifiez le firmware deux fois (avec deux fonctions de hachage différentes ou deux clés) pour vaincre certaines attaques de canaux latéraux.
- État sûr: Lors d'une défaillance permanente, le chargeur de démarrage doit verrouiller le FPGA, éventuellement en désactivant toutes les sorties et en ne chargeant aucune logique utilisateur. Cela empêche un attaquant d'exécuter même un flux de bits partiel.
Mettre en œuvre des codes d'erreur qui peuvent être lus via un port d'accès test (si la sécurité le permet) ou écrits dans un registre non volatil pour analyse ultérieure.
Meilleures pratiques et conseils de sécurité pour les chargeurs de démarrage sécurisés FPGA
Au-delà de la mise en œuvre de la LHDV, les pratiques suivantes améliorent la posture de sécurité.
Utiliser la cryptographie accélérée du matériel
Les implémentations douces de SHA-256 ou ECDSA dans les LUT et les tondeuses sont plus lentes et plus sensibles aux fuites latérales (timing, puissance). Lorsque disponibles, les moteurs cryptons durcis instantanés. Par exemple, Xilinx Vivado fournit le AES-GCM carotte qui fonctionne jusqu'à 100 Gbps. L'utilisation de ces carottes réduit l'utilisation de LUT et augmente le débit. Même si le crypto est doux, l'utilisation d'une tranche DSP dédiée pour la multiplication accélère les opérations ECC.
La rotation et la gestion du cycle de vie
Une méthode : stocker une chaîne de certificat dans un flash externe. Le chargeur de boot vérifie la signature du firmware en utilisant la clé publique actuelle, mais vérifie également une mise à jour de clé signée blob qui peut remplacer la clé publique. La mise à jour doit être signée par la clé privée d'origine. Cela nécessite une logique VHDL supplémentaire pour l'analyse des certificats et la vérification de la chaîne, mais elle permet des mises à niveau sur le terrain de la clé de démarrage.
Mesures de sécurité physique
Les FPGA dans des environnements hostiles (p. ex. automobile, aérospatiale) doivent être protégés contre les attaques physiques :
- Détection d'anti-ampères: Utilisez les capteurs de température et de tension sur puces (par exemple SYSMON) du FPGA pour détecter les tentatives de refroidissement ou l'insertion de points de glissade. Le chargeur d'amorçage peut lire ces capteurs avant de permettre le noyau cryptographique.
- Encrypté bitstream:[ Même si le chargeur de démarrage est sécurisé, le bitstream lui-même devrait être chiffré (par exemple, AES-256) pour empêcher l'interception pendant la configuration. La plupart des FPGA modernes prennent en charge bitstream chiffré avec la clé stockée dans eFUSE.
- JTAG désactivé: Après la production, désactiver l'accès JTAG en permanence via eFUSE. Si JTAG reste activé, un attaquant pourrait contourner complètement le chargeur de démarrage.
- Maille de transport et de manipulation:[ Pour les applications de haute sécurité, envisager le blindage physique du PCB et utiliser un Lattice MachXO3D FPGA sensible à la manipulation qui zéroise les clés lorsque la manipulation est détectée.
Conformité aux normes
Selon le domaine d'application, le chargeur de démarrage peut devoir se conformer aux normes de sécurité:
- NIST SP 800-193 (Platform Firmware Resiliency): Définit des lignes directrices pour le démarrage, la mise à jour et la récupération sécurisés. Le chargeur de démarrage doit être capable de vérifier les mises à jour du firmware et de récupérer des modifications non autorisées.
- FIPS 140-2/140-3 (Validation du module cryptographique) : Si le chargeur d'amorçage effectue des opérations cryptographiques, il peut être nécessaire de valider l'ensemble de la séquence.
- IEC 62443 (Sécurité des réseaux de communication industrielle) : Nécessite un démarrage sécurisé pour empêcher le chargement non autorisé de micrologiciels dans des contrôleurs logiques programmables (PLC).
- DO-254 (Niveau d'assurance de la conception pour les systèmes aéroportés) : Pour l'avionique, le chargeur d'amorçage doit être développé avec une vérification rigoureuse et des méthodes formelles.
Pour la certification, il est essentiel de documenter les revendications de sécurité et la méthodologie de test du chargeur d'amorçage. Les bancs de test VHDL devraient inclure des campagnes d'injection de défauts (p. ex., des bits de retournement dans la mémoire ou la signature) pour vérifier que le chargeur d'amorçage rejette correctement les images falsifiées.
Essais et validation
Testez minutieusement le chargeur de démarrage selon différents scénarios :
- Tests fonctionnels:[ Simulez une image firmware valide et validez-la. Simulez une signature non valide (bit flipped) et validez l'état de FAIL. Vérifiez que le retour d'image doré fonctionne.
- Fermeture à la minuterie : Assurez-vous que le chargeur d'amorçage respecte le moment à la fréquence cible. Les noyaux de cryptos ont souvent une latence élevée; pipelinez les chemins de données pour éviter les violations.
- Simplifier la puissance avec des temps de montée lents, du bruit sur la ligne de remise à zéro et des horloges instables. Le chargeur de démarrage doit rester stable.
- Similation SEU:[ Utilisez des outils d'injection de défauts (par exemple Xilinx XSIM avec API d'injection de défauts) pour retourner les bits dans la machine d'état et regarder les compteurs de chiens. Vérifiez que la détection de TMR ou d'erreur se rétablit correctement.
- Évaluation des fuites à canal latéral :[ Effectuer une analyse de puissance ou des mesures de rayonnement électromagnétique sur le prototype pour s'assurer que les opérations clés ne fuient pas les données sensibles.
Conclusion
La mise en place d'un chargeur d'amorçage sécurisé dans VHDL pour les systèmes FPGA est un défi d'ingénierie multiforme qui exige une attention particulière aux détails cryptographiques, à l'intégration matérielle et à la tolérance aux défauts. En ancreant le processus d'amorçage dans une racine matérielle de confiance, en utilisant des mécanismes d'authentification standard comme ECDSA, et en concevant des machines à état fini robustes dans VHDL, les développeurs peuvent créer un chargeur d'amorçage qui résiste aux manipulations, aux attaques de dégradation et aux menaces physiques.
L'adoption de la FPGA se développe dans les infrastructures critiques, le chargeur d'amorçage sécurisé devient un élément fondamental de la confiance. Investir dans sa conception et sa vérification appropriées est un atout pour la sécurité et la fiabilité du système.Les tendances futures comprennent les algorithmes cryptographiques postquantiques (p. ex., CRYSTALS-Dilithium) qui peuvent nécessiter des modules VHDL plus complexes, mais les principes de séparation, de vérification et de sécurité des défaillances resteront inchangés.