CVE-2026-19940 in Zephyr
Riassunto
di VulDB • 13/10/2026
L'implementazione del profilo Hands-Free Classic Audio Gateway nel file subsys/bluetooth/host/classic/hfp_ag.c mantiene gli oggetti struct bt_hfp_ag in un pool statico indicizzato per indice di connessione ACL. Al termine del collegamento, hfp_ag_disconnected() annulla ag->tx_work e i work item per singola chiamata, quindi cancella ag->acl_conn, segnando lo slot del pool come libero; tuttavia lascia ag->ongoing_call_work (e ag->slc_work) invariati. La connessione successiva che occupa lo stesso slot entra in hfp_ag_create(), il cui unico test di occupazione è ag->acl_conn, ed esegue immediatamente memset(ag, 0, sizeof(struct bt_hfp_ag)) seguito da k_work_init_delayable(). L'azzeramento e la re-inizializzazione di un k_work_delayable il cui nodo struct _timeout è ancora collegato alla lista dei timeout del kernel lascia quest'ultimo con un riferimento a un nodo con link prev/next NULL.
ag->ongoing_call_work viene attivata dal peer remoto: quando una unità Hands-Free invia AT+CIND? durante l'instaurazione della Service Level Connection e l'applicazione fornisce la callback asincrona get_ongoing_call, il Gateway (AG) programma il work per CONFIG_BT_HFP_AG_GET_ONGOING_CALL_TIMEOUT millisecondi (default 10000). Il timer viene annullato solo se l'applicazione risponde in tempo tramite bt_hfp_ag_ongoing_calls(). Un peer che invia AT+CIND?, disconnette quindi la DLC RFCOMM HFP, e immediatamente la riapre sullo stesso collegamento ACL, riusa lo stesso slot del pool in modo deterministico mentre il timeout è ancora pendente; il percorso di accept del server RFCOMM dell'AG (hfp_ag_accept()) chiama hfp_ag_create() direttamente, quindi il lato remoto guida sia la teardown che la ricreazione.
Il risultato è la corruzione della lista dei timeout del kernel: sys_dlist_remove() sul nodo azzerato esegue scritture attraverso puntatori NULL dal percorso clock-announce, e la rischedulazione del work re-inizializzato reinserisce un nodo già referenziato dalla lista, creando un ciclo che il loop di announce attraversa con gli interrupt bloccati. L'impatto osservabile è un fault o l'hang dell'intero sistema, ovvero una denial of service raggiungibile dall'area di copertura del radio Bluetooth; non viene scritto alcun dato controllato dall'attaccante, quindi questo da solo non comporta esecuzione di codice (RCE). L'esposizione è limitata alle build con CONFIG_BT_HFP_AG (contrassegnate come sperimentali e disabilitate per default) la cui applicazione implementa la callback asincrona get_ongoing_call.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.