silabs21Q2セキュアBLEデバイスセキュリティラボ

BLEセキュリティラボマニュアル

このラボでは、より安全なBLEデバイスを設計する方法を説明します。 オーバーから始めますview いくつかのスタック機能の使用方法について説明し、より安全な接続の手法に関する一般的なアドバイスに進みます。最後に、BLEを介してデバイス証明書を使用して周辺機器を本物として識別する方法を説明します。

はじめる

Bluetoothamp構築するアプリケーションは、ブートローダーで使用することを目的としています。 新品のEFR32MG21Bを使用している場合、ブートローダーはありません。 ビルド済みのブートローダーは、platform \ bootloader\sにあります。ampSDKのle-apps\bootloader-storage-internalsingle\efr32mg21a010f1024im32-brd4181aフォルダー。

  1. soc-emptysから始めますampルアプリ。 これはample appはテンプレートとして使用され、BLEアプリケーションの出発点として適しています。
    1. SimplicityStudioからSiliconLabsプロジェクトウィザードを開きます File メニュー->新規。
    2. BRD4181Cを選択し、[次へ]ボタンをクリックします。
    3. テクノロジタイプの下にある[Bluetooth(9)]チェックボックスをクリックします。
    4. [Bluetooth – SoC空]を強調表示して、[次へ]をクリックします。
    5. [完了]ボタンをクリックします。
  2. これで、いくつかの特性を追加して、保護された特性と保護されていない特性がどのように異なる方法で処理されるかを確認できます。
    1. プロジェクトのslcpを開きます file プロジェクトエクスプローラウィンドウでダブルクリックします
    2. [ソフトウェアコンポーネント]タブを強調表示し、以下に示すようにGATT構成ツールを開きます。 そして、以下に示すインポートツールを使用してgatt_configuration.btconfをインポートします file 提供された資料のサーバーフォルダから。GATTデータベースには、「トレーニング」と呼ばれるカスタムサービスがあり、保護されているデータと保護されていないデータがあります。 これにより、保護された特性と保護されていない特性にアクセスしようとしたときに何が起こるかを比較できます。 これは、非常に基本的なセキュリティを備えたデバイスをすばやく作成する方法です。
  3. シリアルポートを使用してSimplicityStudioのコンソールに印刷し、アプリケーションで何が起こっているかを追跡します。 これらのコンポーネントを見つける最も簡単な方法は、次のように[ソフトウェアコンポーネント]ダイアログでコンポーネントを検索することです。
      1. IOStreamUSARTコンポーネントをインストールします
      2. IO StreamRetargetSTDIOコンポーネントをインストールします
      3. 標準I/Oコンポーネントをインストールします
      4. ログコンポーネントをインストールします
      5. ボード制御コンポーネントを開き、「仮想COMUARTを有効にする」をオンにします
      6. [アダプタのデバッグ]パネルでアダプタを右クリックし、[コンソールの起動]を選択します。 [シリアル1]タブを選択し、コンソールウィンドウのテキスト入力フィールドにカーソルを置き、Enterキーを押してコンソールを起動します。
  4. 接続ハンドルを保存するために、app.cにあるsl_bt_on_event()にローカル変数を作成します。 この関数はスタックによってイベントが発生するたびに呼び出され、値を永続化する必要があるため、変数は静的である必要があります。 接続ハンドルは後で使用されますラボのセクション。
  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. プロジェクトをビルドしてフラッシュします。 この時点で、sを実行しますampGATTデータベース以外に、変更なしでどのように動作するかを確認するためのアプリ。
  7. 次のようにEFRConnectモバイルアプリに接続します。
      1. 「Bluetoothブラウザ」アイコンをタップします。
      2. 「トレーニング」という名前のデバイスの「接続」アイ​​コンをタップします。
  8. 保護されていない特性を次のように読み取ります。
      1. UUID a815944e-da1e-9d2a-02e2-a8d15e2430a0を使用して、不明なサービスの下にある[詳細]リンクをタップします。
      2. 「読み取り」アイコンをタップして、保護されていない特性UUIDf9e91a44-ca91-4aba-1c33-fd43ca270b4cを読み取ります。 ここに驚きはありません。 特性は一切保護されていないため、プレーンテキストで送信されます。
  9. 次に、保護された特性UUIDd4261dbb-dcd0-daab-ec95-deec088d532bを読み取ります。 携帯電話でペアリングと接続を求めるメッセージが表示されます。メッセージはモバイルOSによって異なる場合があります。 ペアリングのリクエストを受け入れると、コンソールに次のようなメッセージが表示されます。 注記:このマニュアルの最後にある付録Aには、参考のためにI/O機能とペアリング方法の概要が記載されています。 付録Bは、Bluetoothセキュリティモードをまとめたものです。

