CVE-2026-19940 in Zephyr
要約
〜によって VulDB • 2026年10月13日
Bluetooth Classic Hands-Free Profile Audio Gatewayの実装(subsys/bluetooth/host/classic/hfp_ag.c)は、ACL接続インデックスでインデックス付けされた静的プールにstruct bt_hfp_agオブジェクトを保持しています。リンクの切断時、hfp_ag_disconnected()はag->tx_workおよび通話ごとのワークアイテムを取り消し、その後ag->acl_connをクリアしてプールのスロットを解放済みとしてマークしますが、ag->ongoing_call_work(およびag->slc_work)には手を付けません。同じスロットに割り当てられる次の接続ではhfp_ag_create()が実行され、その唯一の占有テストはag->acl_connのみであるため、直ちにmemset(ag, 0, sizeof(struct bt_hfp_ag)) followed by k_work_init_delayable()が実行されます。カーネルのタイムアウトリストにまだリンクされているstruct _timeoutノードを持つk_work_delayableをゼロクリアして再初期化すると、カーネルはprev/nextリンクがNULLであるノードへの参照を保持したままになります。
ag->ongoing_call_workはリモートピアによってアームされます:Hands-FreeユニットがService Level Connection確立中にAT+CIND?を送信し、アプリケーションが非同期のget_ongoing_callコールバックを提供した場合、AGはCONFIG_BT_HFP_AG_GET_ONGOING_CALL_TIMEOUTミリ秒(デフォルト10000)でワークをスケジュールします。このタイマーは、アプリケーションがbt_hfp_ag_ongoing_calls()を通じてタイムリーに応答しない限り取り消されません。AT+CIND?を送信し、その後HFP RFCOMM DLCを切断して同じACLリンク上で直ちに再接続するピアは、タイムアウトが保留中の間に同じプールスロットを決定論的に再利用します。AGのRFCOMMサーバー受領パス(hfp_ag_accept())はhfp_ag_create()を直接呼び出すため、リモート側が切断と再作成の両方を駆動することになります。
その結果、カーネルのタイムアウトリストが破損します:ゼロクリアされたノードに対するsys_dlist_remove()はクロックアナウンスパスからNULLポインタ経由で書き込みを行い、再初期化されたワークのリスケジューリングにより、すでにリストによって参照されているノードがリストに挿入され、割り込みロック状態でアナウンスループが巡回するサイクルが作成されます。観測可能な影響はシステム全体のフォールトまたはハング(すなわちBluetooth電波範囲から到達可能なサービス妨害)であり、攻撃者が制御できるデータは一切書き込まれないため、これ自体ではコード実行には至りません。影響を受けるのはCONFIG_BT_HFP_AGを有効にしたビルドのみで(実験的機能としてマークされデフォルトは無効)、かつアプリケーションが非同期のget_ongoing_callコールバックを実装している場合に限られます。
VulDB is the best source for vulnerability data and more expert information about this specific topic.