ソフトウェア・インテグリティ

 

[CyRC脆弱性勧告]Zephyr Bluetooth LE スタックにおけるサービス拒否の脆弱性

Defensics Bluetooth LEテストスイートを使用して、ZephyrのBluetoothLEスタックに8つの脆弱性が発見されました。

CyRC advisory Zephry

概要

Zephyr OSは、LinuxFoundationと多くの大手業界ベンダーが支援するApacheライセンスのリアルタイムOSプロジェクトです。 Zephyrは、主に組み込みシステムやリソースに制約のあるシステムで使用されます。ARM Cortex-M、Intel x86、ARC、NIOS II、Tensilica Xtensa、SPARC V8、RISC-V 32など、さまざまなCPUアーキテクチャを備えた非常に多種多様なボードをサポートします。Zephyrのネイティブ・ネットワーク・スタックは、LwM2M、BSDソケットを含む複数のプロトコル、OpenThread、リンクレイヤー(LL)を含む完全なBluetooth LEスタック、およびBluetoothメッシュをサポートします。

Bluetoothスタックは、ホストとコントローラーの2つの主要コンポーネントに分割されており、ZephyrのBluetoothLEコントローラーは、Defenses BluetoothLE テスト・スイートの一部として使用するため、当社の製品の最高の品質とセキュリティを確保する目的でZephyrのBluetooth LEスタックの最下層を、Defensics BluetoothLEテスト・スイートを使用してファジング・テストしました。

BluetoothLEのリンク層とL2CAPの実装で8つの異なる脆弱性が発見されました。脆弱性は、次の3つの高レベルのカテゴリに分類できます。

  • フリーズ:この脆弱性により、攻撃者は不正な形式の入力を送信することにより、ターゲットデバイスでリモートでフリーズまたはアサーションの失敗を引き起こす可能性があります。フリーズの場合、ターゲットデバイスの動作は、アサーションが有効になっているかどうか、および致命的なエラーのエラーハンドラーが存在するかどうかによって異なります。ハード障害が発生した場合、デバイスが自動的に再起動するのが一般的です。攻撃者はこれを使用して、他の脆弱性を悪用するときに、単一のパケットで無線でデバイスを再起動する可能性があります。状況によっては、フリーズするとリモートでコードが実行される可能性があります。
  • デッドロック:脆弱性の中には、他のデバイスが接続できないようにターゲット・デバイスが誤動作する状況を引き起こす可能性があります。通常の状態に回復するには、ターゲットを再起動する必要があります。
  • 情報漏洩:この脆弱性により、攻撃者は暗号化キーやメモリ・レイアウトに関する情報などの潜在的に機密情報にアクセスできるようになります。このタイプの脆弱性は、攻撃者がZephyrには存在しないアドレス空間配置のランダム化などの緩和手法を回避しようとしている場合にも使用される可能性があります。
CVE ID 脆弱性のタイプ ホスト / コントローラー 説明
CVE-2021-3430 フリーズ コントローラー LL_CONNECTION_PARAM_REQが繰り返されるとアサーションが失敗
CVE-2021-3431 フリーズ コントローラー 特定の繰り返されるLLパケットでのアサーションの失敗
CVE-2021-3432 フリーズ コントローラー CONNECT_INDの間隔が無効な場合、ゼロ除算になる
CVE-2021-3433 デッドロック コントローラー CONNECT_INDの無効なチャネルマップがデッドロック
CVE-2021-3434 フリーズ ホスト L2CAP:le_ecred_conn_req()でのスタックベースのバッファ・オーバーフロー
CVE-2021-3435 情報漏洩 ホスト L2CAP:le_ecred_conn_req()での情報漏洩
CVE-2021-3454 フリーズ ホスト L2CAP:切り捨てられたL2CAPKフレームがアサーションエラーを引き起こす
CVE-2021-3455 フリーズ ホスト 無効なATT要求の直後にL2CAPチャネルを切断すると、解放済みメモリ使用が可能に

影響

報告されたすべての脆弱性は、BluetoothLEの範囲内からトリガーできます。脆弱性をトリガーするために、認証や暗号化は必要なく、デバイスがアドバタイズ状態であり、接続を受け入れていれば可能です。

CVE-2021-3430:LL_CONNECTION_PARAM_REQが繰り返されるとアサーションを失敗