SecurityManagerの構成

セキュリティマネージャは、使用するセキュリティ機能を決定するBluetoothスタックの一部です。 これらの機能には、man-in-the-middle(MITM)保護、LE Secure接続(別名ECDH)、ボンディングの確認が必要などが含まれます。セキュリティマネージャは、ペアリングに使用される方法を決定するために使用されるI/O機能も処理します。 / bonding(要約については付録Aを参照)。 このセクションでは、簡単なセットアップについて説明します。

  1. 必要な構成でSMをセットアップします。 このラボのハードウェアを使用すると、コンソールにパスキーを簡単に表示できます。 パスキーエントリは、MITM保護を有効にするための要件です。 次のコードをsl_bt_system_boot_idイベントハンドラーに追加します。 これにより、man-in-the-middleが可能になり、パスキーを表示できることをリモートデバイスに通知しますが、それだけです。
  2. コンソールにパスキーを表示するには、以下に示すようにイベントハンドラーが必要です。
  3. ボンディングモード、ボンディングの最大数などを設定します。開始するには、次のコードを使用します。これらの設定を使用して、攻撃者がデバイスに結合する能力を制限できます。 製品に必要なユーザーが1人だけの場合は、結合の最大数をXNUMXに制限できます。これらの呼び出しを追加するのに適した場所は、sl_bt_system_boot_idイベントハンドラーです。 ラボの残りの部分をよりスムーズに進めるために、現時点ではボンディングを有効にしませんが、ボンディングポリシーを設定してXNUMXつのボンディングのみを許可します。 参考までに、これらのAPIのドキュメントはこことここにあります。
  4. sl_bt_evt_sm_bonded_idおよびsl_bt_evt_sm_bonding_failed_idのイベントハンドラーを追加します。 これらのイベントの主な用途は現在有益ですが、ラボの後半で機能を追加します。
  5. ビルドしてターゲットボードにフラッシュします。 EFRConnectに接続し、前と同じように保護された特性を読み取ります。 今回は、コンソールにパスキーが表示されます。 プロンプトが表示されたら、携帯電話でこのパスキーを入力します。
  6. ボンディング確認をお試しください。 この機能により、ユーザーはボンディング要求の確認を要求できます。 そうすることで、アプリケーションは、どのピアデバイスと結合するかを制御できます。 XNUMXつの可能性は、結合を許可する前にユーザーにボタンを押すように要求することです。
    1. 携帯電話でBluetooth設定を開き、EFR32デバイスへの結合を解除します。 携帯電話の実装はさまざまであるため、この手順は必要ない場合があります。 Bluetooth設定に「トレーニング」デバイスが表示されない場合は、次の手順に進んでください。
    2. ソフトウェアコンポーネントで、シンプルボタンハンドラーのインスタンスをXNUMXつインストールします。
    3. ヘッダーを含める file app.cのsl_simple_button_instances.h
    4. sl_bt_evt_sm_bonding_confirm_idイベントのハンドラーを追加します。 このイベントハンドラーの主な役割は、リモートデバイスが新しいボンドを要求していることをユーザーに通知することです。
    5. シンプルなボタンハンドラーのコールバック関数を追加して、ボタンが押されたことを示す信号をBluetoothスタックに送信します。 これは、単に戻るデフォルトのコールバックをオーバーライドします。
    6. 外部シグナルイベントハンドラーを追加します。 このイベントは、前の手順のように、シグナルの受信に応答して発生します。 外部信号イベントは、ボンディングを確認するために使用されます。
    7. sl_bt_sm_configureへの呼び出しを変更して、次のようなボンディング確認を要求します。
    8. 再構築してフラッシュします。
    9. EFRConnectに接続し、前と同じように保護された特性を読み取ります。 これで、コンソールに次のようなメッセージが表示されます。PB0を押して結合を確認します。 これで、コンソールに、ボンディングのために携帯電話に入力するパスキーが表示されます。 パスキーを入力して、ボンディングプロセスを完了します。

 

ヒント:スタックが処理されないイベントを送信したときにメッセージを出力するには、イベントハンドラーのデフォルトのケースを使用します。 スタックはあなたに何か重要なことを伝えようとしているのかもしれません。

基礎を超えて

