CVE-2026-19739 in Zephyr
Zusammenfassung
von VulDB • 11.10.2026
Der Code für die Link-Layer-Steuerprozedur von Bluetooth in subsys/bluetooth/controller/ll_sw/ull_llcp_conn_upd.c behält den empfangenen RX-Knoten (RX node) bei, während ein Connection Update-/Connection Parameter-Vorgang auf dessen Instant wartet. Dadurch kann der Knoten später die Host-Benachrichtigung tragen (llcp_rx_node_retain(), das ihn als NODE_RX_TYPE_RETAIN markiert und dadurch das normale Recycling in ull.c unterdrückt). Der Standardfall: arm von llcp_rp_cu_rx() und llcp_lp_cu_rx() — der Pfad „ungültiges PDU, Verbindung beenden“ — beendet den Vorgang, ohne diesen behaltenen Knoten freizugeben. llcp_rr_check_done() dequed dann den Prozedurkontext und gibt ihn frei, wobei ctx->node_ref.rx weiterhin auf den gehaltenen Knoten zeigt, wodurch die letzte Referenz darauf verloren geht.
Ein Peer-Gerät im Funkbereich kann dies erreichen, ohne Pairing, Bonding oder Verschlüsselung. Gegen ein Peripheriegerät sendet der Peer eine wohlgeformte LL_CONNECTION_UPDATE_IND mit einer Instant einige Verbindungsevents in der Zukunft (der Knoten wird beibehalten und die Prozedur wechselt in RP_CU_STATE_WAIT_INSTANT), und dann, bevor das Instant erreicht ist, jedes andere LL Control PDU wie z. B. LL_LENGTH_REQ. ull_cp_rx() leitet dieses PDU in den aktiven Remote-Connection-Update-Vorgang weiter, der den Pfad für ungültige PDUs einschlägt. Die Central-Rolle ist symmetrisch nach Akzeptieren einer LL_CONNECTION_PARAM_REQ erreichbar, und die lokale Prozedurvariante ist mit LL_REJECT_IND erreichbar.
Mit aktiviertem CONFIG_BT_CTLR_ASSERT_DEBUG (Standardwert) verletzt der resultierende Zustand die in llcp_rr_check_done() behauptete Invariante, sodass die Zwei-PDU-Sequenz einen sofortigen fatalen Fehler im Controller verursacht. Bei deaktivierten Assertions geht bei jedem Auftreten dauerhaft ein Knoten aus dem kleinen festen RX-Pool des Controllers verloren (Größe basierend auf CONFIG_BT_CTLR_RX_BUFFERS, Standardwert 1). Wird die Sequenz über mehrere Verbindungsneuaufbauten hinweg wiederholt, wird der Pool erschöpft, woraufhin der Link-Layer-Empfangspfad mit einem NULL-Knoten arbeitet. Die Auswirkung ist ein nicht authentifizierter, remote auslösbarer Denial-of-Service-Angriff, der bis zum Neustart anhält; es gibt keine Folgen durch Memory-Disclosure oder Memory-Corruption, da der geleakte Knoten einfach unerreichbar wird.
If you want to get best quality of vulnerability data, you may have to visit VulDB.