silabs 21Q2 безпечний пристрій BLE Security Lab

Посібник лабораторії безпеки BLE

У цій лабораторній роботі ви побачите, як створити більш безпечний пристрій BLE. Почнемо з оверуview про те, як використовувати деякі функції стеку, і перейти до деяких загальних порад щодо методів для більш безпечних з’єднань, і, нарешті, ми побачимо, як використовувати сертифікати пристрою через BLE для ідентифікації периферійного пристрою як автентичного.

Початок роботи

Bluetooth sampПрограма, яку ви створюватимете, призначена для використання із завантажувачем. Якщо ви працюєте з абсолютно новим EFR32MG21B, він не матиме завантажувача. Попередньо зібраний завантажувач можна знайти в platform\bootloader\sampпапку le-apps\bootloader-storage-internalsingle\efr32mg21a010f1024im32-brd4181a вашого SDK.

  1. Почніть із soc-empty sample app. Це сample app використовується як шаблон і є хорошою відправною точкою для будь-якої програми BLE.
    1. Відкрийте Майстер проекту Silicon Labs із Simplicity Studio File меню -> нове.
    2. Виберіть BRD4181C і натисніть кнопку «Далі».
    3. Установіть прапорець «Bluetooth (9)» під типом технології.
    4. Виділіть «Bluetooth – SoC Empty» і натисніть «Далі».
    5. Натисніть кнопку «Готово».
  2. Тепер ви можете додати деякі характеристики, щоб побачити, як по-різному обробляються захищені та незахищені характеристики.
    1. Відкрийте slcp проекту file подвійним клацанням у вікні Project Explorer
    2. Виділіть вкладку «КОМПОНЕНТИ ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ» та відкрийте інструмент налаштування GATT, як показано нижче: І використовуйте інструмент імпорту, показаний нижче, щоб імпортувати gatt_configuration.btconf file з папки сервера в наданих матеріалах.База даних GATT має спеціальну службу під назвою «Навчання», де деякі дані захищені, а деякі — ні. Це дозволяє вам порівняти, що відбувається під час спроби отримати доступ до захищеної характеристики та незахищеної. Це швидкий спосіб створення пристрою з елементарною безпекою.
  3. Ми будемо використовувати послідовний порт для друку на консолі в Simplicity Studio, щоб відстежувати, що відбувається в програмі. Найпростіший спосіб знайти ці компоненти — знайти їх у діалоговому вікні КОМПОНЕНТІВ ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ, як показано:
      1. Встановіть компонент IO Stream USART
      2. Встановіть компонент IO Stream Retarget STDIO
      3. Встановіть стандартний компонент введення/виведення
      4. Встановіть компонент Log
      5. Відкрийте компонент керування платою та ввімкніть «Увімкнути віртуальний COM UART»
      6. Клацніть правою кнопкою миші адаптер на панелі «Налагодження адаптерів» і виберіть «Запустити консоль». Виберіть вкладку «Серійний номер 1», помістіть курсор у поле введення тексту вікна консолі та натисніть клавішу enter, щоб розбудити консоль.
  4. Створіть локальну змінну в sl_bt_on_event(), знайдену в app.c, для збереження опису підключення. Змінна має бути статичною, оскільки ця функція викликається кожного разу, коли стеком викликається подія, і ми хочемо, щоб значення було постійним. Дескриптор підключення буде використано пізнішерозділ лаб.
  5. Вставте деякі оператори app_log() для подій, щоб побачити, коли ми підключені, режими безпеки тощо
      1. Додайте заголовок app_log.h file
      2. sl_bt_evt_connection_opened – надрукувати дескриптор зв’язку та зберегти дескриптор з’єднання. Якщо дескриптор зв’язку 0xFF, зв’язок між підключеними пристроями не існує. Змініть існуючий обробник подій так, щоб він виглядав приблизно так:
      3. sl_bt_evt_connection_parameters – режим безпеки. Це робиться для того, щоб ви могли бачити, коли змінюється режим безпеки. Існує різниця в нумерації режимів безпеки, коли режим безпеки 1 нумерується зі значенням 0 тощо. Додайте такий обробник подій до своєї програми:
      4. sl_bt_evt_connection_closed_id. Цей обробник подій змінено, щоб оновити дескриптор підключення. Значення 0xFF використовується для вказівки на відсутність активного з’єднання. Команда app_log() використовується для виведення причини закриття з’єднання, список кодів стану тут. Змініть існуючий обробник подій так, щоб він виглядав приблизно так:
  6. Збірка та прошивка проекту. На цьому етапі ми запустимо sample app, щоб побачити, як він поводиться без будь-яких змін, окрім бази даних GATT.
  7. Підключіться до мобільного додатку EFRConnect наступним чином:
      1. Торкніться піктограми «Bluetooth Browser».
      2. Торкніться піктограми «Підключити» на пристрої під назвою «Навчання».
  8. Прочитайте незахищену характеристику таким чином:
      1. Торкніться посилання «Докладніше» під невідомою службою з UUID a815944e-da1e-9d2a-02e2-a8d15e2430a0.
      2. Прочитайте незахищену характеристику UUID f9e91a44-ca91-4aba-1c33-fd43ca270b4c, торкнувшись піктограми «Прочитати». Тут немає сюрпризів. Оскільки характеристика жодним чином не захищена, вона буде надіслана у вигляді відкритого тексту.
  9. Тепер прочитайте захищену характеристику UUID d4261dbb-dcd0-daab-ec95-deec088d532b. Ваш мобільний телефон має запропонувати створити пару та підключитися, повідомлення може відрізнятися залежно від мобільної ОС. Після того як ви приймете запит на створення пари, на консолі має з’явитися таке повідомлення: Примітка: Додаток А в кінці цього посібника містить короткий опис можливостей вводу-виводу та методів сполучення для довідки. У Додатку B підсумовано режими безпеки Bluetooth.