この時点で、あなたはアドバンを取りましたtag私たちのスタックが提供しなければならないセキュリティ機能のe。 それでは、自由に使える機能を賢明に使用して、実装を改善しましょう。 次の手順はオプションであり、互いに独立しています。各手順の後にビルドしてフラッシュし、動作を確認したり、すべてを一緒に試したりすることができます。

  1. 失敗した結合の試行で切断します。 これは、脅威を検出するのに適した場所です。 リモートデバイスが暗号化/認証をサポートしていないか、正しいキーを持っていない場合は、ハッカーである可能性があります。 それでは、接続を切断しましょう。 sl_bt_sm_bonding_failed_idイベントでsl_bt_connection_close()への呼び出しを追加してみてください。 APIはここに文書化されています。間違ったパスキーを入力することで、この機能をテストできます。
  2. 特定の時間にのみボンディングを許可します。 これにより、攻撃者が結合を形成する必要がある時間が制限され、「結合された接続のみを許可する」機能を使用できるようになります。 設計者は、ボンディング可能モードを有効または無効にする方法を選択できます。 ここでのデモンストレーションの目的で、PB1で「セットアップモード」を有効にし、タイマーを使用して30秒後に無効にします。
    1. シンプルボタンインターフェイスの1番目のインスタンスをインストールします。 これにより、PBXNUMXを使用できるようになります。
    2. コールバックを変更して、別のシグナルをスタックに送信し、ボンディングを有効/無効にします。 結果は次のようになります。
    3. この新しいシグナルを処理するように、外部シグナルイベントハンドラーを変更します。 結果は次のようになります。
    4. sl_bt_evt_system_soft_timer_idイベントのイベントハンドラーを追加します。 これは、セットアップモードを無効にするために使用されます。
    5. 次のコードを使用して、ボンディング可能なモードを有効にしてすべての接続を許可するか、ボンディング可能なモードを無効にしてボンディングされたデバイスからの接続のみを許可することができます。
    6. sl_bt_system_boot_idイベントハンドラーに次の呼び出しを追加します
    7. プロジェクトをビルドし、デバイスにフラッシュします。
    8. EFRConnectを使用してデバイスに接続してみてください。 接続は失敗するはずです。
    9. EFRConnectに接続する前に、PB1を押してみてください。 今回は接続が成功します。 30秒後、デバイスがセットアップモードを終了していることを示すメッセージがコンソールに表示されます。 これは、ボンディング可能モードが無効になったことを意味します。
  3. 接続形成時のセキュリティを強化します。 セキュリティはオプションであるため、GATTの特性に依存するのではなく、できるだけ早く暗号化された接続を要求する必要があります。 APIはここに文書化されています。 このAPIを呼び出すのに適した場所は、sl_bt_evt_connection_opened_idイベントです。接続ハンドルは接続変数で使用できます。

安全なアイデンティティ

