silabs 21Q2 보안 BLE 장치 보안 랩
BLE 보안 랩 매뉴얼
이 랩에서는 보다 안전한 BLE 장치를 설계하는 방법을 살펴보겠습니다. 오버로 시작하겠습니다.view 스택 기능 중 일부를 사용하는 방법에 대해 알아보고, 보다 안전한 연결을 위한 기술에 대한 일반적인 조언을 살펴본 후, 마지막으로 BLE를 통한 장치 인증서를 사용하여 주변 기기가 정품인지 식별하는 방법을 살펴보겠습니다.
시작하기
블루투스 samp빌드할 애플리케이션은 부트로더와 함께 사용하도록 의도되었습니다. 새 EFR32MG21B로 작업하는 경우 부트로더가 없습니다. platform\bootloader\s에서 미리 빌드된 부트로더를 찾을 수 있습니다.ampSDK의 le-apps\bootloader-storage-internalsingle\efr32mg21a010f1024im32-brd4181a 폴더.
- soc-empty s로 시작하세요ample 앱. 이것은 sample 앱은 템플릿으로 사용되며 모든 BLE 애플리케이션의 좋은 시작점이 됩니다.
- Simplicity Studio에서 Silicon Labs 프로젝트 마법사를 엽니다. File 메뉴 -> 새로 만들기.
- BRD4181C를 선택하고 '다음' 버튼을 클릭하세요.
- 기술 유형에서 'Bluetooth(9)' 체크박스를 클릭합니다.
- 'Bluetooth – SoC Empty'를 강조 표시한 후 다음을 클릭합니다.
- '완료' 버튼을 클릭하세요.
- 이제 몇 가지 특성을 추가하여 보호되는 특성과 보호되지 않는 특성이 어떻게 다르게 처리되는지 확인할 수 있습니다.
- 프로젝트의 slcp를 엽니다 file 프로젝트 탐색기 창에서 두 번 클릭하여
- 아래에 표시된 대로 '소프트웨어 구성 요소' 탭을 강조 표시하고 GATT 구성 도구를 엽니다.
아래에 표시된 가져오기 도구를 사용하여 gatt_configuration.btconf를 가져옵니다. file 제공된 자료의 서버 폴더에서.
GATT 데이터베이스에는 'Training'이라는 사용자 지정 서비스가 있는데, 보호되는 데이터와 보호되지 않는 데이터가 있습니다. 이를 통해 보호된 특성과 보호되지 않은 특성에 액세스하려고 할 때 발생하는 상황을 비교할 수 있습니다. 이는 매우 기본적인 보안을 갖춘 장치를 만드는 빠른 방법입니다.
- Simplicity Studio의 콘솔에 직렬 포트를 사용하여 인쇄하여 애플리케이션에서 무슨 일이 일어나고 있는지 추적합니다. 이러한 구성 요소를 찾는 가장 쉬운 방법은 표시된 대로 SOFTWARE COMPONENTS 대화 상자에서 검색하는 것입니다.
-
- IO Stream USART 구성 요소 설치
- IO Stream Retarget STDIO 구성 요소를 설치합니다.
- 표준 I/O 구성 요소를 설치합니다.
- 로그 구성 요소 설치
- Board Control 구성 요소를 열고 '가상 COM UART 사용'을 켭니다.
- '디버그 어댑터' 패널에서 어댑터를 마우스 오른쪽 버튼으로 클릭하고 '콘솔 시작'을 선택합니다. 'Serial 1' 탭을 선택하고 콘솔 창의 텍스트 입력 필드에 커서를 놓고 Enter 키를 눌러 콘솔을 깨웁니다.
-
- app.c에서 찾은 sl_bt_on_event()에 연결 핸들을 저장하기 위한 로컬 변수를 만듭니다. 이 함수는 스택에서 이벤트가 발생할 때마다 호출되므로 변수는 정적이어야 하며 값을 영구적으로 유지해야 합니다. 연결 핸들은 나중에 사용됩니다.
실험실의 한 부분.
- 이벤트에 대한 app_log() 문을 삽입하여 연결 시점, 보안 모드 등을 확인합니다.
-
- app_log.h 헤더를 포함합니다 file
- sl_bt_evt_connection_opened – 본드 핸들을 인쇄하고 연결 핸들을 저장합니다. 본드 핸들이 0xFF이면 연결된 장치 간에 본드가 없습니다. 기존 이벤트 핸들러를 다음과 같이 수정합니다.
- sl_bt_evt_connection_parameters – 보안 모드. 보안 모드가 변경될 때 확인할 수 있도록 합니다. 보안 모드 번호 매기기에 차이가 있는데, 보안 모드 1은 값 0 등으로 열거됩니다. 다음 이벤트 핸들러를 애플리케이션에 추가합니다.
- sl_bt_evt_connection_closed_id. 이 이벤트 핸들러는 연결 핸들을 업데이트하도록 수정되었습니다. 값 0xFF는 활성 연결이 없음을 나타내는 데 사용됩니다. app_log() 명령은 연결이 닫힌 이유를 출력하는 데 사용되며 상태 코드 목록은 여기에 있습니다. 기존 이벤트 핸들러를 다음과 같이 수정합니다.
- app_log.h 헤더를 포함합니다 file
-
- 프로젝트를 빌드하고 플래시합니다. 이 시점에서 s를 실행합니다.ampGATT 데이터베이스 외에도 아무런 변경 없이 어떻게 동작하는지 보려면 앱을 사용하세요.
- 다음과 같이 EFRConnect 모바일 앱에 연결하세요.
-
- '블루투스 브라우저' 아이콘을 탭하세요.
- '훈련'이라는 장치에서 '연결' 아이콘을 탭합니다.
-
- 보호되지 않은 특성을 다음과 같이 읽어보세요.
-
- UUID가 a815944e-da1e-9d2a- 02e2-a8d15e2430a0인 알 수 없는 서비스 아래에 있는 '추가 정보' 링크를 탭합니다.
- '읽기' 아이콘을 탭하여 보호되지 않은 특성, UUID f9e91a44-ca91-4aba-1c33-fd43ca270b4c를 읽어보세요. 여기에는 놀랄 일이 없습니다. 특성은 어떤 식으로도 보호되지 않으므로 일반 텍스트로 전송됩니다.
-
- 이제 보호된 특성, UUID d4261dbb-dcd0-daab-ec95-deec088d532b를 읽으세요. 모바일 폰에서 페어링하고 연결하라는 메시지를 표시해야 하며, 메시지는 모바일 OS에 따라 다를 수 있습니다. 페어링 요청을 수락하면 콘솔에 다음과 같은 메시지가 표시됩니다.
메모: 이 매뉴얼의 마지막에 있는 부록 A에는 참조를 위한 I/O 기능과 페어링 방법에 대한 요약이 있습니다. 부록 B에는 Bluetooth 보안 모드가 요약되어 있습니다.
보안 관리자 구성
보안 관리자는 어떤 보안 기능이 사용되는지 결정하는 Bluetooth 스택의 일부입니다. 이러한 기능에는 중간자 보호(MITM), LE 보안 연결(일명 ECDH), 본딩 확인 요구 등이 있습니다. 보안 관리자는 페어링/본딩에 어떤 방법을 사용할지 결정하는 데 사용되는 I/O 기능도 처리합니다(요약은 부록 A 참조). 이 섹션에서는 간단한 설정을 볼 수 있습니다.
- 원하는 구성으로 SM을 설정합니다. 이 랩의 하드웨어는 콘솔에 패스키를 쉽게 표시할 수 있게 해줍니다. 패스키 항목은 MITM 보호를 활성화하는 데 필요합니다. 다음 코드를 sl_bt_system_boot_id 이벤트 핸들러에 추가합니다. 이렇게 하면 중간자 공격이 가능해지고 원격 장치에 패스키를 표시할 수 있는 기능이 있다는 것을 알립니다. 그게 전부입니다.
- 콘솔에 패스키를 표시하려면 아래와 같이 이벤트 핸들러가 필요합니다.
- 본딩 모드, 최대 본딩 수 등을 설정합니다. 시작하려면 다음 코드를 사용하세요.
이러한 설정은 공격자가 귀하의 기기와 결합하는 능력을 제한하는 데 사용할 수 있습니다. 귀하의 제품에 사용자가 한 명만 필요한 경우 최대 결합을 1로 제한할 수 있습니다. 이러한 호출을 추가하기에 좋은 위치는 sl_bt_system_boot_id 이벤트 핸들러입니다. 나머지 랩을 더 원활하게 진행하기 위해 지금은 결합을 활성화하지 않지만 결합 정책을 설정하여 하나의 결합만 허용합니다. 참고로 이러한 API에 대한 설명서는 여기와 여기에서 찾을 수 있습니다.
- sl_bt_evt_sm_bonded_id 및 sl_bt_evt_sm_bonding_failed_id에 대한 이벤트 핸들러를 추가합니다. 이러한 이벤트의 주요 용도는 현재 정보 제공이지만 나중에 랩에서 기능을 추가할 것입니다.
- 타겟 보드에 빌드하고 플래시합니다. EFRConnect로 연결하고 이전과 같이 보호된 특성을 읽습니다. 이번에는 콘솔에 패스키가 표시됩니다. 메시지가 표시되면 휴대전화에 이 패스키를 입력합니다.
- 본딩 확인을 시도해 보세요. 이 기능은 사용자에게 본딩 요청이 확인되도록 요구할 수 있는 기능을 제공합니다. 그렇게 하면 애플리케이션이 어떤 피어 디바이스와 본딩할지 제어할 수 있습니다. 한 가지 가능성은 본딩을 허용하기 전에 사용자에게 버튼을 누르도록 요구하는 것입니다.
- 휴대전화에서 Bluetooth 설정을 열고 EFR32 기기와의 연결을 해제합니다. 휴대전화 구현 방식이 다르므로 이 단계는 필요하지 않을 수 있습니다. Bluetooth 설정에서 '트레이닝' 기기를 볼 수 없으면 다음 단계로 넘어가세요.
- 소프트웨어 구성 요소에서 간단한 버튼 핸들러의 인스턴스 하나를 설치합니다.
- 헤더 포함 file app.c의 sl_simple_button_instances.h
- sl_bt_evt_sm_bonding_confirm_id 이벤트에 대한 핸들러를 추가합니다. 이 이벤트 핸들러의 주요 작업은 원격 장치가 새 본드를 요청하고 있음을 사용자에게 알리는 것입니다.
- 간단한 버튼 핸들러에 대한 콜백 함수를 추가하여 Bluetooth 스택에 버튼이 눌렸다는 신호를 보냅니다. 이는 단순히 반환하는 기본 콜백을 재정의합니다.
- 외부 신호 이벤트 핸들러를 추가합니다. 이 이벤트는 이전 단계와 같이 신호를 수신하는 것에 대한 응답으로 발생합니다. 외부 신호 이벤트는 본딩을 확인하는 데 사용됩니다.
- sl_bt_sm_configure에 대한 호출을 변경하여 다음과 같은 본딩 확인을 요구합니다.
- 다시 빌드하고 플래시합니다.
- EFRConnect에 연결하고 이전과 같이 보호된 특성을 읽습니다. 이제 콘솔에 다음과 같은 메시지가 표시됩니다.
PB0을 눌러 본딩을 확인합니다. 이제 콘솔에 본딩을 위해 모바일 폰에 입력해야 할 패스키가 표시됩니다. 패스키를 입력하여 본딩 프로세스를 완료합니다.
팁: 이벤트 핸들러에서 기본 케이스를 사용하여 스택이 처리되지 않은 이벤트를 보낼 때 메시지를 출력합니다. 스택은 중요한 것을 알려주려고 할 수 있습니다.
기본을 넘어서
이 시점에서 당신은 진전을 이루었습니다.tag스택이 제공하는 보안 기능 중 하나입니다. 이제 우리가 사용할 수 있는 기능을 현명하게 사용하여 구현을 개선해 보겠습니다. 다음 단계는 선택 사항이며 서로 독립적입니다. 각 단계를 빌드하고 플래시하여 동작을 확인하거나 모두 함께 시도할 수 있습니다.
- 실패한 본드 시도 시 연결을 끊습니다. 위협을 감지하기에 좋은 곳입니다. 원격 장치가 암호화/인증을 지원하지 않거나 올바른 키가 없는 경우 해커일 수 있습니다. 따라서 연결을 끊습니다. sl_bt_sm_bonding_failed_id 이벤트에서 sl_bt_connection_close()에 대한 호출을 추가해 보세요. API는 여기에 설명되어 있습니다.
잘못된 암호키를 입력하여 이 기능을 테스트해 볼 수 있습니다.
- 특정 시간에만 본딩을 허용합니다. 이렇게 하면 공격자가 본드를 형성하는 데 걸리는 시간이 제한되고 '본딩된 연결만 허용' 기능을 사용할 수 있습니다. 설계자는 본딩 가능 모드를 활성화하거나 비활성화하는 방법을 선택할 수 있습니다. 여기서는 데모 목적으로 PB1로 '설정 모드'를 활성화하고 타이머를 사용하여 30초 후에 비활성화합니다.
- 간단한 버튼 인터페이스의 두 번째 인스턴스를 설치합니다. 그러면 PB1을 사용할 수 있습니다.
- 콜백을 수정하여 본딩을 활성화/비활성화하기 위해 스택에 다른 신호를 보냅니다. 결과는 다음과 같아야 합니다.
- 외부 신호 이벤트 핸들러를 수정하여 이 새로운 신호를 처리하도록 합니다. 결과는 다음과 같아야 합니다.
- sl_bt_evt_system_soft_timer_id 이벤트에 대한 이벤트 핸들러를 추가합니다. 이것은 설정 모드를 비활성화하는 데 사용됩니다.
- 다음 코드를 사용하면 본딩 가능 모드를 활성화하고 모든 연결을 허용하거나 본딩 가능 모드를 비활성화하고 본딩된 장치에서만 연결을 허용할 수 있습니다.
- sl_bt_system_boot_id 이벤트 핸들러에 다음 호출을 추가합니다.
- 프로젝트를 빌드하고 장치에 플래싱합니다.
- EFRConnect로 장치에 연결을 시도하세요. 연결이 실패해야 합니다.
- 이제 EFRConnect로 연결하기 전에 PB1을 눌러보세요. 이번에는 연결이 성공할 것입니다. 30초 후에 콘솔에 장치가 설정 모드를 종료한다는 메시지가 표시됩니다. 즉, 본딩 가능 모드가 비활성화되었습니다.
- 연결을 형성할 때 보안을 강화합니다. 보안은 선택 사항이므로 GATT 특성에 의존하기보다는 가능한 한 빨리 암호화된 연결을 요청해야 합니다. API는 여기에 문서화되어 있습니다. 이 API를 호출하기에 좋은 곳은 sl_bt_evt_connection_opened_id 이벤트입니다. 연결 핸들은 연결 변수에서 사용할 수 있습니다.
보안된 신원
이제 보안이 강화된 Bluetooth 장치가 있으므로 인증 단계를 개선해 보겠습니다. 이전 교육 랩에서 명령줄을 사용하여 볼트 장치의 보안 ID를 확인하는 방법을 이미 살펴보았습니다. 이 섹션에서는 한 BLE 장치가 인증서 체인을 요청하고 챌린지를 보내 다른 BLE 장치의 ID를 확인하는 방법을 살펴보겠습니다. 모든 보안 볼트 파트는 자체 장치 인증서와 배치 인증서를 보유합니다. 팩토리 및 루트 인증서는 클라이언트 애플리케이션에 하드 코딩되어 전체 인증서 체인을 확인할 수 있습니다. 보안 ID에 대한 자세한 내용은 AN1268을 참조하십시오.
- 아래와 같이 장치 증명 서명을 저장하기 위한 전역 버퍼를 정의합니다.
- 보안 관리자 구성을 JustWorks 페어링을 사용하도록 설정합니다. 이렇게 하면 연결이 암호화됩니다. 실제로 MITM 보호를 사용해야 하지만 랩을 간단하게 유지하기 위해 JustWorks를 사용합니다. sl_bt_sm_configure에 대한 호출을 다음과 같이 변경합니다.
또한 system_boot 이벤트 핸들러에서 setup_mode(true) 호출을 주석으로 처리합니다.
- 제공된 자료에서 helpers.c를 열고 내용을 app.c에 복사합니다. 이러한 콜백 함수는 BLE를 통해 전송할 수 있도록 인증서를 분할하고, 인증서 체인을 검증하고, 챌린지를 생성/검증하는 등의 작업을 수행합니다.
- 인증서를 분할하고 다시 조립할 수 있도록 최대 전송 단위(MTU) 크기를 결정해야 합니다. 여기에 표시된 대로 MTU를 저장하는 전역 변수를 정의합니다.
아래와 같이 GATT MTU 교환 이벤트에 대한 이벤트 핸들러를 추가합니다.
- 읽을 수 있는 사용자 데이터 특성은 세 가지가 있습니다. 이러한 특성은 장치 인증서, 배치 인증서 및 챌린지를 전달하는 데 사용됩니다. 콜백 함수는 이러한 사용자 읽기 요청을 처리하는 데 사용됩니다. 아래에 표시된 대로 이 함수를 호출하는 핸들러를 추가합니다.
콜백은 2단계의 MTU를 사용하여 필요에 따라 인증서를 분할하고 전송합니다. 또한 서명된 챌린지를 전송하는 것도 처리합니다.
- 클라이언트는 GATT 특성 중 하나를 작성하여 서버에서 서명할 난수인 챌린지를 보냅니다. 이러한 이유로 애플리케이션에는 아래와 같이 사용자 쓰기 요청 이벤트에 대한 핸들러가 있어야 합니다.
- 보안 ID 지원 추가 file프로젝트에 대한 s:
- 제공된 자료에서 프로젝트에 app_se_manager_macro.h, app_se_manager_secure_identity.c 및 app_se_secure_identity.h를 가져옵니다. files에는 인증서 크기 가져오기, 장치 공개 키 가져오기, 챌린지 서명 등의 작업을 위한 몇 가지 도우미 기능이 포함되어 있습니다.
- app.c에 app_se_manager_secure_identity.h를 포함합니다.
- 제공된 자료에서 제공된 gatt_configuration-attest.btconf를 가져옵니다. 이 GATT 데이터베이스는 보안 증명이라고 하며, 여기에는 장치의 신원을 확인하는 데 사용되는 네 가지 특성이 포함됩니다. 여기에는 장치 인증서, 배치 인증서, 챌린지 및 응답이 포함됩니다.
- 게이트웨이와 같은 장치를 시뮬레이션하는 데 사용되는 클라이언트는 빌드하기가 더 복잡하기 때문에 완전한 프로젝트로 제공됩니다. 일반적으로 클라이언트의 작동은 다음과 같습니다.
- 보안 증명 서비스를 광고하는 장치를 스캔하여 연결합니다.
- GATT 데이터베이스 서비스와 특성을 알아봅니다.
- 장치 및 배치 인증서를 읽고 플래시에 저장된 공장 및 루트 인증서를 사용하여 인증서 체인을 검증합니다.
- 서버에 무작위 도전을 보냅니다.
- 도전에 대한 응답을 검증하려고 시도합니다.
- 두 검증 모두 실패하면 연결을 닫습니다.
- 서버 프로젝트를 빌드하고 서버 WSTK/radioboard에 플래시합니다.
- 제공된 자료의 클라이언트 폴더에서 클라이언트 프로젝트를 가져옵니다. 클라이언트 프로젝트를 빌드하고 클라이언트 WSTK/라디오보드에 플래시합니다.
- 클라이언트 WSTK에서 재설정을 누르고 직렬 콘솔을 엽니다. 클라이언트는 보안 ID 서비스를 광고하는 장치를 스캔하기 시작하고 찾으면 연결합니다.
- 클라이언트는 원하는 서비스가 있는 서버를 찾았음을 나타내는 메시지와 인증서 체인 검증에 대한 상태 메시지를 표시합니다.
- 검증이 통과되면 클라이언트는 챌린지라고 하는 난수를 생성하여 서버로 보냅니다. 서버는 안전하게 보관된 개인 장치 키로 챌린지에 서명하고 서명을 클라이언트에게 다시 보냅니다. 이를 챌린지 응답이라고 합니다. 그런 다음 클라이언트는 이전에 수신한 장치 인증서의 공개 키를 사용하여 서명을 검증합니다. 이는 서버가 주장한 개인 키를 실제로 가지고 있는지 확인하기 위해 수행됩니다. 챌린지가 올바르게 검증되면 해당 효과에 대한 메시지가 표시됩니다. 그렇지 않으면 연결이 닫히고 이유를 설명하는 메시지가 표시됩니다.
- 이제 검증이 실제로 작동하는지 확인하기 위해 잘못된 인증서를 보내세요. user_read_request_cb()를 수정하여 인증서 데이터나 챌린지 응답을 손상시킬 수 있습니다.
부록 A – I/O 기능 및 페어링 방법 
부록 B – 보안 모드 및 수준
보안 모드 1은 Silicon Labs 스택에서 Bluetooth Low Energy에 지원되는 유일한 모드입니다. 레벨은 다음과 같습니다.
- 1단계 보안 없음
- 암호화를 사용한 레벨 2 인증되지 않은 페어링
- 암호화를 통한 레벨 3 인증 페어링
- 강력한 암호화(ECDH 키 교환)를 사용한 레벨 4 인증 보안 연결
문서 / 리소스
![]() |
silabs 21Q2 보안 BLE 장치 보안 랩 [PDF 파일] 사용자 매뉴얼 21Q2 보안 BLE 장치 보안 랩, 보안 BLE 장치 보안 랩, 보안 랩 |