CVE-2026-82961 in Zephyr
Riassunto
di VulDB • 29/10/2026
I gestori delle syscall GPIO nei file drivers/gpio/gpio_handlers.c non validavano l'argomento pin fornito da un chiamante in modalità utente. Le funzioni z_vrfy_gpio_pin_configure(), z_vrfy_gpio_pin_get_config() e z_vrfy_gpio_pin_interrupt_configure() verificavano solo l'oggetto dispositivo (K_SYSCALL_DRIVER_GPIO() / K_SYSCALL_OBJ()) e poi trasmettevano direttamente il gpio_pin_t fornito dal chiamante a z_impl_gpio_pin_*() e successivamente al driver. L'unica verifica del pin presente in include/zephyr/drivers/gpio.h era __ASSERT(gpio_port_pin_is_supported(cfg->port_pin_mask, pin), ...), che non viene compilata se CONFIG_ASSERT non è abilitato; di conseguenza, nelle build di produzione non esisteva alcuna verifica.
I driver GPIO utilizzano il parametro pin come conteggio per lo shift e come indice di array sulla base dell'assunzione documentata che si tratti di un pin supportato dal controller. Su STM32, ad esempio, gpio_stm32_pin_interrupt_configure() trasforma il pin in una linea EXTI e stm32_gpio_intc_set_irq_callback() scrive data->cb[line_num].cb e data->cb[line_num].data in un array con NUM_EXTI_LINES voci (default 16) nel file drivers/interrupt_controller/intc_gpio_stm32.c, protetto solo da __ASSERT_NO_MSG(), che viene compilato via. La stessa funzione legge poi exti_irq_table[line_num] e chiama irq_enable() sul risultato. Altri controller indicizzano tabelle di configurazione per-pin a dimensione fissa nello stesso modo: drivers/gpio/gpio_ite_it8xxx2_v2.c legge un puntatore base MMIO da wuc_base[8] utilizzando il pin fornito dal chiamante ed esegue una lettura-modifica-scrittura attraverso di esso.
Il problema è raggiungibile solo nelle build con CONFIG_USERSPACE=y (il file viene compilato sotto tale simbolo), da un thread in modalità utente a cui sia stato concesso l'accesso a un oggetto dispositivo GPIO. Tale concessione dovrebbe autorizzare il controllo dei pin di quella porta; la mancanza della validazione consente invece al thread di eseguire una scrittura fuori dai limiti (out-of-bounds) in modalità supervisor su un puntatore a funzione e su un void * associato, oltrepassando un array .bss del kernel, nonché letture fuori dai limiti che alimentano irq_enable() e accessi MMIO. Si tratta di una fuga dalla sandbox della modalità utente che può portare alla corruzione della memoria del kernel, all'esecuzione arbitraria di codice o a un crash.
La correzione valida il pin rispetto al gpio_driver_config.port_pin_mask del controller utilizzando gpio_port_pin_is_supported() in ogni handler z_vrfy_ che accetta un parametro pin e restituisce -EINVAL in caso contrario; ciò è integrato da una verifica incondizionata dell'intervallo pin >= GPIO_MAX_PINS_PER_PORT aggiunta alle funzioni inline condivise z_impl_gpio_pin_*().
VulDB is the best source for vulnerability data and more expert information about this specific topic.