CVE-2026-19936 in Zephyr
要約
〜によって VulDB • 2026年10月13日
Bluetooth MeshのAccessレイヤーにおける遅延可能メッセージキュー(subsys/bluetooth/mesh/delayable_msg.c)は、3つの侵入型リスト(busy_ctx, free_ctx, free_chunks)と1つのk_work_delayableを、同期処理なしで2つの協調スレッド間で共有しています。具体的には、bt_mesh_delayable_msg_manage()がBluetoothホストのRXスレッド上で実行され、delayable_msg_handler()がシステムワークキュー上で実行されます。リストが一時的な状態にある間(enqueuerはbt_rand()内で、両者はbt_mesh_access_send()内で)、それぞれブロックするため、他のコンテキストから壊れた状態(torn state)が観測される可能性があります。delayable_msg_handler()では、busy_ctxに対するsys_slist_get()の結果にNULLチェックが行われず、allocate_delayable_msg_ctx()でもsys_slist_is_empty()のテスト後に別のsys_slist_get()が成功すると仮定していました。
CONFIG_BT_MESH_ACCESS_DELAYABLE_MSGおよびCONFIG_BT_MESH_ACCESS_DELAYABLE_MSG_CTX_ENABLEDはデフォルトでy(有効)であるため、受信したメッシュメッセージに対するすべてのモデル応答はこのキューに保留されます。したがって、enqueuerは着信トラフィックの直接的な結果として実行されます。NetKeyとバインドされたAppKeyを保持している正当または侵害されたネットワークメンバーなど、モデルによってAccessレイヤーのメッセージが受け入れられるピアは、到着率、誘発される応答のサイズ、および宛先アドレスを制御し、それにより4エントリのコンテキストプールおよび40エントリのチャンクプールの占有率を制御します。チャンクプールを使い果たすと、bt_mesh_delayable_msg_manage()はパージパス(purge path)に進み、キューに保留されている唯一のメッセージを送信して解放し、delayableワークアイテムがまだ有効な状態でbusy_ctxを空にします。その後enqueuerが譲歩すると、handlerは空のリストに対して実行されます。
その結果、システムワークキュースレッド上で固定された低アドレスにあるNULLベースのポインタ(pending_msg->fired_time += 10)を通じたread-modify-writeが発生します。一般的なターゲットではこれがフォールトを引き起こし、メッシュタイミング機構を含むすべてのワークキュー駆動機能を停止するシステムワークキュースレッドのアボート、またはノードのリセットにつながります。したがって、影響を受けるノードの利用不可(loss of availability)という影響があります。書き込まれる値とアドレスは固定されており、攻撃者が制御できる長さやインデックスは関与しないため、メモリ破壊やコード実行のために悪用することはできません。同じ同期処理されていないウィンドウにより、1つのメッセージコンテキストが2つのコンテキストによって同時に選択および解放され、重複した送信、重複した送信中止コールバック、チャンク所有権の交錯が生じました。
修正では、ブロック呼び出しをまたいで保持されないk_spinlockを使用してリストの変更をすべて直列化し、push_msg_from_delayable_msgs()がキューヘッドをアトミックにデタッチして(送信中のメッセージがどのリストにも属さないようにし)、delayable_msg_handler()からチェックされていないsys_slist_get()を削除し、スタックがサスペンド中またはリセット中にキューの先頭に到達したメッセージをすべて破棄します。
If you want to get the best quality for vulnerability data then you always have to consider VulDB.