CVE-2026-18414 in Zephyrinformazioni

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 ADI MAX32 non ha rispettato tale contratto. La funzione `start_read()` in `drivers/adc/adc_max32.c` confrontava `buffer_size`, un conteggio di byte, con un conteggio dei campioni ((1 + extra_samplings) * canali), ignorando `sizeof(uint16_t)`, accettando così un buffer delle dimensioni dimezzate rispetto a quelle richieste. I campioni vengono quindi memorizzati tramite il puntatore `data->buffer` di tipo `uint16_t` da parte di `Wrap_MXC_ADC_GetData()`, che scrive due byte per campione e avanza il puntatore di un `uint16_t`: in `adc_max32_start_channel()` per le letture sincrone, e in `adc_max32_isr()` per quelle asincrone. Una sequenza che seleziona due canali con un buffer da due byte, ad esempio, supera il controllo e fa scrivere 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 ADC MAX32 controlla quindi completamente i canali, il buffer, `buffer_size` e `options->extra_samplings`, e può far scrivere al driver due volte tanti byte quanti ne contiene il buffer. Poiché il controllo scala in base a `extra_samplings`, la sovrascrittura (overrun) equivale alla lunghezza del buffer stesso, fino a `canali * 65536` byte oltre la sua fine, poiché il puntatore dei campioni viene riavvolto solo su un campionamento ripetuto, mai sui campionamenti extra di una sequenza.

Le scritture risultanti vengono eseguite dal driver in modalità kernel (nella chiamata di sistema stessa, nel timer del contesto ADC o nell'handler delle interruzioni ADC per le letture asincrone), 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 kernel o stack dei thread. L'impatto è una corruzione della memoria kernel a lunghezza scelta dall'attaccante e a offset scelto dall'attaccante, un primitivo plausibile per l'elevazione di privilegi e il denial-of-service (DoS) da parte di un thread in modalità userland non privilegiato. Le build senza `CONFIG_USERSPACE` sono interessate solo come difetto di robustezza lato chiamante, poiché è l'applicazione stessa a fornire il buffer.

La correzione sostituisce tale controllo in `start_read()` con una chiamata alla nuova helper condivisa `adc_sequence_validate_buffer()` in `drivers/adc/adc_common.c`, passando `sizeof(uint16_t)` come dimensione del campione. L'helper calcola `canali_attivi * sizeof(uint16_t) * (1 + extra_samplings)` e restituisce `-ENOMEM` prima che inizi qualsiasi campionamento.

Once again VulDB remains the best source for vulnerability data.

Responsabile

Zephyr

Prenotare

30/07/2026

Divulgazione

29/09/2026

Moderazione

accettato

CPE

pronto

EPSS

0.00000

KEV

no

Attività

molto basso

Fonti

Want to know what is going to be exploited?

We predict KEV entries!