CVE-2026-19738
Beschrijving NL
De Bluetooth Link Layer Control Procedure (LLCP) -implementatie voor het maken van Connected Isochronous Stream (CIS) behoudt een RX-knooppunt (ctx- > node_ref.rx, gemarkeerd als NODE_RX_type_RETAIN), zodat deze later kan worden hergebruikt als de hostmelding — op het randapparaat in afwachting van het antwoord van de host op een LL_CIS_req, en op de centrale voor de hele duur van een lokaal geïnitieerde CIS-creëren. In subsys/bluetooth/controller/ll_sw/ull_llcp_cc.c beëindigde de "ongeldige PDU ontvangen" paden van llcp_rp_cc_rx() en llcp_lp_cc_rx() de verbinding en voltooide de procedure zonder het behouden knooppunt vrij te geven, waarbij de invariant werd verbroken die was gecontroleerd in llcp_lr_check_done() en llcp_rr_check_done() en het geheugen van het knooppunt wees werd gemaakt. Een peer-apparaat binnen radiobereik kan dit bereiken met een enkele extra LL Control PDU op een niet-geverifieerde, niet-versleutelde ACL-link. Tegen een randapparaat stuurt de aanvaller een geldige LL_CIS_req en vervolgens, voordat de host antwoordt, een niet-gerelateerde LL Control PDU (bijvoorbeeld LL_VERSION_IND), die ull_cp_rx() doorstuurt naar de actieve externe procedure. Tegen een centrale die een CIS Create uitvoert, antwoordt een kwaadaardig randapparaat met LL_UNKNOWN_RSP voor CIS_req, dat wordt verzonden naar de actieve lokale procedure. Er is geen koppeling, codering of gebruikersinteractie vereist; de code wordt gecompileerd wanneer CONFIG_BT_CTLR_PERIPHERAL_ISO of CONFIG_BT_CTLR_CENTRAL_ISO is ingeschakeld. In standaard builds (CONFIG_BT_CTLR_ASSERT_DEBUG is standaard y) wordt de assertie van het behouden knooppunt onmiddellijk geactiveerd, wat een fatale fout in de controller veroorzaakt en meestal een systeemreset vanaf één geïnjecteerde PDU. Met de ontwikkelingsbeweringen uitgeschakeld, verliest elke poging permanent één knooppunt uit de kleine LL-meldingspool van de controller (LL_PDU_RX_CNT, 2 * CONFIG_BT_CTLR_LLCP_CONN) samen met zijn memq_link_t; het herhalen van de connect-attack-reconnect cyclus put de pool uit, waarna de meldingstoewijzing altijd mislukt, de RX-stroomregeling vastloopt en de niet-uitschakelbare LL_ASSERT_ERR() in llcp_lp_cc_flush() -fouten. De impact is beperkt tot beschikbaarheid — het gelekte knooppunt is verweesd, nooit hergebruikt of dubbel vrij — en herstel vereist een herstart.
Origineel (Engels) tonen
The Bluetooth Link Layer Control Procedure (LLCP) implementation for Connected Isochronous Stream (CIS) creation retains an RX node (ctx->node_ref.rx, marked NODE_RX_TYPE_RETAIN) so it can later be reused as the host notification — on the peripheral while awaiting the Host's reply to an LL_CIS_REQ, and on the central for the whole duration of a locally initiated CIS Create. In subsys/bluetooth/controller/ll_sw/ull_llcp_cc.c, the "invalid PDU received" paths of llcp_rp_cc_rx() and llcp_lp_cc_rx() terminated the connection and completed the procedure without releasing that retained node, breaking the invariant checked in llcp_lr_check_done() and llcp_rr_check_done() and orphaning the node's memory.
A peer device within radio range can reach this with a single extra LL Control PDU on an unauthenticated, unencrypted ACL link. Against a peripheral, the attacker sends a valid LL_CIS_REQ and then, before the Host replies, any unrelated LL Control PDU (for example LL_VERSION_IND), which ull_cp_rx() routes into the active remote procedure. Against a central performing a CIS Create, a malicious peripheral answers with LL_UNKNOWN_RSP for CIS_REQ, which is dispatched into the active local procedure. No pairing, encryption or user interaction is required; the code is compiled in when CONFIG_BT_CTLR_PERIPHERAL_ISO or CONFIG_BT_CTLR_CENTRAL_ISO is enabled.
In default builds (CONFIG_BT_CTLR_ASSERT_DEBUG is default y) the retained-node assertion fires immediately, producing a controller fatal error and, typically, a system reset from one injected PDU. With the development assertions disabled, each attempt permanently loses one node from the controller's small LL notification pool (LL_PDU_RX_CNT, 2 * CONFIG_BT_CTLR_LLCP_CONN) together with its memq_link_t; repeating the connect-attack-reconnect cycle exhausts the pool, after which notification allocation always fails, RX flow control stalls, and the non-disableable LL_ASSERT_ERR() in llcp_lp_cc_flush() faults. The impact is limited to availability — the leaked node is orphaned, never reused or double-freed — and recovery requires a reboot.