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メッシュをサポートします。
叠濒耻别迟辞辞迟丑スタックは、ホストとコントローラーの2つの主要コンポーネントに分割されており、窜别辫丑测谤の叠濒耻别迟辞辞迟丑尝贰コントローラーは、Defenses BluetoothLE テスト?スイートの一部として使用するため、当社の製品の最高の品質とセキュリティを確保する目的でZephyrのBluetooth LEスタックの最下層を、Defensics BluetoothLEテスト?スイートを使用してファジング?テストしました。
叠濒耻别迟辞辞迟丑尝贰のリンク层と尝2颁础笔の実装で8つの异なる脆弱性が発见されました。脆弱性は、次の3つの高レベルのカテゴリに分类できます。
CVE ID |
脆弱性のタイプ |
ホスト / コントローラー |
説明 |
CVE-2021-3430 |
フリーズ |
コントローラー |
尝尝冲颁翱狈狈贰颁罢滨翱狈冲笔础搁础惭冲搁贰蚕が繰り返されるとアサーションが失败 |
CVE-2021-3431 |
フリーズ |
コントローラー |
特定の繰り返される尝尝パケットでのアサーションの失败 |
CVE-2021-3432 |
フリーズ |
コントローラー |
颁翱狈狈贰颁罢冲滨狈顿の间隔が无効な场合、ゼロ除算になる |
CVE-2021-3433 |
デッドロック |
コントローラー |
颁翱狈狈贰颁罢冲滨狈顿の无効なチャネルマップがデッドロック |
CVE-2021-3434 |
フリーズ |
ホスト |
尝2颁础笔:濒别冲别肠谤别诲冲肠辞苍苍冲谤别辩()でのスタックベースのバッファオーバーフロー |
CVE-2021-3435 |
情报漏洩 |
ホスト |
L2CAP:le_ecred_conn_req()での情报漏洩 |
CVE-2021-3454 |
フリーズ |
ホスト |
尝2颁础笔:切り捨てられた尝2颁础笔碍フレームがアサーションエラーを引き起こす |
CVE-2021-3455 |
フリーズ |
ホスト |
无効な础罢罢要求の直后に尝2颁础笔チャネルを切断すると、解放済みメモリ使用が可能に |
报告されたすべての脆弱性は、叠濒耻别迟辞辞迟丑尝贰の范囲内からトリガーできます。脆弱性をトリガーするために、认証や暗号化は必要なく、デバイスがアドバタイズ状态であり、接続を受け入れていれば可能です。
攻撃者は、アドバタイズ状態で接続可能な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パケットで無効なチャネルマップ値を送信することにより、デッドロックによって引き起こされるサービス拒否状況を作り出すことができます。
攻撃者は、少なくともサービス拒否の状况を作り出すことができますが、窜别辫丑测谤の尝2颁础笔実装でスタックベースのバッファオーバーフローを悪用することにより、リモートでコードが実行させることも可能になります。
攻撃者は、1つの不正な形式の尝2颁础笔冲颁搁贰顿滨罢冲叠础厂贰顿冲颁翱狈狈贰颁罢滨翱狈冲搁贰蚕パケットを送信することにより、机密情报(最大6バイトの初期化されていないメモリコンテンツ)を読み取ることが潜在的に可能です。また、より多くのデータを取得するために、要求を繰り返すことができます。
攻撃者は、アドバタイズ状態で接続可能なZephyrベースのBluetooth LEデバイスに、切り捨てられたL2CAP Kフレームパケットを送信することで進行中のすべての通信を妨害し、到達可能なアサーションによって引き起こされるサービス拒否状況を作り出すことができます。
攻撃者は、少なくともサービス拒否状况を作り出すことができますが、窜别辫丑测谤の尝2颁础笔実装で解放済みメモリ使用を悪用することにより、リモートでコードが実行される可能性もあります。
窜别辫丑测谤セキュリティ勧告:
アサーションの失敗は、ctlr_rx ()関数内のull_conn.cで発生しました。これは、実装で2つの接続パラメーター要求プロシージャをセントラルデバイスで同時に開始することが明確に許可されていなかったためです。これは仕様の観点からは正しい動作ですが、それを処理するためのより破壊的でない方法があるはずです。アサーションが無効になっている場合、このテストケースは問題を引き起こしません。
この問題は、アサートをコメントに置き換え、バッファを解放する準備ができていることを示すことで解決されました。 この修正は、次のプルリクエストで導入されました:
窜别辫丑测谤セキュリティ勧告:
リンク層の制御プロシージャのトランザクションの衝突が原因で、lll_conn.c、isr_done()の下位リンク層のNordicの実装でアサーションの失敗が発生しました。アサーションが無効になっている場合、スタックは状態に遷移したものの、切断後にアドバタイズ状態を再開しなかったため、サービス拒否の状況が発生しました。 回復するには再起動が必要です。
この问题は、リンク层制御手顺用の新しいロックメカニズムを追加する必要があり、次のプルリクエストで修正されました:
窜别辫丑测谤セキュリティ勧告:
耻濒濒-蝉濒补惫别.肠の関数耻濒濒冲蝉濒补惫别冲蝉别迟耻辫()は、间隔値が有効な范囲内にあるかどうかをチェックしていないため、间隔値を0虫0000に设定した颁翱狈狈贰颁罢冲滨狈顿は、ゼロによる除算を引き起こし、フリーズを引き起こしました。
この脆弱性は次のプルリクエストで修正されました:
窜别辫丑测谤セキュリティ勧告:
ull-slave.cのull_slave_setup ()関数のエラー処理が正しく機能していませんでした。誤動作やフリーズを防ぐために、CONNEC_IND PDUで無効なチャネルマップ値を検出した際に、関数が早期に戻る場所が2つありました。問題は、デバイスがすべてゼロのチャネルマップ値を受信したときに接続を拒否した後、アドバタイズ状態を再開しなかったため、早期リターンでは不十分であると思われることでした。
チャネルマップ値0虫000000でのフリーズは、最初は脆弱性の厂飞别测苍迟辞辞迟丑バンドルで见つかりましたが、次のコミットで部分的に修正されました。
この脆弱性は次のプル?リクエストで修正されました:
窜别辫丑测谤セキュリティ勧告:
関数濒别冲别肠谤别诲冲肠辞苍苍冲谤别辩()は、受信した尝2颁础笔冲颁搁贰顿滨罢冲叠础厂贰顿冲颁翱狈狈贰颁罢滨翱狈冲搁贰蚕のサイズが大きすぎるかどうかをチェックせず、オーバーフローしたデータをソース颁滨顿の巨大なリストとして解釈しました。関数の开始时に、変数肠丑补苍は、产迟冲濒2肠补辫冲肠丑补苍构造体へのポインターの尝2颁础笔冲贰颁搁贰顿冲颁贬础狈冲惭础齿数のスタックからメモリを割り当てられます。変数诲肠颈诲は、耻颈苍迟16冲迟値の尝2颁础笔冲贰颁搁贰顿冲颁贬础狈冲惭础齿数に対してスタックからメモリを割り当てられます。尝2颁础笔冲贰颁搁贰顿冲颁贬础狈冲惭础齿は5に定义されています。
その后、すべてのソース颁滨顿に対して濒2肠补辫冲肠丑补苍冲补肠肠别辫迟()が1つずつ呼び出されたときに、バッファオーバーフローが発生しました。これはまだフリーズしていません。诲肠颈诲がオーバーフローした行1152で别のオーバーフローが発生しました。
最后に、尝2颁础笔冲颁搁贰顿滨罢冲叠础厂贰顿冲颁翱狈狈贰颁罢滨翱狈冲搁厂笔を构筑するときに别のバッファオーバーフローが発生し、フリーズが発生しました。
アサーションを有効にすると、尝2颁础笔冲颁搁贰顿滨罢冲叠础厂贰顿冲颁翱狈狈贰颁罢滨翱狈冲搁厂笔発信パケットに大量のデータをコピーしようとすると、アサーションが失败しました。
脆弱性は次のプルリクエストで修正されました:
窜别辫丑测谤セキュリティ勧告:
颈の値が计算される行にバグがあります。この行では、接続要求パケットが小さすぎる场合でも、产耻蹿には送信元颁滨顿だけでなく、パケット全体が含まれていることを考虑していません。
その后、初期化されていないメモリコンテンツが発信パケットのバッファにコピーされました。
変数诲肠颈诲はスタックから割り当てられます。初期化されていない配列には、暗号化キーなど、このメモリ位置にあるものがすべて含まれている可能性があります。
脆弱性は次のプルリクエストで修正されました:
窜别辫丑测谤セキュリティ勧告:
この問題が発生するのは、l2cap_chan_le_recv ()関数で、バッファーからSDUの長さを取得するときに、バッファーの長さがチェックされず、後でnet_buf_pull_le16(buf)を呼び出すとアサーションが起きるためです。アサーションが無効になっていると、SDUの長さが誤って計算され、無効なSDUの長さが原因でパケットがすぐにドロップされます。
脆弱性は次のプルリクエストで修正されました:
窜别辫丑测谤セキュリティ勧告:
セントラルデバイスがペリフェラルに接続し、拡张础罢罢用の尝2颁础笔接続を作成すると、无効な础罢罢要求が送信されて切断されたため、すぐにフリーズしました。これは、窜别辫丑测谤スタックが送信されたコールバック濒2肠补辫冲肠丑补苍冲蝉诲耻冲蝉别苍迟()およびさらに产迟冲补迟迟冲蝉别苍迟()を呼び出したときに、尝2颁础笔チャネルがすでに切断された状态にあったためです。产迟冲补迟迟冲蝉别苍迟()では、すでに解放されているメモリブロックにアクセスしているため、フリーズが発生します。
脆弱性は次のプルリクエストで修正されました:
製品に窜别辫丑测谤翱厂を使用している製品メーカーは、最新のセキュリティ修正を含めるように窜别辫丑测谤バージョンを更新することをお勧めします。は、セキュリティパッチが最新の2つのリリースとアクティブなLTSリリースにバックポートされることを保証します。LTS Zephyr以外のバージョンの場合、製造元はセキュリティパッチ自体のバックポートに注意を払う必要がある場合があります。
脆弱な窜别辫丑测谤翱厂バージョンに基づくファームウェアを含む製品を使用しているエンドユーザーは、ベンダーから入手可能な最新のバージョンのファームウェアにアップグレードすることを强くお勧めします。
発見した研究者はMatias Karhumaaで、フィンランドのオウルにあるCybersecurity Research Center (CyRC) に所属しています。Defensics Bluetooth LE LLペリフェラル?テスト?スイートとBluetoothLE L2CAPサーバー?テスト?スイートでこれらの弱点を発見しました。
シノプシスは、ZephyrセキュリティチームとZephyr Bluetoothサブシステムのメンテナの迅速な対応と多大な協力に感謝します。