silabs 21Q2 sicheres BLE-Gerät Security Lab
Handbuch des BLE-Sicherheitslabors
In diesem Lab erfahren Sie, wie Sie ein sichereres BLE-Gerät entwerfen. Wir beginnen mit einem Overview wie man einige der Stack-Features verwendet und zu einigen allgemeinen Ratschlägen über Techniken für sicherere Verbindungen übergeht, und schließlich werden wir sehen, wie man Gerätezertifikate über BLE verwendet, um ein Peripheriegerät als authentisch zu identifizieren.
Erste Schritte
Die Bluetooth-sampDie Anwendung, auf der Sie aufbauen, ist für die Verwendung mit einem Bootloader vorgesehen. Wenn Sie mit einem brandneuen EFR32MG21B arbeiten, wird es keinen Bootloader haben. Sie finden einen vorgefertigten Bootloader in den Plattformen\Bootloader\sample-apps\bootloader-storage-internalsingle\efr32mg21a010f1024im32-brd4181a Ihres SDK.
- Beginnen Sie mit einem soc-leeren sampdie App. Dies sample app wird als Vorlage verwendet und ist ein guter Ausgangspunkt für jede BLE-Anwendung.
- Öffnen Sie den Silicon Labs Project Wizard aus dem Simplicity Studio File Menü -> neu.
- Wählen Sie den BRD4181C aus und klicken Sie auf die Schaltfläche „Weiter“.
- Klicken Sie unter Technologietyp auf das Kontrollkästchen „Bluetooth (9)“.
- Markieren Sie „Bluetooth – SoC leer“ und klicken Sie dann auf „Weiter“.
- Klicken Sie auf die Schaltfläche „Fertig stellen“.
- Jetzt können Sie einige Merkmale hinzufügen, um zu sehen, wie geschützte und ungeschützte Merkmale unterschiedlich behandelt werden.
- Öffnen Sie die slcp des Projekts file indem Sie im Projekt-Explorer-Fenster darauf doppelklicken
- Markieren Sie die Registerkarte „SOFTWAREKOMPONENTEN“ und öffnen Sie das GATT-Konfigurationstool wie unten gezeigt:
Und verwenden Sie das unten gezeigte Import-Tool, um die gatt_configuration.btconf zu importieren file aus dem Serverordner in den bereitgestellten Materialien.
Die GATT-Datenbank verfügt über einen benutzerdefinierten Dienst namens „Training“, bei dem einige Daten geschützt sind und andere nicht. Auf diese Weise können Sie vergleichen, was passiert, wenn Sie versuchen, auf ein geschütztes Merkmal zuzugreifen, und auf ein ungeschütztes. Dies ist eine schnelle Möglichkeit, ein Gerät mit sehr grundlegender Sicherheit herzustellen.
- Wir verwenden den seriellen Anschluss zum Drucken an die Konsole in Simplicity Studio, um zu verfolgen, was in der Anwendung vor sich geht. Am einfachsten finden Sie diese Komponenten, indem Sie im Dialogfeld SOFTWAREKOMPONENTEN nach ihnen suchen, wie hier gezeigt:
-
- Installieren Sie die IO Stream USART-Komponente
- Installieren Sie die IO Stream Retarget STDIO-Komponente
- Installieren Sie die Standard-E/A-Komponente
- Installieren Sie die Protokollkomponente
- Öffnen Sie die Board Control-Komponente und schalten Sie „Enable Virtual COM UART“ ein.
- Klicken Sie im Bereich „Adapter debuggen“ mit der rechten Maustaste auf den Adapter und wählen Sie „Konsole starten“. Wählen Sie die Registerkarte „Serial 1“ und platzieren Sie den Cursor im Texteingabefeld des Konsolenfensters und drücken Sie die Eingabetaste, um die Konsole zu aktivieren.
-
- Erstellen Sie eine lokale Variable in sl_bt_on_event(), gefunden in app.c, um das Verbindungshandle zu speichern. Die Variable muss statisch sein, da diese Funktion jedes Mal aufgerufen wird, wenn ein Ereignis vom Stapel ausgelöst wird, und wir möchten, dass der Wert dauerhaft ist. Das Verbindungshandle wird später verwendet
Abschnitt des Labors.
- Fügen Sie einige app_log() -Anweisungen für Ereignisse ein, um zu sehen, wann wir verbunden sind, Sicherheitsmodi usw
-
- Schließen Sie den app_log.h-Header ein file
- sl_bt_evt_connection_opened – Bond-Handle drucken und Verbindungs-Handle speichern. Wenn das Bond-Handle 0xFF ist, besteht keine Bindung zwischen den verbundenen Geräten. Ändern Sie den vorhandenen Event-Handler so, dass er in etwa so aussieht:
- sl_bt_evt_connection_parameters – Sicherheitsmodus. Dies geschieht, damit Sie sehen können, wann sich der Sicherheitsmodus ändert. Es gibt einen Unterschied in der Nummerierung der Sicherheitsmodi, wo Sicherheitsmodus 1 mit dem Wert 0 usw. aufgezählt wird. Fügen Sie Ihrer Anwendung den folgenden Ereignishandler hinzu:
- sl_bt_evt_connection_closed_id. Dieser Ereignishandler wird geändert, um das Verbindungshandle zu aktualisieren. Der Wert 0xFF wird verwendet, um anzuzeigen, dass keine aktive Verbindung besteht. Der Befehl app_log() wird verwendet, um den Grund für das Schließen der Verbindung auszudrucken, die Liste der Statuscodes finden Sie hier. Ändern Sie den vorhandenen Event-Handler so, dass er in etwa so aussieht:
- Schließen Sie den app_log.h-Header ein file
-
- Erstellen und flashen Sie das Projekt. An dieser Stelle führen wir die s ausample app, um zu sehen, wie sie sich neben der GATT-Datenbank ohne Änderungen verhält.
- Verbinden Sie sich wie folgt mit der mobilen EFRConnect-App:
-
- Tippen Sie auf das Symbol „Bluetooth-Browser“.
- Tippen Sie auf dem Gerät mit dem Namen „Training“ auf das Symbol „Verbinden“.
-
- Lesen Sie das ungeschützte Merkmal wie folgt:
-
- Tippen Sie auf den Link „Weitere Informationen“ unter dem unbekannten Dienst mit der UUID a815944e-da1e-9d2a-02e2-a8d15e2430a0.
- Lesen Sie das ungeschützte Merkmal UUID f9e91a44-ca91-4aba-1c33-fd43ca270b4c, indem Sie auf das Symbol „Lesen“ tippen. Keine Überraschungen hier. Da das Merkmal in keiner Weise geschützt ist, wird es im Klartext gesendet.
-
- Lesen Sie nun das geschützte Merkmal UUID d4261dbb-dcd0-daab-ec95-deec088d532b aus. Ihr Mobiltelefon sollte Sie zum Koppeln und Verbinden auffordern, die Meldung kann je nach Betriebssystem Ihres Mobiltelefons variieren. Nachdem Sie die Kopplungsanfrage akzeptiert haben, sollten Sie eine Meldung auf der Konsole wie folgt sehen:
Notiz: Anhang A am Ende dieses Handbuchs enthält eine Zusammenfassung der E/A-Funktionen und Pairing-Methoden als Referenz. Anhang B fasst die Bluetooth-Sicherheitsmodi zusammen.
Security Manager-Konfiguration
Der Sicherheitsmanager ist Teil des Bluetooth-Stacks, der bestimmt, welche Sicherheitsfunktionen verwendet werden. Zu diesen Funktionen gehören Man-in-the-Middle (MITM)-Schutz, sichere LE-Verbindungen (alias ECDH), die eine Bestätigung für das Verbinden erfordern usw. Der Sicherheitsmanager verwaltet auch E/A-Funktionen, die verwendet werden, um zu bestimmen, welche Methode für die Paarung verwendet wird /bonding (siehe Anhang A für eine Zusammenfassung). In diesem Abschnitt sehen Sie eine einfache Einrichtung.
- SM mit gewünschter Konfiguration einrichten. Die Hardware für dieses Lab erleichtert die Anzeige eines Hauptschlüssels auf der Konsole. Die Eingabe des Passkeys ist eine Voraussetzung, um den MITM-Schutz zu aktivieren. Fügen Sie Ihrem sl_bt_system_boot_id-Ereignishandler den folgenden Code hinzu. Dies aktiviert Man-in-the-Middle und informiert das entfernte Gerät darüber, dass wir die Möglichkeit haben, einen Hauptschlüssel anzuzeigen, aber das ist alles.
- Um den Hauptschlüssel auf der Konsole anzuzeigen, ist ein Ereignishandler erforderlich, wie unten gezeigt:
- Legen Sie den Bindungsmodus, die maximale Anzahl von Bindungen usw. fest. Verwenden Sie den folgenden Code, um loszulegen:
Diese Einstellungen können verwendet werden, um die Fähigkeit eines Angreifers einzuschränken, sich mit Ihrem Gerät zu verbinden. Wenn Ihr Produkt nur einen Benutzer haben muss, können Sie die maximalen Bindungen auf 1 begrenzen. Eine gute Stelle zum Hinzufügen dieser Aufrufe ist der Ereignishandler sl_bt_system_boot_id. Wir werden derzeit keine Bindung aktivieren, damit der Rest des Labs reibungsloser abläuft, aber wir legen eine Bindungsrichtlinie fest, die nur eine Bindung zulässt. Als Referenz finden Sie die Dokumentation für diese APIs hier und hier .
- Fügen Sie Ereignishandler für sl_bt_evt_sm_bonded_id und sl_bt_evt_sm_bonding_failed_id hinzu. Die Hauptverwendung für diese Ereignisse ist derzeit informativ, aber später in der Übung werden Sie Funktionalität hinzufügen.
- Bauen und zum Zielbrett flashen. Verbinden Sie sich mit EFRConnect und lesen Sie wie bisher das geschützte Merkmal aus. Dieses Mal sehen Sie einen Hauptschlüssel, der auf der Konsole angezeigt wird. Geben Sie diesen Passkey auf Ihrem Mobiltelefon ein, wenn Sie dazu aufgefordert werden.
- Probieren Sie die Bindungsbestätigung aus. Diese Funktion gibt dem Benutzer die Möglichkeit zu verlangen, dass Bindungsanforderungen bestätigt werden. Dadurch erhält die Anwendung die Kontrolle darüber, mit welchen Peer-Geräten sie sich verbindet. Eine Möglichkeit besteht darin, den Benutzer aufzufordern, eine Taste zu drücken, bevor er die Bindung zulässt.
- Öffnen Sie die Bluetooth-Einstellungen in Ihrem Mobiltelefon und entfernen Sie die Bindung zum EFR32-Gerät. Mobiltelefonimplementierungen variieren, sodass dieser Schritt möglicherweise nicht erforderlich ist. Wenn Sie das „Training“-Gerät nicht in Ihren Bluetooth-Einstellungen sehen, fahren Sie einfach mit dem nächsten Schritt fort.
- Installieren Sie in Softwarekomponenten eine Instanz des einfachen Schaltflächen-Handlers.
- Fügen Sie die Kopfzeile hinzu file sl_simple_button_instances.h in app.c
- Fügen Sie einen Handler für das Ereignis sl_bt_evt_sm_bonding_confirm_id hinzu. Die Hauptaufgabe dieses Ereignishandlers besteht darin, den Benutzer darüber zu informieren, dass ein entferntes Gerät eine neue Bindung anfordert.
- Fügen Sie eine Rückruffunktion für den Handler für einfache Schaltflächen hinzu, um ein Signal an den Bluetooth-Stack zu senden, das anzeigt, dass eine Schaltfläche gedrückt wurde. Dies überschreibt den Standardrückruf, der einfach zurückkehrt.
- Fügen Sie einen Ereignishandler für externe Signale hinzu. Dieses Ereignis wird als Reaktion auf den Empfang eines Signals ausgelöst, wie z. B. im vorherigen Schritt. Das externe Signalereignis wird verwendet, um die Bindung zu bestätigen.
- Ändern Sie den Aufruf in sl_bt_sm_configure, um eine Bindungsbestätigung wie z
- Umbauen und flashen.
- Verbinden Sie sich mit EFRConnect und lesen Sie wie bisher das geschützte Merkmal aus. Jetzt sehen Sie eine Meldung auf der Konsole wie folgt:
Drücken Sie PB0, um die Bindung zu bestätigen. Jetzt zeigt die Konsole den Passkey an, der für die Bindung auf dem Mobiltelefon eingegeben werden muss. Geben Sie den Hauptschlüssel ein, um den Verbindungsvorgang abzuschließen.
Tipp: Verwenden Sie den Standardfall im Ereignishandler, um eine Nachricht auszugeben, wenn der Stack ein Ereignis sendet, das nicht behandelt wird. Der Stapel versucht möglicherweise, Ihnen etwas Wichtiges mitzuteilen.
Über die Grundlagen hinaus
An diesem Punkt haben Sie vorgesorgttage der Sicherheitsfunktionen, die unser Stack zu bieten hat. Lassen Sie uns nun die Implementierung durch den klugen Einsatz der uns zur Verfügung stehenden Funktionen verbessern. Die folgenden Schritte sind optional und unabhängig voneinander, Sie können nach jedem Schritt bauen und flashen, um das Verhalten zu sehen, oder sie alle zusammen ausprobieren.
- Verbindung bei fehlgeschlagenen Verbindungsversuchen trennen. Dies ist ein guter Ort, um Bedrohungen zu erkennen. Wenn das Remote-Gerät keine Verschlüsselung/Authentifizierung unterstützt oder einfach nicht über die richtigen Schlüssel verfügt, könnte es sich um einen Hacker handeln. Unterbrechen wir also die Verbindung. Versuchen Sie, einen Aufruf von sl_bt_connection_close() im Ereignis sl_bt_sm_bonding_failed_id hinzuzufügen. Die API ist hier dokumentiert.
Sie können diese Funktion testen, indem Sie den falschen Hauptschlüssel eingeben.
- Bindung nur zu bestimmten Zeiten zulassen. Dies begrenzt die Zeit, die ein Angreifer zum Herstellen einer Bindung hat, und ermöglicht die Verwendung der Funktion „nur verbundene Verbindungen zulassen“. Der Designer kann wählen, wie der Bonding-Modus aktiviert oder deaktiviert wird. Zu Demonstrationszwecken aktivieren wir hier einen "Setup-Modus" mit PB1 und verwenden einen Timer, um ihn nach 30 Sekunden zu deaktivieren.
- Installieren Sie eine zweite Instanz der einfachen Schaltflächenschnittstelle. Dadurch wird die Verwendung von PB1 ermöglicht.
- Ändern Sie den Rückruf, um ein anderes Signal an den Stack zu senden, um die Bindung zu aktivieren/deaktivieren. Das Ergebnis sollte in etwa so aussehen:
- Ändern Sie den Ereignishandler für externe Signale so, dass er dieses neue Signal verarbeitet. Das Ergebnis sollte so aussehen:
- Fügen Sie einen Ereignishandler für das Ereignis sl_bt_evt_system_soft_timer_id hinzu. Dies wird verwendet, um den Setup-Modus zu deaktivieren.
- Der folgende Code kann verwendet werden, um den Bondable-Modus zu aktivieren und alle Verbindungen zuzulassen oder den Bondable-Modus zu deaktivieren und nur Verbindungen von verbundenen Geräten zuzulassen:
- Fügen Sie den folgenden Aufruf in der Ereignisbehandlungsroutine sl_bt_system_boot_id hinzu
- Erstellen Sie das Projekt und flashen Sie es auf das Gerät.
- Versuchen Sie, sich mit EFRConnect mit dem Gerät zu verbinden. Die Verbindung sollte fehlschlagen.
- Versuchen Sie nun, PB1 zu drücken, bevor Sie sich mit EFRConnect verbinden. Diesmal wird die Verbindung erfolgreich sein. Nach 30 Sekunden sehen Sie eine Meldung auf der Konsole, die darauf hinweist, dass das Gerät den Einrichtungsmodus verlässt. Das bedeutet, dass der Bonding-Modus jetzt deaktiviert ist.
- Erhöhen Sie die Sicherheit beim Verbindungsaufbau. Da die Sicherheit optional ist, sollten wir so bald wie möglich eine verschlüsselte Verbindung anfordern, anstatt uns auf GATT-Merkmale zu verlassen. Die API ist hier dokumentiert. Ein guter Ort zum Aufrufen dieser API ist das Ereignis sl_bt_evt_connection_opened_id. Das Verbindungshandle ist in der Verbindungsvariablen verfügbar.
Sichere Identität
Jetzt, da wir ein sichereres Bluetooth-Gerät haben, können wir den Authentifizierungsschritt verbessern. Sie haben bereits in früheren Schulungsübungen gesehen, wie Sie die sichere Identität von Vault-Geräten über die Befehlszeile überprüfen. In diesem Abschnitt werden wir sehen, wie ein BLE-Gerät die Identität eines anderen BLE-Geräts überprüfen kann, indem es seine Zertifikatskette anfordert und eine Herausforderung sendet. Alle sicheren Tresorteile verfügen über ein eigenes Gerätezertifikat und ein eigenes Stapelzertifikat. Die Factory- und Root-Zertifikate sind fest in die Client-Anwendung codiert, um die Überprüfung der gesamten Zertifikatskette zu ermöglichen. Weitere Einzelheiten zur sicheren Identität finden Sie in AN1268.
- Definieren Sie wie folgt einen globalen Puffer zum Speichern der Gerätebeglaubigungssignatur:
- Stellen Sie die Konfiguration des Sicherheitsmanagers so ein, dass die JustWorks-Kopplung verwendet wird. Dies geschieht, damit die Verbindung verschlüsselt wird. In der Praxis sollte MITM-Schutz verwendet werden, aber um das Labor einfach zu halten, verwenden wir JustWorks. Ändern Sie den Aufruf von sl_bt_sm_configure wieder wie folgt:
Kommentieren Sie außerdem den Aufruf von setup_mode(true) in der system_boot-Ereignisbehandlungsroutine aus.
- Öffnen Sie helpers.c aus den bereitgestellten Materialien und kopieren Sie den Inhalt in app.c. Diese Rückruffunktionen führen Aufgaben aus, wie z. B. das Segmentieren der Zertifikate, damit sie über BLE gesendet werden können, das Verifizieren der Zertifikatskette und das Generieren/Verifizieren der Abfrage.
- Es ist notwendig, die maximale Größe der Übertragungseinheit (MTU) zu bestimmen, damit Zertifikate segmentiert und wieder zusammengesetzt werden können. Definieren Sie eine globale Variable zum Speichern der MTU wie hier gezeigt:
Fügen Sie dann einen Ereignishandler für das GATT-MTU-Austauschereignis wie unten gezeigt hinzu:
- Es können drei Nutzdatenmerkmale ausgelesen werden. Über diese Merkmale werden das Gerätezertifikat, das Chargenzertifikat und die Challenge übermittelt. Eine Callback-Funktion wird verwendet, um diese Benutzer-Leseanforderungen zu verarbeiten. Fügen Sie einen Handler hinzu, um diese Funktion wie unten gezeigt aufzurufen:
Der Rückruf verwendet die MTU aus Schritt 2, um die Zertifikate nach Bedarf zu segmentieren und zu senden. Es übernimmt auch das Senden der signierten Herausforderung.
- Der Client sendet eine Challenge, eine vom Server zu signierende Zufallszahl, indem er eines der GATT-Merkmale schreibt. Aus diesem Grund muss die Anwendung einen Handler für das Benutzerschreibanforderungsereignis wie folgt haben:
- Fügen Sie sichere Identitätsunterstützung hinzu files zum Projekt:
- app_se_manager_macro.h, app_se_manager_secure_identity.c und app_se_secure_identity.h aus den bereitgestellten Materialien zum Projekt. Diese files enthalten einige Hilfsfunktionen für Aufgaben wie das Abrufen der Größe des Zertifikats, das Abrufen des öffentlichen Schlüssels des Geräts und das Signieren einer Challenge.
- Fügen Sie app_se_manager_secure_identity.h in app.c ein.
- Importieren Sie die bereitgestellte gatt_configuration-attest.btconf aus den bereitgestellten Materialien. Diese GATT-Datenbank namens Secure Attestation enthält vier Merkmale, die zur Überprüfung der Identität unseres Geräts verwendet werden. Dazu gehören Gerätezertifikat, Chargenzertifikat, Challenge und Response.
- Der Client, der verwendet wird, um ein Gerät wie ein Gateway zu simulieren, wird als vollständiges Projekt bereitgestellt, da es komplexer zu erstellen ist. Im Allgemeinen ist die Bedienung des Clients wie folgt:
- Sucht nach Geräten, die für den sicheren Bestätigungsdienst werben, und stellt eine Verbindung zu ihnen her.
- Ermittelt die Dienste und Merkmale der GATT-Datenbank.
- Liest die Geräte- und Chargenzertifikate und verifiziert die Zertifikatskette anhand des im Flash gespeicherten Werks- und Stammzertifikats.
- Sendet eine zufällige Challenge an den Server.
- Versucht, die Antwort auf die Abfrage zu überprüfen.
- Schließt die Verbindung, wenn eine der Überprüfungen fehlschlägt.
- Erstellen Sie das Serverprojekt und flashen Sie es auf Ihrem Server WSTK /radioboard.
- Importieren Sie das Kundenprojekt aus dem Kundenordner in den bereitgestellten Materialien. Erstellen Sie das Client-Projekt und flashen Sie es auf Ihrem Client-WSTK/Radioboard.
- Drücken Sie Reset auf dem Client-WSTK und öffnen Sie die serielle Konsole. Der Client beginnt mit der Suche nach Geräten, die unseren sicheren Identitätsdienst bewerben, und stellt eine Verbindung her, wenn er eines findet.
- Der Client zeigt einige Meldungen an, um anzuzeigen, dass er den Server mit dem gewünschten Dienst gefunden hat, und Statusmeldungen zur Überprüfung der Zertifikatskette.
- Wenn die Überprüfung bestanden wird, generiert der Client eine Zufallszahl, die als Challenge bezeichnet wird, und sendet sie an den Server. Der Server signiert die Challenge mit seinem sicher aufbewahrten privaten Geräteschlüssel und der Signatur zurück an den Client, dies wird als Challenge-Response bezeichnet. Der Client verwendet dann den öffentlichen Schlüssel im zuvor erhaltenen Gerätezertifikat, um die Signatur zu überprüfen. Dies geschieht, um zu bestätigen, dass der Server wirklich den privaten Schlüssel hat, den er behauptet zu haben. Wenn die Abfrage korrekt verifiziert wird, wird eine entsprechende Meldung angezeigt; andernfalls wird die Verbindung geschlossen und eine Meldung mit Erläuterung des Grundes angezeigt.
- Senden Sie nun ein ungültiges Zertifikat, um zu bestätigen, dass die Verifizierung wirklich funktioniert. Sie können user_read_request_cb() ändern, um entweder die Zertifikatsdaten oder die Challenge-Antwort zu beschädigen.
Anhang A – I/O-Fähigkeiten und Pairing-Methoden 
Anhang B – Sicherheitsmodi und -stufen
Sicherheitsmodus 1 ist der einzige Modus, der für Bluetooth Low Energy im Stack von Silicon Labs unterstützt wird. Die Ebenen sind wie folgt:
- Stufe 1 keine Sicherheit
- Level 2 nicht authentifiziertes Pairing mit Verschlüsselung
- Level 3 authentifiziertes Pairing mit Verschlüsselung
- Level 4 authentifizierte sichere Verbindungen mit starker Verschlüsselung (ECDH-Schlüsselaustausch)
Dokumente / Ressourcen
![]() |
silabs 21Q2 sicheres BLE-Gerät Security Lab [pdf] Benutzerhandbuch 21Q2 Sicherheitslabor für sichere BLE-Geräte, Sicherheitslabor für sichere BLE-Geräte, Sicherheitslabor |