攻撃者は、アドバタイズ状態で接続可能なZephyrベースのBluetooth LEデバイスに、LL_CONNECTION_PARAM_REQパケットを繰り返し送信することにより、進行中のすべての通信を妨害し、到達可能なアサーションによって引き起こされるサービス拒否状況を作り出すことができます。

  • 影響のあるZephyrバージョン:2.5.0, 2.4.0, 1.14
  • CVSSv3.1 overall score: 5.9 (Medium)
  • CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H/E:P/RL:O/RC:C
  • CWE-617
CVE-2021-3431:特定の繰り返されるLLパケットでのアサーションエラー

攻撃者は、アドバイタイズ状態で接続可能なZephyrベースのBluetooth LEデバイスにLL_FEATURE_REQ、LL_PING_REQ、LL_LENGTH_REQ、またはLL_PHY_REQパケットを繰り返し送信することにより、進行中のすべての通信を妨害し、到達可能なアサーションによって引き起こされるサービス拒否状況を作り出すことができます。

  • 影響のあるZephyrバージョン:2.5.0, 2.4.0
  • CVSSv3.1 overall score: 5.9 (Medium)
  • CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H/E:P/RL:O/RC:C
  • CWE-617
CVE-2021-3432:CONNECT_INDの間隔が無効なため、ゼロによる除算が発生

攻撃者は、アドバタイズ状態で接続可能なZephyrベースのBluetooth LEデバイスにCONNECT_INDパケットの無効な間隔値を送信することにより、進行中のすべての通信を妨害し、ゼロ除算によって引き起こされるサービス拒否状況を作り出すことができます。

  • 影響のあるZephyrバージョン:2.5.0, 2.4.0, 1.14
  • CVSSv3.1 overall score: 5.9 (Medium)
  • CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H/E:P/RL:O/RC:C
  • CWE-369
CVE-2021-3433:CONNECT_INDの無効なチャネルマップがデッドロック

攻撃者は、アドバタイズ状態で接続可能なZephyrベースのBluetooth LEデバイスにCONNECT_INDパケットで無効なチャネルマップ値を送信することにより、デッドロックによって引き起こされるサービス拒否状況を作り出すことができます。

  • 影響のあるZephyrバージョン:2.5.0, 2.4.0, 1.14
  • CVSSv3.1 overall score: 3.9 (Low)
  • CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L/E:P/RL:O/RC:C
  • CWE-703
CVE-2021-3434:L2CAP:le_ecred_conn_req()でのスタックベースのバッファオーバーフロー

攻撃者は、少なくともサービス拒否の状況を作り出すことができますが、ZephyrのL2CAP実装でスタックベースのバッファオーバーフローを悪用することにより、リモートでコードが実行させることも可能になります。

  • 影響のあるZephyrのバージョン:2.5.0, 2.4.0
  • CVSSv3.1 overall score: 7.7 (High)
  • CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H/E:U/RL:O/RC:C
  • CWE-121
CVE-2021-3435:L2CAP:le_ecred_conn_req()での情報漏洩

攻撃者は、1つの不正な形式のL2CAP_CREDIT_BASED_CONNECTION_REQパケットを送信することにより、機密情報(最大6バイトの初期化されていないメモリコンテンツ)を読み取ることが潜在的に可能です。また、より多くのデータを取得するために、要求を繰り返すことができます。

  • 影響のあるZephyrバージョン:2.5.0, 2.4.0
  • CVSSv3.1 overall score: 5.9 (Medium)
  • CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N/E:P/RL:O/RC:C
  • CWE-908
CVE-2021-3454:L2CAP:切り捨てられたL2CAPKフレームでアサーションエラーが発生

攻撃者は、アドバタイズ状態で接続可能なZephyrベースのBluetooth LEデバイスに、切り捨てられたL2CAP Kフレームパケットを送信することで進行中のすべての通信を妨害し、到達可能なアサーションによって引き起こされるサービス拒否状況を作り出すことができます。

  • 影響のあるZephyrバージョン:2.5.0, 2.4.0
  • CVSSv3.1 overall score: 5.9 (Medium)
  • CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H/E:P/RL:O/RC:C
  • CWE-617
CVE-2021-3455:無効なATT要求の直後にL2CAPチャネルを切断することによる解放済みメモリ使用の可能性

攻撃者は、少なくともサービス拒否状況を作り出すことができますが、ZephyrのL2CAP実装で解放済みメモリ使用を悪用することにより、リモートでコードが実行される可能性もあります。

  • 影響のあるZephyrバージョン:2.5.0, 2.4.0
  • CVSSv3.1 overall score: 7.7 (High)
  • CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H/E:U/RL:O/RC:C
  • CWE-416

技術的詳細

CVE-2021-3430:LL_CONNECTION_PARAM_REQが繰り返されアサーションが失敗