Конфігурація диспетчера безпеки

Менеджер безпеки є частиною стеку Bluetooth, який визначає, які функції безпеки використовуються. Ці функції включають захист «людина посередині» (MITM), захищені з’єднання LE (також відомі як ECDH), вимагають підтвердження для з’єднання тощо. Менеджер безпеки також обробляє можливості вводу-виводу, які використовуються для визначення методу сполучення. /bonding (зведення див. у Додатку A). У цьому розділі ви побачите просте налаштування.

  1. Налаштуйте SM з потрібною конфігурацією. Апаратне забезпечення цієї лабораторії дозволяє легко відображати ключ доступу на консолі. Для ввімкнення захисту MITM необхідно ввести ключ доступу. Додайте наступний код до свого обробника подій sl_bt_system_boot_id. Це вмикає функцію «людина посередині» та інформує віддалений пристрій, що ми маємо можливість відобразити ключ доступу, але це все.
  2. Для відображення ключа доступу на консолі потрібен обробник подій, як показано нижче:
  3. Встановіть режим з’єднання, максимальну кількість з’єднань тощо. Щоб розпочати, використовуйте наступний код:Ці налаштування можна використовувати, щоб обмежити здатність зловмисника зв’язуватися з вашим пристроєм. Якщо ваш продукт повинен мати лише одного користувача, ви можете обмежити максимальну кількість зв’язків до 1. Хорошим місцем для додавання цих викликів є обробник подій sl_bt_system_boot_id. Наразі ми не вмикаємо зв’язування, щоб решта лабораторії працювала легше, але ми встановили політику зв’язування, щоб дозволити лише одне зв’язування. Для довідки, документацію для цих API можна знайти тут і тут.
  4. Додайте обробники подій для sl_bt_evt_sm_bonded_id і sl_bt_evt_sm_bonding_failed_id. Основне використання цих подій зараз є інформаційним, але пізніше в лабораторії ви додасте функціональність.
  5. Збірка та прошивка до цільової дошки. Підключіться до EFRConnect і зчитайте захищену характеристику, як і раніше. Цього разу на консолі ви побачите ключ доступу. Введіть цей ключ доступу на своєму мобільному телефоні, коли буде запропоновано.
  6. Спробуйте підтвердження з’єднання. Ця функція дає користувачеві можливість вимагати підтвердження запитів на з’єднання. Це дає програмі контроль над тим, з якими одноранговими пристроями вона зв’язується. Однією з можливостей є вимагати від користувача натиснути кнопку, перш ніж дозволити зв’язок.
    1. Відкрийте налаштування Bluetooth у своєму мобільному телефоні та видаліть прив’язку до пристрою EFR32. Реалізації мобільних телефонів відрізняються, тому цей крок може не знадобитися. Якщо ви не бачите пристрій «Навчання» в налаштуваннях Bluetooth, просто перейдіть до наступного кроку.
    2. У компонентах програмного забезпечення встановіть один екземпляр простого обробника кнопок.
    3. Додайте заголовок file sl_simple_button_instances.h в app.c
    4. Додайте обробник для події sl_bt_evt_sm_bonding_confirm_id. Основне завдання цього обробника подій — повідомити користувача про те, що віддалений пристрій запитує новий зв’язок.
    5. Додайте функцію зворотного виклику для простого обробника кнопок, щоб надіслати сигнал стеку Bluetooth, який вказує на натискання кнопки. Це замінює зворотний виклик за замовчуванням, який просто повертає.
    6. Додайте обробник подій зовнішнього сигналу. Ця подія виникає у відповідь на отримання сигналу, як у попередньому кроці. Подія зовнішнього сигналу буде використана для підтвердження з’єднання.
    7. Змініть виклик sl_bt_sm_configure, щоб вимагати підтвердження з’єднання, наприклад
    8. Перебудувати та перепрошити.
    9. Підключіться до EFRConnect і зчитайте захищену характеристику, як і раніше. Тепер ви побачите на консолі таке повідомлення:Натисніть PB0, щоб підтвердити з’єднання. Тепер консоль відобразить ключ доступу, який потрібно ввести на мобільному телефоні для підключення. Введіть ключ доступу, щоб завершити процес зв’язування.

 

