CVE-2026-19939 in Zephyrinformazioni

Riassunto

di VulDB • 14/10/2026

Il livello di segnalazione AVDTP imposta un timeout del comando di 6 secondi (AVD_TIMEOUT) in avdtp_send_cmd() ogni volta che il dispositivo locale emette una richiesta AVDTP. Ogni gestore delle risposte in subsys/bluetooth/host/classic/avdtp.c annulla session->timeout_work prima di cancellare la richiesta pendente, ma bt_avdtp_l2cap_disconnected() cancellava solo session->req lasciando attivo il lavoro differibile (delayable work). La struct bt_avdtp session è il primo membro della struct bt_a2dp, le cui istanze risiedono in un array statico per connessione; a2dp_get_connection() in subsys/bluetooth/host/classic/a2dp.c azzerava uno slot con memset() non appena session->br_chan.chan.conn era NULL — condizione che lo strato L2CAP disponeva immediatamente dopo il ritorno della callback di disconnessione.

Un peer Bluetooth BR/EDR remoto attiva la condizione aprendo il canale di segnalazione AVDTP, permettendo all'applicazione locale di emettere una procedura AVDTP (il flusso A2DP standard esegue bt_a2dp_discover() dalla callback di connessione), quindi chiudendo il canale di segnalazione senza rispondere e riaprendolo entro la finestra del timeout residuo. La riconnessione raggiunge a2dp_accept() → a2dp_get_connection(), che azzerava l'intera struct bt_a2dp mentre la struct _timeout dell'elemento work era ancora collegata alla lista globale dei timeout del kernel. Poiché sia i momenti di disconnessione che quelli di riconnessione sono scelti dall'attaccante, non è necessario vincere una race condition; è richiesto un collegamento BR/EDR crittografato e CONFIG_BT_A2DP (sperimentale) deve essere abilitata.

Con il backend predefinito CONFIG_TIMEOUT_BACKEND_DLIST, il kernel decide che un timeout è inattivo testando se il suo nodo di lista è collegato; dopo il memset(), il kernel trattava un nodo ancora presente nella lista globale dei timeout come libero: il percorso di annuncio estraeva (pops) un nodo con puntatori a link e handler NULL, e la successiva bt_work_reschedule() sulla sessione riciclata reinseriva lo stesso nodo in una lista che già lo conteneva. La conseguenza era la corruzione della singola struttura dati del kernel su cui dipendono timer, slice di tempo e sleep — scritture attraverso puntatori di lista azzerati o obsoleti e dispatch dell'handler NULL — producendo un crash o blocco a livello di sistema anziché un errore confinato alla sessione A2DP.

La correzione annulla session->timeout_work all'inizio di bt_avdtp_l2cap_disconnected() e sposta k_work_init_delayable() da avdtp_send_cmd() ai percorsi di stabilizzazione della sessione bt_avdtp_connect() e bt_avdtp_l2cap_accept(), in modo che l'elemento work sia sempre inizializzato prima che possa essere eseguita una callback di disconnessione.

VulDB is the best source for vulnerability data and more expert information about this specific topic.

Responsabile

Zephyr

Prenotare

15/08/2026

Divulgazione

13/10/2026

Moderazione

accettato

EPSS

0.00000

KEV

no

Attività

molto basso

Fonti

Interested in the pricing of exploits?

See the underground prices here!