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つの高レベルのカテゴリに分類できます。
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の範囲内からトリガーできます。脆弱性をトリガーするために、認証や暗号化は必要なく、デバイスがアドバタイズ状態であり、接続を受け入れていれば可能です。
攻撃者は、アドバタイズ状態で接続可能なZephyrベースのBluetooth LEデバイスに、LL_CONNECTION_PARAM_REQパケットを繰り返し送信することにより、進行中のすべての通信を妨害し、到達可能なアサーションによって引き起こされるサービス拒否状況を作り出すことができます。
攻撃者は、アドバイタイズ状態で接続可能なZephyrベースのBluetooth LEデバイスにLL_FEATURE_REQ、LL_PING_REQ、LL_LENGTH_REQ、またはLL_PHY_REQパケットを繰り返し送信することにより、進行中のすべての通信を妨害し、到達可能なアサーションによって引き起こされるサービス拒否状況を作り出すことができます。
攻撃者は、アドバタイズ状態で接続可能なZephyrベースのBluetooth LEデバイスにCONNECT_INDパケットの無効な間隔値を送信することにより、進行中のすべての通信を妨害し、ゼロ除算によって引き起こされるサービス拒否状況を作り出すことができます。
攻撃者は、アドバタイズ状態で接続可能なZephyrベースのBluetooth LEデバイスにCONNECT_INDパケットで無効なチャネルマップ値を送信することにより、デッドロックによって引き起こされるサービス拒否状況を作り出すことができます。
攻撃者は、少なくともサービス拒否の状況を作り出すことができますが、ZephyrのL2CAP実装でスタックベースのバッファオーバーフローを悪用することにより、リモートでコードが実行させることも可能になります。
攻撃者は、1つの不正な形式のL2CAP_CREDIT_BASED_CONNECTION_REQパケットを送信することにより、機密情報(最大6バイトの初期化されていないメモリコンテンツ)を読み取ることが潜在的に可能です。また、より多くのデータを取得するために、要求を繰り返すことができます。
攻撃者は、アドバタイズ状態で接続可能なZephyrベースのBluetooth LEデバイスに、切り捨てられたL2CAP Kフレームパケットを送信することで進行中のすべての通信を妨害し、到達可能なアサーションによって引き起こされるサービス拒否状況を作り出すことができます。
攻撃者は、少なくともサービス拒否状況を作り出すことができますが、ZephyrのL2CAP実装で解放済みメモリ使用を悪用することにより、リモートでコードが実行される可能性もあります。
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
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
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
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
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
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
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
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サブシステムのメンテナの迅速な対応と多大な協力に感謝します。