Zephyrセキュリティ勧告:https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-46h3-hjcq-2jjr

アサーションの失敗は、ctlr_rx ()関数内のull_conn.cで発生しました。これは、実装で2つの接続パラメーター要求プロシージャをセントラル・デバイスで同時に開始することが明確に許可されていなかったためです。これは仕様の観点からは正しい動作ですが、それを処理するためのより破壊的でない方法があるはずです。アサーションが無効になっている場合、このテストケースは問題を引き起こしません。

この問題は、アサートをコメントに置き換え、バッファを解放する準備ができていることを示すことで解決されました。 この修正は、次のプル・リクエストで導入されました:https://github.com/zephyrproject-rtos/zephyr/pull/33272

CVE-2021-3431:特定の繰り返されるLLパケットでのアサーションエラー

Zephyrセキュリティ勧告:https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-7548-5m6f-mqv9

リンク層の制御プロシージャのトランザクションの衝突が原因で、lll_conn.c、isr_done()の下位リンク層のNordicの実装でアサーションの失敗が発生しました。アサーションが無効になっている場合、スタックは状態に遷移したものの、切断後にアドバタイズ状態を再開しなかったため、サービス拒否の状況が発生しました。 回復するには再起動が必要です。

この問題は、リンク層制御手順用の新しいロックメカニズムを追加する必要があり、次のプル・リクエストで修正されました:https://github.com/zephyrproject-rtos/zephyr/pull/33340

CVE-2021-3432:CONNECT_INDの間隔が無効なため、ゼロによる除算が発生

Zephyrセキュリティ勧告: https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-7364-p4wc-8mj4
ull-slave.cの関数ull_slave_setup()は、間隔値が有効な範囲内にあるかどうかをチェックしていないため、間隔値を0x0000に設定したCONNECT_INDは、ゼロによる除算を引き起こし、フリーズを引き起こしました。

この脆弱性は次のプル・リクエストで修正されました:https://github.com/zephyrproject-rtos/zephyr/pull/33278

CVE-2021-3433:CONNECT_INDの無効なチャネルマップがデッドロック

Zephyrセキュリティ勧告: https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-3c2f-w4v6-qxrp

ull-slave.cのull_slave_setup ()関数のエラー処理が正しく機能していませんでした。誤動作やフリーズを防ぐために、CONNEC_IND PDUで無効なチャネルマップ値を検出した際に、関数が早期に戻る場所が2つありました。問題は、デバイスがすべてゼロのチャネルマップ値を受信したときに接続を拒否した後、アドバタイズ状態を再開しなかったため、早期リターンでは不十分であると思われることでした。

チャネルマップ値0x000000でのフリーズは、最初は脆弱性のSweyntoothバンドルで見つかりましたが、次のコミットで部分的に修正されました。

https://github.com/zephyrproject-rtos/zephyr/commit/4a5f263e5a658bb35c1dd9215fe62939f175c859
https://github.com/zephyrproject-rtos/zephyr/commit/94d5f0854e491e594c2040fe0f061850848081fc

この脆弱性は次のプル・リクエストで修正されました:https://github.com/zephyrproject-rtos/zephyr/pull/33278

CVE-2021-3434:L2CAP:le_ecred_conn_req()でのスタックベースのバッファオーバーフロー

Zephyrセキュリティ勧告: https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-8w87-6rfp-cfrm

関数le_ecred_conn_req()は、受信したL2CAP_CREDIT_BASED_CONNECTION_REQのサイズが大きすぎるかどうかをチェックせず、オーバーフローしたデータをソースCIDの巨大なリストとして解釈しました。関数の開始時に、変数chanは、bt_l2cap_chan構造体へのポインターのL2CAP_ECRED_CHAN_MAX数のスタックからメモリを割り当てられます。変数dcidは、uint16_t値のL2CAP_ECRED_CHAN_MAX数に対してスタックからメモリを割り当てられます。L2CAP_ECRED_CHAN_MAXは5に定義されています。

その後、すべてのソースCIDに対してl2cap_chan_accept()が1つずつ呼び出されたときに、バッファオーバーフローが発生しました。これはまだフリーズしていません。dcidがオーバーフローした行1152で別のオーバーフローが発生しました。

最後に、L2CAP_CREDIT_BASED_CONNECTION_RSPを構築するときに別のバッファオーバーフローが発生し、フリーズが発生しました。

アサーションを有効にすると、L2CAP_CREDIT_BASED_CONNECTION_RSP発信パケットに大量のデータをコピーしようとすると、アサーションが失敗しました。

