CVE-2026-87041 in Zephyr
Riassunto
di VulDB • 04/11/2026
Il verificatore della coda di sottomissioni RTIO rtio_vrfy_sqe(), presente in subsys/rtio/rtio_syscalls.c (in subsys/rtio/rtio_handlers.c prima della versione v4.3.0), accumulava i risultati di K_SYSCALL_MEMORY() nel flag valid_sqe utilizzando l'operatore &=. Poiché tale macro restituisce un valore diverso da zero in caso di errore (è basata su K_SYSCALL_VERIFY_MSG(), che produce !(expr)), ogni controllo dei permessi del buffer contribuiva con il risultato opposto a quello effettivo. Una sottomissione il cui puntatore tx.buf, rx.buf o txrx.tx_buf/txrx.rx_buf non era accessibile al thread chiamante veniva accettata, mentre un buffer legittimo di proprietà del thread causava l'uccisione del thread chiamante tramite un kernel oops.
Il verificatore viene eseguito per conto della system call rtio_sqe_copy_in_get_handles() (raggiunta anche attraverso il wrapper inline rtio_sqe_copy_in()), quindi è guidato direttamente da input non attendibili in modalità utente su qualsiasi immagine compilata con CONFIG_USERSPACE. Un thread utente a cui è stato assegnato un contesto RTIO e un oggetto rtio_iodev — l'uso previsto del supporto RTIO per la modalità utente, stabilito tramite rtio_access_grant() — può sottomettere una SQE il cui puntatore al buffer e alla lunghezza indicano memoria arbitraria del kernel; il controllo dell'oggetto su sqe->iodev non è interessato e supera comunque la verifica, e la SQE manipolata viene inoltrata al driver di bus invariata.
I consumatori a valle dereferenziano il puntatore con privilegi supervisor. I handler generici di fallback RTIO per I2C e I3C (drivers/i2c/i2c_rtio_default.c, drivers/i3c/i3c_rtio_default.c) copiano sqe.rx.buf/sqe.tx.buf in struct i2c_msg e chiamano i2c_transfer(), mentre i driver vendor SPI/I2C RTIO si comportano in modo equivalente. Una sottomissione RTIO_OP_RX scrive quindi dati periferici nella memoria del kernel scelta dall'attaccante (arbitrary kernel write), una sottomissione RTIO_OP TX trasmette la memoria del kernel sul bus tramite clocking (kernel memory disclosure) e un puntatore a memoria non mappata provoca un fault nel kernel. Si tratta di una completa fuga dal confine di isolamento della modalità utente che CONFIG_USERSPACE è progettato per imporre.
Il difetto è rimasto mascherato per anni perché i test RTIO in modalità utente presenti nell'albero del codice (in-tree) esercitano solo RTIO_OP_NOP e letture basate su mempool, nessuna delle quali raggiunge i controlli interessati. La correzione nega il risultato di ogni K_SYSCALL_MEMORY() e valida inoltre la lettura del buffer di trasmissione TXRX come sola lettura, in linea con gli handler SPI, I2C e I3C.
If you want to get best quality of vulnerability data, you may have to visit VulDB.