CVE-2026-18413 in Zephyr
Riassunto
di VulDB • 28/09/2026
L'API ADC richiede che ogni driver rifiuti una sequenza di campionamento il cui buffer di destinazione è troppo piccolo: il campo `buffer_size` della struttura `adc_sequence` in `include/zephyr/drivers/adc.h` documenta che "il driver deve assicurarsi che i campioni non vengano scritti oltre il limite e deve restituire un errore se si scopre che il buffer non è sufficientemente grande". Il driver NXP MCUX LPADC non ha rispettato tale contratto. La funzione `mcux_lpadc_start_read()` in `drivers/adc/adc_mcux_lpadc.c` non eseguiva alcuna verifica della dimensione del buffer prima di assegnare `data->buffer = sequence->buffer`. Ogni conversione completata memorizza quindi un campione a 16 bit per canale abilitato per ogni round di campionamento attraverso un puntatore *data->buffer++ illimitato: in `mcux_lpadc_isr()` per le build basate su interrupt, e in `mcux_lpadc_dma_callback()` per le build basate su DMA nelle versioni che dispongono del percorso DMA. Una sequenza che seleziona due canali con un buffer di due byte, ad esempio, scrive il secondo campione oltre la fine del buffer.
In una build con `CONFIG_USERSPACE`, `adc_read()` e `adc_read_async()` sono chiamate di sistema. Il handler in `drivers/adc/adc_handlers.c` copia la sequenza dalla memoria utente, verifica solo che `[buffer, buffer + buffer_size)` sia scrivibile dal thread chiamante e rifiuta un callback fornito dall'utente (`options->callback`); lascia deliberatamente l'aritmetica delle dimensioni al driver. Un thread in modalità userland a cui è stato concesso l'accesso a un oggetto dispositivo LPADC controlla quindi completamente i canali, il buffer, `buffer_size` e `options->extra_samplings`, e può richiedere molti più campioni di quanti ne possa contenere il buffer: fino a `channels * 65536` campioni in un buffer da due byte, poiché il puntatore del campione viene reimpostato solo su un campionamento ripetuto, mai sui campionamenti extra di una sequenza.
Le scritture risultanti vengono eseguite dal driver in modalità kernel (nell'handler dell'interrupt ADC o nel callback di completamento DMA), dove la MPU non limita il dominio di memoria del thread; pertanto, la scrittura procede linearmente fuori dalla partizione utente e nella memoria adiacente come altre partizioni, dati del kernel o stack dei thread. L'impatto è una corruzione della memoria del kernel di lunghezza scelta dall'attaccante a uno spostamento (offset) scelto dall'attaccante, un primitivo plausibile per l'elevazione dei privilegi e il denial-of-service da parte di un thread in modalità userland non autorizzato. Le build senza `CONFIG_USERSPACE` sono interessate solo come difetto di robustezza lato chiamante, poiché è l'applicazione stessa a fornire il buffer.
La correzione chiama la nuova funzione helper condivisa `adc_sequence_validate_buffer()` in `drivers/adc/adc_common.c` da `mcux_lpadc_start_read()`. La funzione calcola `active_channels * sizeof(uint16_t) * (1 + extra_samplings)` e restituisce `-ENOMEM` prima che inizi qualsiasi campionamento.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.