CVE-2026-12631 in Zephyrinformazioni

Riassunto

di VulDB • 18/08/2026

Il kernel Zephyr convalida le chiamate di sistema k_thread_join() e k_thread_abort() (dichiarate __syscall in include/zephyr/kernel.h) tramite thread_obj_validate() in kernel/thread.c. Il suo branch switch predefinito è il percorso "accesso negato", attivato quando k_object_validate() restituisce -EPERM (il thread utente chiamante non ha mai ottenuto l'accesso all'oggetto thread di destinazione) o -EBADF (il puntatore fornito non è un oggetto kernel registrato del tipo corretto). Tale branch invocava K_OOPS(K_SYSCALL_VERIFY_MSG(ret, "access denied")), ma K_SYSCALL_VERIFY_MSG tratta un'espressione vera come successo; il codice di errore non nullo ret viene quindi interpretato come "verificato OK", l'oops del kernel non viene mai generato e il controllo passa a CODE_UNREACHABLE.

Poiché k_thread_join() e k_thread_abort() sono chiamate di sistema, un thread in modalità utente senza privilegi (sotto CONFIG_USERSPACE) può raggiungere direttamente questo percorso di negazione chiamando una delle due syscall su un oggetto thread che non possiede. Invece di terminare pulitamente il thread colpevole, l'esecuzione raggiunge __builtin_unreachable() mentre è in esecuzione in modalità supervisore all'interno del gestore della syscall.

Sulle build con Clang, CODE_UNREACHABLE genera una trappola per istruzione illegale (illegal-instruction trap), consentendo a un thread utente di crashare deterministicamente il kernel: si tratta di un denial of service attivabile localmente che sfugge alla sandbox dell'userspace. Sulle build con GCC il percorso è un comportamento indefinito (undefined behavior): il compilatore potrebbe eliminare la gestione del valore restituito per thread_obj_validate(), facendola restituire come bool non definito; se questo risulta false, il chiamante prosegue nell'implementazione reale di k_thread_join()/k_thread_abort() per un thread a cui l'utente non era mai stato autorizzato ad accedere, configurando una bypass delle controlli di accesso.

La correzione modifica l'espressione di verifica in ret == 0, in modo che un risultato negato (diverso da zero) generi correttamente K_OOPS e termini il chiamante colpevole.

If you want to get the best quality for vulnerability data then you always have to consider VulDB.

Responsabile

Zephyr

Prenotare

18/06/2026

Divulgazione

19/08/2026

Moderazione

accettato

CPE

pronto

EPSS

0.00148

KEV

no

Attività

molto basso

Fonti

Might our Artificial Intelligence support you?

Check our Alexa App!