Підказка: використовуйте регістр за замовчуванням в обробнику подій, щоб вивести повідомлення, коли стек надсилає подію, яка не оброблена. Можливо, стек намагається повідомити вам щось важливе.

За межами основ

На цьому етапі ви взяли авансtage із функцій безпеки, які може запропонувати наш стек. Тепер давайте покращимо реалізацію, розумно використовуючи наявні в нашому розпорядженні функції. Наступні кроки є необов’язковими та не залежать один від одного, ви можете створити та прошити після кожного, щоб побачити поведінку, або спробувати їх усі разом.

  1. Від’єднайтеся при невдалих спробах зв’язку. Це гарне місце для виявлення загроз. Якщо віддалений пристрій не підтримує шифрування/автентифікацію або просто не має правильних ключів, це може бути хакер. Отже, розриваємо зв'язок. Спробуйте додати виклик sl_bt_connection_close() у подію sl_bt_sm_bonding_failed_id. API задокументовано тут.Ви можете перевірити цю функцію, ввівши неправильний ключ доступу.
  2. Дозволяє зв’язування лише в певний час. Це обмежує час, який зловмисник має для встановлення зв’язку, і дає змогу використовувати функцію «дозволити лише пов’язані з’єднання». Дизайнер може вибрати, як увімкнути чи вимкнути режим зв’язування. З метою демонстрації ми ввімкнемо «режим налаштування» за допомогою PB1 і використаємо таймер, щоб вимкнути його через 30 секунд.
    1. Встановіть другий екземпляр простого кнопкового інтерфейсу. Це дозволить використовувати PB1.
    2. Змініть зворотний виклик, щоб надіслати інший сигнал у стек, щоб увімкнути/вимкнути з’єднання. Результат повинен виглядати приблизно так:
    3. Змініть зовнішній обробник подій сигналу, щоб він обробляв цей новий сигнал. Результат повинен бути таким:
    4. Додайте обробник події для події sl_bt_evt_system_soft_timer_id. Це буде використано для вимкнення режиму налаштування.
    5. Наступний код можна використовувати, щоб увімкнути режим зв’язування та дозволити всі підключення або вимкнути режим зв’язування та дозволити підключення лише з підключених пристроїв:
    6. Додайте наступний виклик до обробника подій sl_bt_system_boot_id
    7. Зберіть проект і запишіть його на пристрій.
    8. Спробуйте підключитися до пристрою за допомогою EFRConnect. З’єднання повинно бути невдалим.
    9. Тепер спробуйте натиснути PB1 перед підключенням до EFRConnect. Цього разу підключення буде успішним. Через 30 секунд ви побачите повідомлення на консолі про те, що пристрій виходить із режиму налаштування. Це означає, що режим підключення тепер вимкнено.
  3. Підвищити рівень безпеки під час встановлення з’єднання. Оскільки безпека є необов’язковою, ми повинні запитувати зашифроване з’єднання якнайшвидше, а не покладатися на характеристики GATT. API задокументовано тут. Хорошим місцем для виклику цього API є подія sl_bt_evt_connection_opened_id. Дескриптор з’єднання доступний у змінній з’єднання.

