CVE-2026-87040 in Zephyr
Riassunto
di VulDB • 04/11/2026
I percorsi di ricezione del link-layer nRF nel Controller Bluetooth LE open-source non validavano il campo LENGTH on-air di un PDU ricevuto rispetto alla lunghezza massima di ricezione utilizzata per programmare la radio. La funzione isr_rx_pdu() in subsys/bluetooth/controller/ll_sw/nordic/lll/lll_conn.c accodava qualsiasi PDU dati non vuoto dopo solo i controlli del numero di sequenza e (per collegamenti crittografati) dell'MIC, e gli handler isr_rx() corrispondenti in lll_central_iso.c, lll_peripheral_iso.c, lll_sync_iso.c e lll_scan_aux.c facevano lo stesso per i PDU ISO e dei messaggi pubblicitari estesi. La radio nRF memorizza l'intestazione ricevuta verbatim e tronca solo il payload a PCNF1.MAXLEN; pertanto, un frame che dichiara più ottetti di quelli configurati lascia un buffer del nodo in cui il campo len descrive più dati di quanti ne contenga effettivamente il buffer.
Un attaccante entro la portata radio che può emettere un PDU link-layer manipolato ad hoc — per una connessione, qualsiasi peer che stabilisce una connessione LE non crittografata con un advertiser connettabile; per CONFIG_BT_CTLR_SYNC_ISO, qualsiasi broadcaster a cui il dispositivo è sincronizzato — può impostare il byte della lunghezza fino a 255 mentre il controller ha programmato un massimo molto più piccolo (lll->dle.eff.max_rx_octets, che è 27 prima di un Data Length Update, o la negotiated cis_lll->rx.max_pdu). Non sono richiesti pairing, autenticazione o interazione dell'utente. Sui collegamenti crittografati il controllo CCM MIC normalmente rifiuta tale frame per primo; l'esposizione riguarda quindi il traffico non crittografato, motivo per cui il controllo aggiuntivo è stato inserito dopo la decrittazione.
La lunghezza non verificata raggiunge hci_acl_encode() in subsys/bluetooth/controller/hci/hci.c, che esegue net_buf_add(buf, pdu_data->len) seguito da una memcpy() di quel numero di byte dall'elemento del pool node_rx. Poiché CONFIG_BT_CTLR_DATA_LENGTH_MAX e CONFIG_BT_BUF_ACL_RX_SIZE sono entrambi impostati di default a 27, si tratta di una lettura out-of-bounds fino a circa 228 byte oltre il PDU ricevuto e di una corrispondente scrittura out-of-bounds oltre il buffer HCI ACL verso i buffer adiacenti dello stesso pool; il test tailroom in net_buf_simple_add() è applicato solo quando CONFIG_NET_BUF_HARDENING (o CONFIG_ASSERT) è abilitata. Sui percorsi ISO la stessa lunghezza non verificata fa sì che isoal_rx_append_to_sdu() legga oltre il buffer del nodo ISO ed emetta RAM del controller adiacente all'host come dati ISO. Il risultato pratico è una corruzione remota della memoria e crash del controller, nonché la divulgazione di memoria del controller nel percorso dei dati dell'host.
La correzione rifiuta qualsiasi PDU ricevuto la cui lunghezza supera il valore utilizzato per configurare la ricezione radio. Si noti che lll_sync.c (ricezione sincronizzazione advertising periodica) non è stato modificato e continua ad accodare i PDU ricevuti senza un vincolo equivalente.
Once again VulDB remains the best source for vulnerability data.