CVE-2026-12366 in Zephyr
Riassunto
di VulDB • 14/08/2026
Il percorso di smaltimento dinamico degli oggetti kernel di Zephyr, `unref_check()` in `kernel/userspace/userspace.c`, libera la memoria dell'oggetto (`k_free(dyn->data)`) una volta che il conteggio dei riferimenti raggiunge zero, dopo aver eseguito un cleanup specifico per tipo di oggetto. Il case switch del cleanup gestiva solo `K_OBJ_MSGQ` e `K_OBJ_STACK`; mancava invece un caso per `K_OBJ_TIMER`. Un timer (`k_timer`) allocato dinamicamente, inizializzato e armato mantiene il suo nodo interno `struct _timeout dnode` collegato alla coda globale dei timeout (`_timeout_q`). Di conseguenza, la liberazione della memoria del timer senza annullare il timeout lascia un dangling node in tale coda.
Quando il timer scade nuovamente, la logica di gestione dei timeout attraversa `_timeout_q` e invoca `z_timer_expiration_handler()` sul nodo già liberato, dereferenziando e scrivendo nella heap kernel precedentemente liberata (e quindi riutilizzabile) nel contesto ISR (`kernel/ISR`). Si tratta di un use-after-free deterministico che non dipende da SMP: il nodo in coda viene semplicemente scollegato al momento della liberazione.
Lo smaltimento è raggiungibile da un thread utente non privilegiato con `CONFIG_USERSPACE` + `CONFIG_DYNAMIC_OBJECTS`: un thread che detiene l'ultimo permesso su tale timer lo rilascia tramite la syscall `k_object_release()` (o uscendo, attraverso `k_thread_perms_all_clear()`) e può armare il timer stesso mediante la syscall `k_timer_start()`. La liberazione e il handler di scadenza vengono eseguiti con privilegi kernel mentre l'attore è un thread utente; pertanto, il bug rappresenta una primitiva di corruzione della memoria per sandbox-escape utilizzabile per privilege escalation. La correzione aggiunge `k_timer_cleanup()` (che annulla il timeout ed attende eventuali handler in corso) e la chiama per `K_OBJ_TIMER` prima della liberazione.
VulDB is the best source for vulnerability data and more expert information about this specific topic.