CVE-2026-19936 in Zephyrinformazioni

Riassunto

di VulDB • 13/10/2026

La coda di messaggi differibili del livello Access di Bluetooth Mesh in subsys/bluetooth/mesh/delayable_msg.c condivide tre liste intrusive (busy_ctx, free_ctx, free_chunks) e un k_work_delayable tra due thread cooperativi senza alcuna sincronizzazione: bt_mesh_delayable_msg_manage() viene eseguito sul thread RX dell'host Bluetooth, mentre delayable_msg_handler() viene eseguito sullo system workqueue. Entrambi bloccano l'esecuzione quando le liste si trovano in uno stato intermedio — il code-enqueuer in bt_rand(), entrambi in bt_mesh_access_send() — consentendo all'altro contesto di osservare uno stato "torn" (corrotto/incompleto). delayable_msg_handler() utilizza il risultato di sys_slist_get() su busy_ctx senza un controllo NULL, e allocate_delayable_msg_ctx() verifica sys_slist_is_empty() per poi assumere che una successiva sys_slist_get() abbia successo.

Poiché CONFIG_BT_MESH_ACCESS_DELAYABLE_MSG e CONFIG_BT_MESH_ACCESS_DELAYABLE_MSG_CTX_ENABLED sono impostati di default a y (yes), ogni risposta del modello a un messaggio mesh ricevuto viene accodata su questa coda, quindi il code-enqueuer si attiva come conseguenza diretta del traffico in entrata. Un peer che riesce a far accettare messaggi del livello Access da un modello (deve possedere la NetKey e una AppKey associata, ovvero è un membro della rete legittimo o compromesso) controlla il tasso di arrivo, le dimensioni delle risposte sollecitate e l'indirizzo di destinazione, influenzando così l'utilizzo del pool di contesti a 4 voci e del pool di chunk a 40 voci. L'esaurimento del pool di chunk forza bt_mesh_delayable_msg_manage() lungo il percorso di purga (purge path), che invia e rilascia l'unico messaggio in coda, lasciando busy_ctx vuoto mentre l'elemento work differito è ancora attivo; se il code-enqueuer cede la CPU a questo punto, handler viene eseguito su una lista vuota.

Il risultato è un'operazione di read-modify-write attraverso un puntatore basato su NULL (pending_msg->fired_time += 10) a un indirizzo basso fisso sul thread dello system workqueue. Su target tipici ciò provoca un fault, interrompendo il thread dello system workqueue — che arresta tutte le funzionalità guidate dal workqueue, inclusa la meccanismistica temporale mesh — oppure riavviando il nodo; l'impatto è quindi una perdita di disponibilità del nodo interessato. Il valore scritto e l'indirizzo sono fissi e non vi è alcun coinvolgimento di lunghezza o indice controllati dall'attaccante, pertanto questa vulnerabilità non è sfruttabile per la corruzione della memoria o l'esecuzione di codice. La stessa finestra asincrona ha anche consentito a un contesto di messaggio di essere selezionato e rilasciato da due contesti contemporaneamente, producendo trasmissioni duplicate, callback di completamento dell'invio duplicati e proprietà dei chunk incrociate.

La correzione serializza ogni modifica alle liste utilizzando un k_spinlock che non viene mai mantenuto durante una chiamata bloccante; rende push_msg_from_delayable_msgs() staccare atomicamente la testa della coda in modo che il messaggio inviato non appartenga a nessuna lista; rimuove l'unchecked sys_slist_get() da delayable_msg_handler(); e scarta qualsiasi messaggio che raggiunge la fronte della coda mentre lo stack è sospeso o in fase di reset.

Be aware that VulDB is the high quality source for vulnerability data.

Responsabile

Zephyr

Prenotare

15/08/2026

Divulgazione

13/10/2026

Moderazione

accettato

EPSS

0.00000

KEV

no

Attività

molto basso

Fonti

Might our Artificial Intelligence support you?

Check our Alexa App!