Безпечна ідентифікація

Тепер, коли у нас є безпечніший пристрій Bluetooth, давайте покращимо етап автентифікації. Ви вже бачили, як перевірити надійність пристроїв сховища за допомогою командного рядка в попередніх навчальних лабораторних роботах. У цьому розділі ми побачимо, як один пристрій BLE може підтвердити ідентичність іншого пристрою BLE, запитуючи його ланцюжок сертифікатів і надсилаючи запит. Усі частини безпечного сховища мають власний сертифікат пристрою та пакетний сертифікат. Заводські та кореневі сертифікати жорстко закодовані в клієнтській програмі, щоб забезпечити перевірку всього ланцюжка сертифікатів. Зверніться до AN1268, щоб дізнатися більше про безпечну ідентифікацію.

  1. Визначте глобальний буфер для зберігання підпису атестації пристрою, як показано нижче:
  2. Налаштуйте конфігурацію менеджера безпеки, щоб використовувати з’єднання JustWorks. Це робиться для того, щоб з'єднання було зашифрованим. На практиці слід використовувати захист MITM, але щоб зробити лабораторію простою, ми використаємо JustWorks. Змініть виклик sl_bt_sm_configure на такий:Також закоментуйте виклик setup_mode(true) в обробнику події system_boot.
  3. Відкрийте helpers.c із наданих матеріалів і скопіюйте вміст у app.c. Ці функції зворотного виклику виконують такі завдання, як сегментація сертифікатів, щоб їх можна було надіслати через BLE, перевірка ланцюжка сертифікатів і створення/перевірка виклику.
  4. Необхідно визначити максимальний розмір одиниці передачі (MTU), щоб сертифікати можна було сегментувати та повторно зібрати. Визначте глобальну змінну для збереження MTU, як показано тут:Потім додайте обробник події для події обміну GATT MTU, як показано нижче:
  5. Є три характеристики даних користувача, які можна прочитати. Ці характеристики використовуються для передачі сертифіката пристрою, пакетного сертифіката та виклику. Функція зворотного виклику використовується для обробки цих запитів користувача на читання. Додайте обробник для виклику цієї функції, як показано нижче:Зворотний виклик використовує MTU з кроку №2 для сегментації та надсилання сертифікатів за потреби. Він також обробляє надсилання підписаного виклику.
  6. Клієнт надсилає виклик, випадкове число для підпису сервером, записуючи одну з характеристик GATT. З цієї причини програма повинна мати обробник для події запиту користувача на запис, як показано нижче:
  7. Додайте підтримку безпечної ідентифікації files до проекту:
    1. app_se_manager_macro.h, app_se_manager_secure_identity.c та app_se_secure_identity.h з наданих матеріалів до проекту. Ці fileмістять деякі допоміжні функції для таких завдань, як отримання розміру сертифіката, отримання відкритого ключа пристрою та підписання виклику.
    2. Включіть app_se_manager_secure_identity.h у app.c.
  8. Імпортуйте наданий gatt_configuration-attest.btconf із наданих матеріалів. Ця база даних GATT називається безпечною атестацією, яка включає чотири характеристики, які використовуватимуться для перевірки ідентичності нашого пристрою. До них належать сертифікат пристрою, пакетний сертифікат, виклик і відповідь.
  9. Клієнт, який використовується для імітації такого пристрою, як шлюз, надається як повний проект, оскільки його складніше створити. У загальному вигляді робота клієнта виглядає наступним чином:
    1. Сканує пристрої, що рекламують безпечну службу атестації, і підключається до них.
    2. Виявляє послуги та характеристики баз даних GATT.
    3. Зчитує сертифікати пристрою та пакета та перевіряє ланцюжок сертифікатів за допомогою заводського та кореневого сертифікатів, які він зберіг у флеш-пам’яті.
    4. Надсилає випадковий виклик на сервер.
    5. Спроби перевірити відповідь на виклик.
    6. Закриває з’єднання, якщо будь-яка перевірка не вдається.
  10. Створіть і перезавантажте проект сервера на свій сервер WSTK /radioboard.
  11. Імпортуйте клієнтський проект із папки клієнта у наданих матеріалах. Створіть і перезавантажте клієнтський проект на клієнтську WSTK/радіоплату.
  12. Натисніть reset на клієнті WSTK і відкрийте послідовну консоль. Клієнт починає сканувати пристрої, що рекламують нашу безпечну службу ідентифікації, і підключається, коли знайде.
  13. Клієнт відобразить кілька повідомлень, щоб вказати, що він знайшов сервер із потрібною послугою, і повідомлення про стан перевірки ланцюжка сертифікатів.
  14. Якщо перевірка пройде, клієнт згенерує випадкове число, яке називається викликом, і надішле його на сервер. Сервер підпише виклик за допомогою надійно збереженого приватного ключа пристрою та поверне підпис клієнту, це називається відповіддю на виклик. Потім клієнт використовує відкритий ключ у раніше отриманому сертифікаті пристрою для перевірки підпису. Це робиться для підтвердження того, що сервер справді має закритий ключ, про який він заявив. Якщо виклик перевірено правильно, про це відображається повідомлення; інакше з’єднання буде закрито, і з’явиться повідомлення з поясненням причини.
  15. Тепер надішліть недійсний сертифікат, щоб підтвердити, що перевірка дійсно працює. Ви можете змінити user_read_request_cb(), щоб пошкодити або дані сертифіката, або відповідь на виклик.

Додаток A – Можливості введення/виведення та методи сполучення
Додаток Б – Режими та рівні безпеки

Режим безпеки 1 є єдиним режимом, який підтримується для Bluetooth Low Energy у стеку Silicon Labs. Нижче наведені рівні:

  • Рівень 1 без безпеки
  • Неавтентифіковане сполучення рівня 2 із шифруванням
  • Автентифіковане сполучення рівня 3 із шифруванням
  • Аутентифіковані захищені з’єднання рівня 4 із надійним шифруванням (обмін ключами ECDH)

 

Документи / Ресурси

silabs 21Q2 безпечний пристрій BLE Security Lab [pdfПосібник користувача
21Q2 Лабораторія безпеки безпечного пристрою BLE, Лабораторія безпеки безпечного пристрою BLE, Лабораторія безпеки

Список літератури

Залиште коментар

Ваша електронна адреса не буде опублікована. Обов'язкові поля позначені *