silabs 21Q2 sikker BLE enhed Security Lab
BLE Security Lab Manual
I dette laboratorium vil du se, hvordan du designer en mere sikker BLE-enhed. Vi starter med en overview af, hvordan man bruger nogle af stak-funktionerne og gå videre til nogle generelle råd om teknikker til mere sikre forbindelser, og til sidst vil vi se, hvordan man bruger enhedscertifikater over BLE til at identificere en perifer enhed som autentisk.
Kom godt i gang
Bluetooth sampDen applikation, du vil bygge på, er beregnet til at blive brugt med en bootloader. Hvis du arbejder med en helt ny EFR32MG21B, vil den ikke have en bootloader. Du kan finde en forudbygget bootloader i platformen\bootloader\sample-apps\bootloader-storage-internalsingle\efr32mg21a010f1024im32-brd4181a mappen på din SDK.
- Start med en soc-tom sampden app. Dette sample app bruges som skabelon og er et godt udgangspunkt for enhver BLE-applikation.
- Åbn Silicon Labs Project Wizard fra Simplicity Studio File menu -> ny.
- Vælg BRD4181C, og klik på knappen 'næste'.
- Klik på afkrydsningsfeltet 'Bluetooth (9)' under teknologitype.
- Fremhæv 'Bluetooth – SoC Empty', og klik derefter på næste.
- Klik på knappen 'Udfør'.
- Nu kan du tilføje nogle egenskaber for at se, hvordan beskyttede og ubeskyttede egenskaber behandles forskelligt.
- Åbn projektets slcp file ved at dobbeltklikke på det i vinduet Project Explorer
- Fremhæv fanen 'SOFTWAREKOMPONENTER', og åbn GATT-konfigurationsværktøjet som vist nedenfor:
Og brug importværktøjet vist nedenfor til at importere gatt_configuration.btconf file fra servermappen i de medfølgende materialer.
GATT-databasen har en tilpasset service, kaldet 'Training', med nogle data, der er beskyttet, og nogle, der ikke er. Dette giver dig mulighed for at sammenligne, hvad der sker, når du forsøger at få adgang til en beskyttet egenskab kontra en ubeskyttet. Dette er en hurtig måde at lave en enhed med meget grundlæggende sikkerhed.
- Vi bruger den serielle port til at udskrive til konsollen i Simplicity Studio for at spore, hvad der sker i applikationen. Den nemmeste måde at finde disse komponenter på er ved at søge efter dem i dialogboksen SOFTWAREKOMPONENTER som vist:
-
- Installer IO Stream USART-komponenten
- Installer IO Stream Retarget STDIO-komponenten
- Installer standard I/O-komponenten
- Installer Log-komponenten
- Åbn Board Control-komponenten og tænd for 'Aktiver Virtual COM UART'
- Højreklik på adapteren i panelet 'Debug adapters' og vælg 'Start konsol'. Vælg fanen 'Serial 1' og placer markøren i tekstindtastningsfeltet i konsolvinduet, og tryk på Enter for at vække konsollen.
-
- Opret en lokal variabel i sl_bt_on_event(), fundet i app.c, for at gemme forbindelseshåndtaget. Variablen skal være statisk, da denne funktion kaldes hver gang en hændelse hæves af stakken, og vi ønsker, at værdien skal være vedvarende. Tilslutningshåndtaget vil blive brugt i en senere
sektion af laboratoriet.
- Indsæt nogle app_log()-sætninger til hændelser for at se, hvornår vi er forbundet, sikkerhedstilstande osv
-
- Inkluder overskriften app_log.h file
- sl_bt_evt_connection_opened – udskriv bondehåndtag og gem forbindelseshåndtaget. Hvis bindingshåndtaget er 0xFF, eksisterer der ingen binding mellem de tilsluttede enheder. Rediger den eksisterende hændelseshandler, så den ser sådan ud:
- sl_bt_evt_connection_parameters – sikkerhedstilstand. Dette gøres, så du kan se, hvornår sikkerhedstilstanden ændres. Der er forskel på nummereringen af sikkerhedstilstande, hvor sikkerhedstilstand 1, er opregnet med værdien 0 osv. . Tilføj følgende hændelseshandler til din ansøgning:
- sl_bt_evt_connection_closed_id. Denne hændelseshandler er ændret for at opdatere forbindelseshåndtaget. Værdien 0xFF bruges til at angive, at der ikke er nogen aktiv forbindelse. Kommandoen app_log() bruges til at udskrive årsagen til, at forbindelsen blev lukket, listen over statuskoder er her. Rediger den eksisterende hændelseshandler, så den ser sådan ud:
- Inkluder overskriften app_log.h file
-
- Byg og flash projektet. På dette tidspunkt vil vi køre sampappen for at se, hvordan den opfører sig uden ændringer, udover GATT-databasen.
- Forbind med EFConnect-mobilappen som følger:
-
- Tryk på ikonet 'Bluetooth Browser'.
- Tryk på ikonet 'Forbind' på enheden med navnet 'Træning'.
-
- Læs den ubeskyttede karakteristik som følger:
-
- Tryk på linket 'Flere oplysninger' under den ukendte tjeneste med UUID a815944e-da1e-9d2a- 02e2-a8d15e2430a0.
- Læs den ubeskyttede karakteristik, UUID f9e91a44-ca91-4aba-1c33-fd43ca270b4c ved at trykke på 'Læs'-ikonet. Ingen overraskelser her. Da karakteristikken ikke er beskyttet på nogen måde, sendes den i klartekst.
-
- Læs nu den beskyttede karakteristik, UUID d4261dbb-dcd0-daab-ec95-deec088d532b. Din mobiltelefon skulle bede dig om at parre og oprette forbindelse, meddelelsen kan variere afhængigt af dit mobile operativsystem. Når du har accepteret anmodningen om parring, skal du få en meddelelse på konsollen som følger:
Note: Appendiks A i slutningen af denne vejledning har en oversigt over I/O-funktioner og parringsmetoder til reference. Appendiks B opsummerer Bluetooth-sikkerhedstilstandene.
Konfiguration af Security Manager
Sikkerhedsadministratoren er en del af Bluetooth-stakken, der bestemmer, hvilke sikkerhedsfunktioner der bruges. Disse funktioner omfatter man-in-the-middle (MITM) beskyttelse, LE Secure-forbindelser (alias ECDH), der kræver bekræftelse for binding osv. Sikkerhedsadministratoren håndterer også I/O-funktioner, som bruges til at bestemme, hvilken metode der bruges til parring /bonding (se bilag A for en oversigt). I dette afsnit vil du se en enkel opsætning.
- Opsæt SM med ønsket konfiguration. Hardwaren til dette laboratorium gør det nemt at vise en adgangsnøgle på konsollen. Indtastning af adgangsnøgle er et krav for at aktivere MITM-beskyttelse. Tilføj følgende kode til din sl_bt_system_boot_id hændelseshandler. Dette aktiverer man-in-the-midten og informerer fjernenheden om, at vi har mulighed for at vise en adgangsnøgle, men det er alt.
- For at få vist adgangsnøglen på konsollen kræves en hændelseshandler som vist nedenfor:
- Indstil bindingstilstand, maks. antal bindinger osv. Brug følgende kode for at komme i gang:
Disse indstillinger kan bruges til at begrænse en angribers evne til at binde sig til din enhed. Hvis dit produkt kun skal have én bruger, kan du begrænse de maksimale bindinger til 1. Et godt sted at tilføje disse kald er i sl_bt_system_boot_id hændelseshandleren. Vi vil ikke aktivere binding på nuværende tidspunkt for at få resten af laboratoriet til at gå mere glat, men vi sætter en bindingspolitik, der kun tillader én binding. Til reference findes dokumentationen til disse API'er her og her.
- Tilføj hændelseshandlere for sl_bt_evt_sm_bonded_id og sl_bt_evt_sm_bonding_failed_id. Hovedanvendelsen af disse begivenheder er informativ i øjeblikket, men senere i laboratoriet vil du tilføje funktionalitet.
- Byg og flash til målbrættet. Forbind med EFRConnect og læs den beskyttede karakteristik som før. Denne gang vil du se en adgangsnøgle vist på konsollen. Indtast denne adgangsnøgle på din mobiltelefon, når du bliver bedt om det.
- Prøv bindingsbekræftelse. Denne funktion giver brugeren mulighed for at kræve, at bindingsanmodninger bekræftes. Hvis du gør det, får applikationen kontrol over, hvilke peer-enheder den forbinder med. En mulighed er at kræve, at brugeren trykker på en knap, før bindingen tillades.
- Åbn Bluetooth-indstillingerne på din mobiltelefon, og fjern bindingen til EFR32-enheden. Mobiltelefonimplementeringer varierer, så dette trin er muligvis ikke nødvendigt. Hvis du ikke kan se 'Træningsenheden' i dine Bluetooth-indstillinger, skal du bare fortsætte til næste trin.
- I softwarekomponenter skal du installere en forekomst af den simple knaphåndtering.
- Inkluder overskriften file sl_simple_button_instances.h i app.c
- Tilføj en handler for sl_bt_evt_sm_bonding_confirm_id hændelsen. Hovedopgaven for denne hændelseshandler er at informere brugeren om, at en ekstern enhed anmoder om en ny binding.
- Tilføj en tilbagekaldsfunktion til den simple knaphåndtering for at sende et signal til Bluetooth-stakken, der indikerer, at der er trykket på en knap. Dette tilsidesætter standardtilbagekaldet, som blot vender tilbage.
- Tilføj en ekstern signalhændelseshandler. Denne hændelse opstår som reaktion på modtagelse af et signal, såsom i det foregående trin. Den eksterne signalhændelse vil blive brugt til at bekræfte binding.
- Skift opkaldet til sl_bt_sm_configure for at kræve bindingsbekræftelse som f.eks
- Genopbygg og flash.
- Forbind med EFRConnect og læs den beskyttede karakteristik som før. Nu vil du se en meddelelse på konsollen som følger:
Tryk på PB0 for at bekræfte bindingen. Nu vil konsollen vise adgangsnøglen, der skal indtastes på mobiltelefonen til binding. Indtast adgangsnøglen for at fuldføre bindingsprocessen.
Tip: Brug standardcasen i hændelseshandleren til at udskrive en meddelelse, når stakken sender en hændelse, der ikke håndteres. Stakken forsøger måske at fortælle dig noget vigtigt.
Ud over det grundlæggende
På dette tidspunkt har du taget fordeltage af de sikkerhedsfunktioner, som vores stak har at tilbyde. Lad os nu forbedre implementeringen gennem klog brug af funktioner til vores rådighed. De følgende trin er valgfrie og uafhængige af hinanden. Du kan bygge og flashe efter hver enkelt for at se adfærden eller prøve dem alle sammen.
- Afbryd forbindelsen ved mislykkede bindingsforsøg. Dette er et godt sted at opdage trusler. Hvis fjernenheden ikke understøtter kryptering/godkendelse eller bare ikke har de korrekte nøgler, kan det være en hacker. Så lad os bryde forbindelsen. Prøv at tilføje et kald til sl_bt_connection_close() i hændelsen sl_bt_sm_bonding_failed_id. API'et er dokumenteret her.
Du kan teste denne funktion ved at indtaste den forkerte adgangsnøgle.
- Tillad kun limning på bestemte tidspunkter. Dette begrænser den tid, en angriber har til at danne en binding, og gør det muligt at bruge funktionen 'Tillad kun forbundne forbindelser'. Designeren kan vælge, hvordan man aktiverer eller deaktiverer bondable mode. Til demonstrationsformål her aktiverer vi en 'opsætningstilstand' med PB1 og bruger en timer til at deaktivere den efter 30 sekunder.
- Installer en anden forekomst af den simple knapgrænseflade. Dette vil muliggøre brugen af PB1.
- Rediger tilbagekaldet for at sende et andet signal til stakken for at aktivere/deaktivere binding. Resultatet skulle se sådan ud:
- Rediger den eksterne signalhændelseshandler, så den håndterer dette nye signal. Resultatet skulle være sådan her:
- Tilføj en hændelseshandler for sl_bt_evt_system_soft_timer_id hændelsen. Dette bruges til at deaktivere opsætningstilstand.
- Følgende kode kan bruges til at aktivere bondable mode og tillade alle forbindelser eller til at deaktivere bondable mode og kun tillade forbindelser fra bonded devices:
- Tilføj følgende kald i sl_bt_system_boot_id hændelseshandleren
- Byg projektet og flash det til enheden.
- Prøv at oprette forbindelse til enheden med EFRConnect. Forbindelsen skulle mislykkes.
- Prøv nu at trykke på PB1, før du forbinder med EFRConnect. Denne gang vil forbindelsen være vellykket. Efter 30 sekunder vil du se en meddelelse på konsollen, der angiver, at enheden er ved at afslutte opsætningstilstand. Det betyder, at bondable mode nu er deaktiveret.
- Øg sikkerheden ved oprettelse af en forbindelse. Da sikkerhed er valgfri, bør vi anmode om en krypteret forbindelse så hurtigt som muligt i stedet for at stole på GATT-karakteristika. API'et er dokumenteret her. Et godt sted at kalde denne API er i sl_bt_evt_connection_opened_id hændelsen. Forbindelseshåndtaget er tilgængeligt i forbindelsesvariablen.
Sikker identitet
Nu hvor vi har en mere sikker Bluetooth-enhed, lad os forbedre godkendelsestrinnet. Du har allerede set, hvordan du verificerer den sikre identitet af vault-enheder med kommandolinjen i tidligere træningslaboratorier. I dette afsnit vil vi se, hvordan en BLE-enhed kan bekræfte identiteten af en anden BLE-enhed ved at anmode om dens certifikatkæde og sende en udfordring. Alle sikre boksdele har deres eget enhedscertifikat og batchcertifikat. Fabriks- og rodcertifikaterne er hårdkodet i klientapplikationen for at muliggøre verifikation af hele certifikatkæden. Se AN1268 for flere detaljer om sikker identitet.
- Definer en global buffer til lagring af enhedsattestationssignaturen som nedenfor:
- Indstil sikkerhedsadministratorens konfiguration til at bruge JustWorks-parring. Dette gøres, så forbindelsen er krypteret. I praksis bør MITM-beskyttelse bruges, men for at holde laboratoriet simpelt, vil vi bruge JustWorks. Skift opkaldet til sl_bt_sm_configure tilbage til følgende:
Kommenter også kaldet til setup_mode(true) i system_boot-hændelseshandleren.
- Åbn helpers.c fra de medfølgende materialer og kopier indholdet til app.c. Disse tilbagekaldsfunktioner udfører opgaver som at segmentere certifikaterne, så de kan sendes over BLE, verificere certifikatkæden og generere/verificere udfordringen.
- Det er nødvendigt at bestemme størrelsen på den maksimale overførselsenhed (MTU), så certifikater kan segmenteres og samles igen. Definer en global variabel for at gemme MTU'en som vist her:
Tilføj derefter en hændelseshandler for den GATT MTU-udvekslede hændelse som vist nedenfor:
- Der er tre brugerdatakarakteristika, som kan læses. Disse egenskaber bruges til at kommunikere enhedscertifikatet, batchcertifikatet og udfordringen. En tilbagekaldsfunktion bruges til at håndtere disse brugerlæseanmodninger. Tilføj en handler for at kalde denne funktion som vist nedenfor:
Tilbagekaldet bruger MTU'en fra trin #2 til at segmentere og sende certifikaterne efter behov. Den håndterer også afsendelse af den underskrevne udfordring.
- Klienten sender en udfordring, et tilfældigt tal, der skal signeres af serveren, ved at skrive en af GATT-egenskaberne. Af denne grund skal applikationen have en behandler for brugerens skriveanmodningshændelse som nedenfor:
- Tilføj sikker identitetssupport files til projektet:
- app_se_manager_macro.h, app_se_manager_secure_identity.c og app_se_secure_identity.h fra de leverede materialer til projektet. Disse files indeholder nogle hjælpefunktioner til opgaver som f.eks. at få certifikatets størrelse, hente enhedens offentlige nøgle og signere en udfordring.
- Inkluder app_se_manager_secure_identity.h i app.c.
- Importer den medfølgende gatt_configuration-attest.btconf fra de medfølgende materialer. Denne GATT-database kaldet sikker attestation, som omfatter fire karakteristika, som vil blive brugt til at bekræfte identiteten af vores enhed. Disse omfatter enhedscertifikatet, batchcertifikatet, udfordring og svar.
- Klienten, som bruges til at simulere en enhed såsom gateway, leveres som et komplet projekt, da det er mere komplekst at bygge. Generelt er betjeningen af klienten som følger:
- Scanner efter enheder, der annoncerer for den sikre attestationstjeneste og opretter forbindelse til dem.
- Opdager GATT-databasetjenesterne og -egenskaberne.
- Læser enheds- og batchcertifikater og verificerer certifikatkæden ved hjælp af fabriks- og rodcertifikatet, som den har gemt i flash.
- Sender en tilfældig udfordring til serveren.
- Forsøg på at verificere svaret på udfordringen.
- Lukker forbindelsen, hvis en af verifikationerne mislykkes.
- Byg og flash serverprojektet til din server WSTK /radioboard.
- Importer klientprojektet fra klientmappen i de medfølgende materialer. Byg og flash klientprojektet til din klient WSTK/radioboard.
- Tryk på reset på klient WSTK og åbn den serielle konsol. Klienten begynder at scanne efter enheder, der reklamerer for vores sikre identitetstjeneste og vil oprette forbindelse, når den finder en.
- Klienten vil vise nogle meddelelser for at angive, at den har fundet serveren med den ønskede tjeneste og statusmeddelelser om verificering af certifikatkæden.
- Hvis verifikationen går igennem, genererer klienten et tilfældigt tal, kaldet en udfordring, og sender det til serveren. Serveren vil underskrive udfordringen med sin sikkert opbevarede private enhedsnøgle og signaturen tilbage til klienten, dette kaldes et udfordringssvar. Klienten bruger derefter den offentlige nøgle i det tidligere modtagne enhedscertifikat til at bekræfte signaturen. Dette gøres for at bekræfte, at serveren virkelig har den private nøgle, som den hævdede at have. Hvis udfordringen er verificeret korrekt, vises en meddelelse om dette; ellers lukkes forbindelsen, og der vises en meddelelse, der forklarer hvorfor.
- Send nu et ugyldigt certifikat for at bekræfte, at verifikationen virkelig virker. Du kan ændre user_read_request_cb() for at ødelægge enten certifikatdataene eller udfordringssvaret.
Appendiks A – I/O-funktioner og parringsmetoder 
Appendiks B – Sikkerhedstilstande og niveauer
Sikkerhedstilstand 1 er den eneste tilstand, der understøttes for Bluetooth Low Energy i Silicon Labs' stak. Niveauerne er som følger:
- Niveau 1 ingen sikkerhed
- Niveau 2 uautoriseret parring med kryptering
- Niveau 3 autentificeret parring med kryptering
- Niveau 4 autentificerede sikre forbindelser med stærk kryptering (ECDH nøgleudveksling)
Dokumenter/ressourcer
![]() |
silabs 21Q2 sikker BLE enhed Security Lab [pdfBrugermanual 21Q2 sikker BLE enhed Security Lab, sikker BLE enhed Security Lab, Security Lab |