silabs 21Q2 périphérique BLE sécurisé Laboratoire de sécurité

Manuel du laboratoire de sécurité BLE

Dans cet atelier, vous verrez comment concevoir un appareil BLE plus sécurisé. Nous allons commencer par un plusview de la façon d'utiliser certaines des fonctionnalités de la pile et passer à quelques conseils généraux sur les techniques pour des connexions plus sécurisées et enfin nous verrons comment utiliser les certificats de périphérique sur BLE pour identifier un périphérique comme authentique.

Commencer

Le Bluetooth sampL'application sur laquelle vous allez construire est destinée à être utilisée avec un bootloader. Si vous travaillez avec un tout nouveau EFR32MG21B, il n'aura pas de chargeur de démarrage. Vous pouvez trouver un chargeur de démarrage pré-construit dans le platform\bootloader\sample-apps\bootloader-storage-internalsingle\efr32mg21a010f1024im32-brd4181a dossier de votre SDK.

  1. Commencez avec un soc-vide sampl'application. C'estampl'application est utilisée comme modèle et constitue un bon point de départ pour toute application BLE.
    1. Ouvrez l'assistant de projet Silicon Labs à partir de Simplicity Studio File menu -> nouveau.
    2. Sélectionnez le BRD4181C et cliquez sur le bouton « suivant ».
    3. Cochez la case "Bluetooth (9)" sous le type de technologie.
    4. Mettez en surbrillance 'Bluetooth - SoC Empty' puis cliquez sur suivant.
    5. Cliquez sur le bouton 'Terminer'.
  2. Vous pouvez maintenant ajouter des caractéristiques pour voir comment les caractéristiques protégées et non protégées sont traitées différemment.
    1. Ouvrir le slcp du projet file en double-cliquant dessus dans la fenêtre de l'Explorateur de projet
    2. Mettez en surbrillance l'onglet « COMPOSANTS LOGICIELS » et ouvrez l'outil de configuration GATT comme indiqué ci-dessous : Et utilisez l'outil d'importation ci-dessous pour importer le gatt_configuration.btconf file à partir du dossier du serveur dans les documents fournis.La base de données du GATT dispose d'un service personnalisé, appelé "Formation", avec certaines données protégées et d'autres non. Cela vous permet de comparer ce qui se passe lorsque vous essayez d'accéder à une caractéristique protégée par rapport à une caractéristique non protégée. C'est un moyen rapide de créer un appareil avec une sécurité très basique.
  3. Nous utiliserons le port série pour imprimer sur la console dans Simplicity Studio afin de suivre ce qui se passe dans l'application. Le moyen le plus simple de trouver ces composants consiste à les rechercher dans la boîte de dialogue COMPOSANTS LOGICIELS, comme indiqué :
      1. Installer le composant IO Stream USART
      2. Installer le composant IO Stream Retarget STDIO
      3. Installer le composant d'E/S standard
      4. Installer le composant Log
      5. Ouvrez le composant Board Control et activez 'Enable Virtual COM UART'
      6. Cliquez avec le bouton droit sur l'adaptateur dans le panneau "Déboguer les adaptateurs" et sélectionnez "Lancer la console". Sélectionnez l'onglet 'Serial 1' et placez le curseur dans le champ de saisie de texte de la fenêtre de la console et appuyez sur Entrée pour réveiller la console.
  4. Créez une variable locale dans sl_bt_on_event(), trouvée dans app.c, pour enregistrer le descripteur de connexion. La variable doit être statique car cette fonction est appelée chaque fois qu'un événement est déclenché par la pile et nous voulons que la valeur soit persistante. La poignée de connexion sera utilisée dans une version ultérieurepartie du laboratoire.
  5. Insérez des instructions app_log() pour les événements pour voir quand nous sommes connectés, les modes de sécurité, etc.
      1. Inclure l'en-tête app_log.h file
      2. sl_bt_evt_connection_opened - imprime le descripteur de liaison et enregistre le descripteur de connexion. Si le descripteur de liaison est 0xFF, aucune liaison n'existe entre les appareils connectés. Modifiez le gestionnaire d'événements existant afin qu'il ressemble à ceci :
      3. sl_bt_evt_connection_parameters – mode de sécurité. Ceci est fait pour que vous puissiez voir quand le mode de sécurité change. Il y a une différence dans la numérotation des modes de sécurité où le mode de sécurité 1, est énuméré avec la valeur 0, etc. . Ajoutez le gestionnaire d'événements suivant à votre application :
      4. sl_bt_evt_connection_closed_id. Ce gestionnaire d'événements est modifié pour mettre à jour le descripteur de connexion. La valeur 0xFF est utilisée pour indiquer qu'il n'y a pas de connexion active. La commande app_log() est utilisée pour imprimer la raison de la fermeture de la connexion, la liste des codes d'état est ici. Modifiez le gestionnaire d'événements existant afin qu'il ressemble à ceci :
  6. Générez et flashez le projet. À ce stade, nous allons exécuter le sample app pour voir comment il se comporte sans aucun changement, en plus de la base de données du GATT.
  7. Connectez-vous avec l'application mobile EFRConnect comme suit :
      1. Appuyez sur l'icône "Navigateur Bluetooth".
      2. Appuyez sur l'icône « Connecter » sur l'appareil nommé « Entraînement ».
  8. Lire la caractéristique non protégée comme suit :
      1. Appuyez sur le lien "Plus d'infos" sous le service inconnu avec l'UUID a815944e-da1e-9d2a-02e2-a8d15e2430a0.
      2. Lisez la caractéristique non protégée, UUID f9e91a44-ca91-4aba-1c33-fd43ca270b4c en appuyant sur l'icône « Lire ». Pas de surprise ici. La caractéristique n'étant en aucun cas protégée, elle sera envoyée en clair.
  9. Lisez maintenant la caractéristique protégée, UUID d4261dbb-dcd0-daab-ec95-deec088d532b. Votre téléphone mobile devrait vous inviter à coupler et à vous connecter, le message peut varier en fonction de votre système d'exploitation mobile. Après avoir accepté la demande d'appairage, vous devriez un message sur la console comme suit : Note: L'annexe A à la fin de ce manuel contient un résumé des capacités d'E/S et des méthodes d'appariement à titre de référence. L'annexe B résume les modes de sécurité Bluetooth.