脆弱性は次のプル・リクエストで修正されました:https://github.com/zephyrproject-rtos/zephyr/pull/33305

CVE-2021-3435:L2CAP:le_ecred_conn_req()での情報漏漏洩

Zephyrセキュリティ勧告: https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-xhg3-gvj6-4rqh

iの値が計算される行にバグがあります。この行では、接続要求パケットが小さすぎる場合でも、bufには送信元CIDだけでなく、パケット全体が含まれていることを考慮していません。

その後、初期化されていないメモリコンテンツが発信パケットのバッファにコピーされました。

変数dcidはスタックから割り当てられます。初期化されていない配列には、暗号化キーなど、このメモリ位置にあるものがすべて含まれている可能性があります。

脆弱性は次のプル・リクエストで修正されました:https://github.com/zephyrproject-rtos/zephyr/pull/33305

CVE-2021-3454:L2CAP:切り捨てられたL2CAPKフレームによるアサーションエラー

Zephyrセキュリティ勧告: https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-fx88-6c29-vrp3

この問題が発生するのは、l2cap_chan_le_recv ()関数で、バッファーからSDUの長さを取得するときに、バッファーの長さがチェックされず、後でnet_buf_pull_le16(buf)を呼び出すとアサーションが起きるためです。アサーションが無効になっていると、SDUの長さが誤って計算され、無効なSDUの長さが原因でパケットがすぐにドロップされます。

脆弱性は次のプル・リクエストで修正されました:https://github.com/zephyrproject-rtos/zephyr/pull/32588

CVE-2021-3455:無効なATT要求の直後にL2CAPチャネルを切断することで、解放済みメモリ使用につながる

Zephyrセキュリティ勧告: https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-7g38-3x9v-v7vp

セントラル・デバイスがペリフェラルに接続し、拡張ATT用のL2CAP接続を作成すると、無効なATT要求が送信されて切断されたため、すぐにフリーズしました。これは、Zephyrスタックが送信されたコールバックl2cap_chan_sdu_sent()およびさらにbt_att_sent()を呼び出したときに、L2CAPチャネルがすでに切断された状態にあったためです。bt_att_sent()では、すでに解放されているメモリブロックにアクセスしているため、フリーズが発生します。

脆弱性は次のプル・リクエストで修正されました:https://github.com/zephyrproject-rtos/zephyr/pull/35597

修正措置

製品にZephyrOSを使用している製品メーカーは、最新のセキュリティ修正を含めるようにZephyrバージョンを更新することをお勧めします。Zephyrのセキュリティポリシーは、セキュリティパッチが最新の2つのリリースとアクティブなLTSリリースにバックポートされることを保証します。LTS Zephyr以外のバージョンの場合、製造元はセキュリティパッチ自体のバックポートに注意を払う必要がある場合があります。

脆弱なZephyrOSバージョンに基づくファームウェアを含む製品を使用しているエンドユーザーは、ベンダーから入手可能な最新のバージョンのファームウェアにアップグレードすることを強くお勧めします。

発見者

発見した研究者はMatias Karhumaaで、フィンランドのオウルにあるCybersecurity Research Center (CyRC) に所属しています。Defensics Bluetooth LE LLペリフェラル・テスト・スイートとBluetoothLE L2CAPサーバー・テスト・スイートでこれらの弱点を発見しました。

シノプシスは、ZephyrセキュリティチームとZephyr Bluetoothサブシステムのメンテナの迅速な対応と多大な協力に感謝します。

タイムライン

  • 2021年 2月 2日: 脆弱性が発見され、解析された。
  • 2021年 3月11日: Zephyrのセキュリティ・チームに脆弱性を報告。
  • 2021年 3月11日: Zephyrは脆弱性を確認。
  • 2021年 3月15日: Zephyrの開発者は多くのリンク層の問題の修正を提供。
  • 2021年 3月17日: Zephyrの開発者はL2CAPに関連する問題の修正を提供したが、修正を確認中にL2CAPに2つの新しい問題を発見。
  • 2021年 3月18日: 2つの新しいL2CAPの脆弱性をZephyrのセキュリティ・チームに報告。
  • 2021年 3月19日: Zephyrのセキュリティ・チームが問題を確認。
  • 2021年 5月25日: 残りのL2CAPの脆弱性の修正を確認。
  • 2021年 6月 5日: 報告された脆弱性を修正したZephyr 2.6.0 をリリース。
  • 2021年 6月22日: シノプシスによる脆弱性勧告の公開。
 

この著者によるその他の情報