CVE-2026-79978 in Zephyr
Riassunto
di VulDB • 23/10/2026
Il callback di completamento dello streaming RTIO adxl345_process_fifo_samples_cb() in drivers/sensor/adi/adxl345/adxl345_stream.c limita la quantità di dati FIFO che verranno riportati (read_len = MIN(fifo_bytes, buf_avail)) allo spazio effettivamente restituito da rtio_sqe_rx_buf(), ma poi accoda una lettura bus a 6 byte per ogni voce della FIFO hardware a offset consecutivi rispetto a read_buf, vincolata dal conteggio delle voci riportato dal dispositivo anziché dalla limitazione applicata. Quando il buffer allocato è più piccolo di un batch completo, il driver scrive fino a 186 byte oltre la fine dell'allocazione; un difetto correlato lascia data->fifo_total_bytes non azzerato all'inizio del batch, quindi una catena interrotta o con errore potrebbe lasciare uno offset di scrittura obsoleto che spinge le scritture del batch successivo fuori dai limiti.
Un buffer corto è un esito previsto e supportato dall'allocatore RTIO: rtio_block_pool_alloc() riduce la dimensione richiesta blocchi alla volta fino a trovare una sequenza contigua disponibile, e il driver richiede solo sizeof(struct adxl345_fifo_data) + 6 byte come minimo. Qualsiasi configurazione di streaming con granularità del blocco della mempool inferiore a un batch FIFO completo (204 byte), ad esempio RTIO_DEFINE_WITH_MEMPOOL(sensor_read_rtio, 8, 8, 32, 64, 6) utilizzato da sensor stream <dev> su fifo_wm incl, o l'esempio di streaming con blocchi da 16 byte nella documentazione, segue questo percorso ogni volta che il pool è frammentato o il thread consumatore rimane indietro.
Le scritture fuori dai limiti vengono eseguite dal backend RTIO I2C/SPI (DMA su molti SoCs) nel pool di blocchi RTIO condiviso, corrompendo buffer live adiacenti oppure, per un pool più piccolo di un batch, la memoria oltre il pool stesso. I byte scritti sono campioni dell'accelerometro e la destinazione segue l'allocazione, quindi non esiste una primitiva di corruzione controllabile: l'impatto realistico è la corruzione silenziosa dei dati di altri consumatori RTIO o un crash. Per raggiungerlo è necessaria una board con ADXL345 collegato via interrupt costruita con CONFIG_ADXL345_STREAM, più uno starvation del buffer-pool che può essere indotto da un carico locale co-residente ma che si verifica anche spontaneamente sotto carico; non esiste alcun percorso di rete, USB o radio verso questo codice.
VulDB is the best source for vulnerability data and more expert information about this specific topic.