より安全なBluetoothデバイスができたので、認証手順を改善しましょう。 以前のトレーニングラボで、コマンドラインを使用してボールトデバイスの安全なIDを確認する方法をすでに説明しました。 このセクションでは、あるBLEデバイスが証明書チェーンを要求してチャレンジを送信することにより、別のBLEデバイスのIDを確認する方法を説明します。 すべての安全なボールトパーツは、独自のデバイス証明書とバッチ証明書を保持しています。 ファクトリ証明書とルート証明書は、証明書チェーン全体の検証を可能にするためにクライアントアプリケーションにハードコードされています。 安全なIDの詳細については、AN1268を参照してください。

  1. 以下のように、デバイス認証署名を保存するためのグローバルバッファを定義します。
  2. JustWorksペアリングを使用するようにセキュリティマネージャの構成を設定します。 これは、接続が暗号化されるように行われます。 実際には、MITM保護を使用する必要がありますが、ラボを単純にするために、JustWorksを使用します。 sl_bt_sm_configureへの呼び出しを次のように戻します。また、system_bootイベントハンドラーでsetup_mode(true)の呼び出しをコメントアウトします。
  3. 提供された資料からhelpers.cを開き、内容をapp.cにコピーします。 これらのコールバック関数は、BLEを介して送信できるように証明書をセグメント化する、証明書チェーンを検証する、チャレンジを生成/検証するなどのタスクを実行します。
  4. 証明書をセグメント化して再アセンブルできるように、最大​​転送単位(MTU)サイズを決定する必要があります。 次に示すように、MTUを保存するグローバル変数を定義します。次に、以下に示すように、GATTMTU交換イベントのイベントハンドラーを追加します。
  5. 読み取ることができるXNUMXつのユーザーデータ特性があります。 これらの特性は、デバイス証明書、バッチ証明書、およびチャレンジを伝達するために使用されます。 コールバック関数は、これらのユーザー読み取り要求を処理するために使用されます。 以下に示すように、この関数を呼び出すハンドラーを追加します。コールバックは、ステップ2のMTUを使用して、必要に応じて証明書をセグメント化して送信します。 また、署名されたチャレンジの送信も処理します。
  6. クライアントは、GATT特性のいずれかを書き込むことにより、サーバーによって署名される乱数であるチャレンジを送信します。 このため、アプリケーションには、次のようにユーザー書き込み要求イベントのハンドラーが必要です。
  7. 安全なIDサポートを追加する filesプロジェクトへ:
    1. app_se_manager_macro.h、app_se_manager_secure_identity.c、およびapp_se_secure_identity.hは、提供された資料からプロジェクトに送信されます。 これらは file■証明書のサイズの取得、デバイスの公開鍵の取得、チャレンジへの署名など​​のタスクのためのいくつかのヘルパー関数が含まれています。
    2. app.cにapp_se_manager_secure_identity.hを含めます。
  8. 提供された資料から提供されたgatt_configuration-attest.btconfをインポートします。 このGATTデータベースは安全な証明と呼ばれ、デバイスのIDを検証するために使用されるXNUMXつの特性が含まれています。 これらには、デバイス証明書、バッチ証明書、チャレンジ&レスポンスが含まれます。
  9. ゲートウェイなどのデバイスをシミュレートするために使用されるクライアントは、構築がより複雑であるため、完全なプロジェクトとして提供されます。 一般的に、クライアントの操作は次のとおりです。
    1. 安全な認証サービスをアドバタイズするデバイスをスキャンし、それらに接続します。
    2. GATTデータベースのサービスと特性を発見します。
    3. デバイスとバッチ証明書を読み取り、フラッシュに保存されているファクトリ証明書とルート証明書を使用して証明書チェーンを検証します。
    4. サーバーにランダムなチャレンジを送信します。
    5. チャレンジへの応答を確認しようとします。
    6. いずれかの検証が失敗した場合、接続を閉じます。
  10. サーバープロジェクトをビルドして、サーバーWSTK/radioboardにフラッシュします。
  11. 提供された資料のクライアントフォルダからクライアントプロジェクトをインポートします。 クライアントプロジェクトをビルドして、クライアントWSTK/radioboardにフラッシュします。
  12. クライアントWSTKでリセットを押して、シリアルコンソールを開きます。 クライアントは、セキュアIDサービスをアドバタイズするデバイスのスキャンを開始し、デバイスが見つかると接続します。
  13. クライアントは、証明書チェーンの検証に関する目的のサービスとステータスメッセージを備えたサーバーを検出したことを示すいくつかのメッセージを表示します。
  14. 検証に合格すると、クライアントはチャレンジと呼ばれる乱数を生成し、サーバーに送信します。 サーバーは、安全に保持された秘密デバイスキーと署名を使用してチャレンジに署名し、クライアントに返します。これはチャレンジレスポンスと呼ばれます。 次に、クライアントは以前に受信したデバイス証明書の公開鍵を使用して署名を検証します。 これは、サーバーが実際に持っていると主張した秘密鍵を持っていることを確認するために行われます。 チャレンジが正しく検証されると、その旨のメッセージが表示されます。 それ以外の場合は、接続が閉じられ、理由を説明するメッセージが表示されます。
  15. 次に、無効な証明書を送信して、検証が実際に機能することを確認します。 user_read_request_cb()を変更して、証明書データまたはチャレンジレスポンスのいずれかを破損させることができます。

付録A– I/O機能とペアリング方法
付録B–セキュリティモードとレベル

セキュリティモード1は、SiliconLabsのスタックでBluetoothLowEnergyでサポートされている唯一のモードです。 レベルは次のとおりです。

  • レベル1セキュリティなし
  • 暗号化を使用したレベル2の認証されていないペアリング
  • 暗号化を使用したレベル3の認証済みペアリング
  • 強力な暗号化を使用したレベル4の認証済みセキュア接続(ECDHキー交換)

 

ドキュメント / リソース

silabs21Q2セキュアBLEデバイスセキュリティラボ [pdf] ユーザーマニュアル
21Q2セキュアBLEデバイスセキュリティラボ、セキュアBLEデバイスセキュリティラボ、セキュリティラボ

参考文献

コメントを残す

あなたのメールアドレスは公開されません。 必須項目はマークされています *