Configuration du gestionnaire de sécurité

Le gestionnaire de sécurité fait partie de la pile Bluetooth qui détermine les fonctions de sécurité utilisées. Ces fonctionnalités incluent la protection de l'homme du milieu (MITM), les connexions LE Secure (alias ECDH), nécessitant une confirmation pour la liaison, etc. Le gestionnaire de sécurité gère également les capacités d'E/S qui sont utilisées pour déterminer quelle méthode est utilisée pour le couplage. /bonding (voir l'annexe A pour un résumé). Dans cette section, vous verrez une configuration simple.

  1. Configurez SM avec la configuration souhaitée. Le matériel de ce laboratoire facilite l'affichage d'un mot de passe sur la console. La saisie du mot de passe est obligatoire pour activer la protection MITM. Ajoutez le code suivant à votre gestionnaire d'événements sl_bt_system_boot_id. Cela active l'homme du milieu et informe l'appareil distant que nous avons la possibilité d'afficher un mot de passe, mais c'est tout.
  2. Pour afficher le mot de passe sur la console, un gestionnaire d'événements est requis comme indiqué ci-dessous :
  3. Définissez le mode de liaison, le nombre maximal de liaisons, etc. Utilisez le code suivant pour commencer :Ces paramètres peuvent être utilisés pour limiter la capacité d'un attaquant à se connecter à votre appareil. Si votre produit n'a besoin que d'un seul utilisateur, vous pouvez limiter le nombre maximum de liens à 1. Un bon endroit pour ajouter ces appels est le gestionnaire d'événements sl_bt_system_boot_id. Nous n'activerons pas la liaison pour le moment pour que le reste du laboratoire se déroule plus facilement, mais nous établissons une politique de liaison pour n'autoriser qu'une seule liaison. Pour référence, la documentation de ces API se trouve ici et ici .
  4. Ajoutez des gestionnaires d'événements pour sl_bt_evt_sm_bonded_id et sl_bt_evt_sm_bonding_failed_id. L'utilisation principale de ces événements est actuellement informative, mais plus tard dans le laboratoire, vous ajouterez des fonctionnalités.
  5. Construisez et flashez sur le tableau cible. Connectez-vous avec EFRConnect et lisez la caractéristique protégée comme avant. Cette fois, vous verrez un mot de passe affiché sur la console. Entrez ce mot de passe sur votre téléphone mobile lorsque vous y êtes invité.
  6. Essayez la confirmation de liaison. Cette fonctionnalité donne à l'utilisateur la possibilité d'exiger que les demandes de liaison soient confirmées. Cela donne à l'application le contrôle sur les appareils homologues avec lesquels elle se lie. Une possibilité consiste à demander à l'utilisateur d'appuyer sur un bouton avant d'autoriser le lien.
    1. Ouvrez les paramètres Bluetooth de votre téléphone portable et supprimez la liaison avec l'appareil EFR32. Les implémentations de téléphones portables varient, cette étape peut donc ne pas être nécessaire. Si vous ne voyez pas l'appareil "Entraînement" dans vos paramètres Bluetooth, passez simplement à l'étape suivante.
    2. Dans les composants logiciels, installez une instance du gestionnaire de bouton simple.
    3. Inclure l'en-tête file sl_simple_button_instances.h dans app.c
    4. Ajoutez un gestionnaire pour l'événement sl_bt_evt_sm_bonding_confirm_id. Le travail principal de ce gestionnaire d'événements est d'informer l'utilisateur qu'un appareil distant demande une nouvelle liaison.
    5. Ajoutez une fonction de rappel pour que le gestionnaire de bouton simple envoie un signal à la pile Bluetooth indiquant qu'un bouton a été enfoncé. Cela remplace le rappel par défaut qui revient simplement.
    6. Ajoutez un gestionnaire d'événement de signal externe. Cet événement est déclenché en réponse à la réception d'un signal, comme dans l'étape précédente. L'événement de signal externe sera utilisé pour confirmer la liaison.
    7. Modifiez l'appel à sl_bt_sm_configure pour exiger une confirmation de liaison telle que
    8. Reconstruire et flasher.
    9. Connectez-vous avec EFRConnect et lisez la caractéristique protégée comme avant. Vous verrez maintenant un message sur la console comme suit :Appuyez sur PB0 pour confirmer la liaison. Maintenant, la console affichera le mot de passe à saisir sur le téléphone mobile pour la liaison. Entrez le mot de passe pour terminer le processus de liaison.

 

Conseil: utilisez la casse par défaut dans le gestionnaire d'événements pour imprimer un message lorsque la pile envoie un événement qui n'est pas géré. La pile essaie peut-être de vous dire quelque chose d'important.

Au-delà des bases

À ce stade, vous avez pris l'avantagetage des fonctionnalités de sécurité que notre pile a à offrir. Améliorons maintenant la mise en œuvre grâce à une utilisation judicieuse des fonctionnalités à notre disposition. Les étapes suivantes sont facultatives et indépendantes les unes des autres, vous pouvez créer et flasher après chacune pour voir le comportement ou les essayer toutes ensemble.

  1. Déconnectez-vous en cas d'échec des tentatives de connexion. C'est un bon endroit pour détecter les menaces. Si l'appareil distant ne prend pas en charge le cryptage/l'authentification ou n'a tout simplement pas les bonnes clés, il peut s'agir d'un pirate informatique. Alors, rompons la connexion. Essayez d'ajouter un appel à sl_bt_connection_close() dans l'événement sl_bt_sm_bonding_failed_id. L'API est documentée ici.Vous pouvez tester cette fonctionnalité en saisissant le mauvais mot de passe.
  2. Ne permettre le collage qu'à certains moments. Cela limite le temps dont dispose un attaquant pour former une liaison et permet d'utiliser la fonctionnalité "autoriser uniquement les connexions liées". Le concepteur peut choisir comment activer ou désactiver le mode cautionnable. À des fins de démonstration ici, nous allons activer un "mode de configuration" avec PB1 et utiliser une minuterie pour le désactiver après 30 secondes.
    1. Installez une deuxième instance de l'interface de bouton simple. Cela permettra l'utilisation de PB1.
    2. Modifiez le rappel pour envoyer un signal différent à la pile afin d'activer/désactiver la liaison. Le résultat devrait ressembler à ceci :
    3. Modifiez le gestionnaire d'événements de signal externe afin qu'il gère ce nouveau signal. Le résultat devrait ressembler à ceci :
    4. Ajoutez un gestionnaire d'événements pour l'événement sl_bt_evt_system_soft_timer_id. Ceci sera utilisé pour désactiver le mode de configuration.
    5. Le code suivant peut être utilisé pour activer le mode de liaison et autoriser toutes les connexions ou pour désactiver le mode de liaison et autoriser uniquement les connexions à partir d'appareils liés :
    6. Ajoutez l'appel suivant dans le gestionnaire d'événements sl_bt_system_boot_id
    7. Générez le projet et flashez-le sur l'appareil.
    8. Essayez de vous connecter à l'appareil avec EFRConnect. La connexion devrait échouer.
    9. Essayez maintenant d'appuyer sur PB1 avant de vous connecter avec EFRConnect. Cette fois, la connexion sera réussie. Après 30 secondes, vous verrez un message sur la console indiquant que l'appareil quitte le mode de configuration. Cela signifie que le mode cautionnable est maintenant désactivé.
  3. Augmentez la sécurité lors de la formation d'une connexion. La sécurité étant facultative, nous devrions demander une connexion cryptée dès que possible plutôt que de nous fier aux caractéristiques du GATT. L'API est documentée ici. Un bon endroit pour appeler cette API est dans l'événement sl_bt_evt_connection_opened_id. Le descripteur de connexion est disponible dans la variable de connexion.

Identité sécurisée

Maintenant que nous avons un appareil Bluetooth plus sécurisé, améliorons l'étape d'authentification. Vous avez déjà vu comment vérifier l'identité sécurisée des appareils de coffre avec la ligne de commande dans les ateliers de formation précédents. Dans cette section, nous verrons comment un appareil BLE peut vérifier l'identité d'un autre appareil BLE en demandant sa chaîne de certificats et en envoyant un challenge. Toutes les pièces du coffre-fort sécurisé possèdent leur propre certificat d'appareil et certificat de lot. Les certificats d'usine et racine sont codés en dur dans l'application cliente pour permettre la vérification de l'ensemble de la chaîne de certificats. Reportez-vous à AN1268 pour plus de détails sur l'identité sécurisée.

  1. Définissez un tampon global pour stocker la signature d'attestation de l'appareil comme ci-dessous :
  2. Définissez la configuration du gestionnaire de sécurité pour utiliser le couplage JustWorks. Ceci est fait pour que la connexion soit cryptée. En pratique, la protection MITM doit être utilisée, mais pour simplifier le laboratoire, nous utiliserons JustWorks. Remplacez l'appel à sl_bt_sm_configure par ce qui suit :Mettez également en commentaire l'appel à setup_mode(true) dans le gestionnaire d'événements system_boot.
  3. Ouvrez helpers.c à partir du matériel fourni et copiez le contenu dans app.c. Ces fonctions de rappel effectuent des tâches telles que la segmentation des certificats afin qu'ils puissent être envoyés via BLE, la vérification de la chaîne de certificats et la génération/vérification du challenge.
  4. Il est nécessaire de déterminer la taille maximale de l'unité de transfert (MTU) afin que les certificats puissent être segmentés et réassemblés. Définissez une variable globale pour enregistrer le MTU comme indiqué ici :Ajoutez ensuite un gestionnaire d'événements pour l'événement échangé GATT MTU, comme indiqué ci-dessous :
  5. Trois caractéristiques de données utilisateur peuvent être lues. Ces caractéristiques sont utilisées pour communiquer le certificat de l'appareil, le certificat de lot et le challenge. Une fonction de rappel est utilisée pour gérer ces demandes de lecture de l'utilisateur. Ajoutez un gestionnaire pour appeler cette fonction comme indiqué ci-dessous :Le rappel utilise le MTU de l'étape 2 pour segmenter et envoyer les certificats selon les besoins. Il gère également l'envoi du défi signé.
  6. Le client envoie un défi, un nombre aléatoire à signer par le serveur, en écrivant une des caractéristiques du GATT. Pour cette raison, l'application doit disposer d'un gestionnaire pour l'événement de demande d'écriture de l'utilisateur comme ci-dessous :
  7. Ajouter la prise en charge de l'identité sécurisée files au projet :
    1. app_se_manager_macro.h, app_se_manager_secure_identity.c et app_se_secure_identity.h à partir des matériaux fournis au projet. Ces files contiennent des fonctions d'assistance pour des tâches telles que l'obtention de la taille du certificat, l'obtention de la clé publique de l'appareil et la signature d'un challenge.
    2. Incluez app_se_manager_secure_identity.h dans app.c.
  8. Importez le fichier gatt_configuration-attest.btconf fourni à partir des documents fournis. Cette base de données du GATT appelée attestation sécurisée qui comprend quatre caractéristiques qui serviront à vérifier l'identité de notre appareil. Ceux-ci incluent le certificat de l'appareil, le certificat de lot, le challenge et la réponse.
  9. Le client, qui permet de simuler un équipement tel qu'une passerelle, est fourni sous forme de projet complet car il est plus complexe à construire. En général, le fonctionnement du client est le suivant :
    1. Analyse les appareils faisant la publicité du service d'attestation sécurisé et s'y connecte.
    2. Découvre les services et les caractéristiques de la base de données du GATT.
    3. Lit les certificats d'appareil et de lot et vérifie la chaîne de certificats à l'aide du certificat d'usine et racine qu'il a stocké dans la mémoire flash.
    4. Envoie un défi aléatoire au serveur.
    5. Tente de vérifier la réponse au défi.
    6. Ferme la connexion si l'une des vérifications échoue.
  10. Construisez et flashez le projet serveur sur votre serveur WSTK/radioboard.
  11. Importez le projet client à partir du dossier client dans les documents fournis. Construisez et flashez le projet client sur votre client WSTK/radioboard.
  12. Appuyez sur réinitialiser sur le client WSTK et ouvrez la console série. Le client commence à rechercher des appareils annonçant notre service d'identité sécurisé et se connectera lorsqu'il en trouvera un.
  13. Le client affichera des messages pour indiquer qu'il a trouvé le serveur avec le service souhaité et des messages d'état concernant la vérification de la chaîne de certificats.
  14. Si la vérification réussit, le client générera un nombre aléatoire, appelé défi, et l'enverra au serveur. Le serveur signera le défi avec sa clé de périphérique privée sécurisée et la signature renvoyée au client, c'est ce qu'on appelle une réponse au défi. Le client utilise ensuite la clé publique dans le certificat de périphérique précédemment reçu pour vérifier la signature. Ceci est fait pour confirmer que le serveur a vraiment la clé privée qu'il prétend avoir. Si le challenge est correctement vérifié, un message s'affiche à cet effet ; sinon, la connexion est fermée et un message s'affiche expliquant pourquoi.
  15. Envoyez maintenant un certificat invalide pour confirmer que la vérification fonctionne vraiment. Vous pouvez modifier user_read_request_cb() pour corrompre les données du certificat ou la réponse au challenge.

Annexe A – Capacités d'E/S et méthodes de couplage
Annexe B – Modes et niveaux de sécurité

Le mode de sécurité 1 est le seul mode pris en charge pour Bluetooth Low Energy dans la pile de Silicon Labs. Les niveaux sont les suivants :

  • Niveau 1 sans sécurité
  • Couplage non authentifié de niveau 2 avec cryptage
  • Couplage authentifié de niveau 3 avec cryptage
  • Connexions sécurisées authentifiées de niveau 4 avec cryptage fort (échange de clés ECDH)

 

Documents / Ressources

silabs 21Q2 périphérique BLE sécurisé Laboratoire de sécurité [pdf] Manuel de l'utilisateur
21Q2 laboratoire de sécurité des appareils BLE sécurisés, laboratoire de sécurité des appareils BLE sécurisés, laboratoire de sécurité

Références

Laisser un commentaire

Votre adresse email ne sera pas publiée. Les champs obligatoires sont marqués *