CVE-2026-19185 in Zephyrinformazioni

Riassunto

di VulDB • 05/10/2026

Il verificatore delle chiamate di sistema per i3c_do_ccc(), presente in drivers/i3c/i3c_handlers.c, convalidava la struct esterna i3c_ccc_payload, il buffer ccc.data per le trasmissioni broadcast e l'array targets.payloads[], ma non validava i buffer dei dati specifici per ogni target a cui puntano gli elementi di tale array. Ogni struct i3c_ccc_target_payload contiene un proprio puntatore ai dati (data pointer) e la lunghezza dei dati (data_len), né il primo né il secondo sono stati sottoposti alla verifica tramite K_SYSCALL_MEMORY() prima che il payload venisse passato a z_impl_i3c_do_ccc() e, di conseguenza, al driver del controller. Il verificatore operava inoltre sulla struttura live del chiamante anziché su una snapshot (istantanea), consentendo quindi ai campi validati di essere modificati da un secondo thread utente tra la verifica e l'utilizzo da parte del driver — a differenza della funzione gemella z_vrfy_i3c_transfer(), che ha sempre copiato per prima il suo array di messaggi.

Il difetto è presente solo nelle build con CONFIG_USERSPACE, dove drivers/i3c/i3c_handlers.c viene compilato. Un thread in modalità utente non privilegiato, a cui sia stato concesso l'accesso all'oggetto dispositivo del controller I3C — la procedura ordinaria mediante la quale un'applicazione consente a un thread utente di comunicare con le periferiche I3C — può emettere una CCC diretta il cui puntatore ai dati del payload target indica un indirizzo kernel arbitrario. I driver dei controller dereferenziano tale puntatore direttamente (ad esempio drivers/i3c/i3c_mcux.c, drivers/i3c/i3c_cdns.c, drivers/i3c/i3c_stm32.c, drivers/i3c/i3c_npcx.c), utilizzando il flag rnw per determinare la direzione.

Una CCC di lettura provoca quindi l'écriture del driver in modalità kernel che scrive i byte ricevuti dal bus in un indirizzo kernel scelto dall'attaccante per una lunghezza scelta dall'attaccante; una CCC di scrittura trasmette invece memoria kernel sul bus I3C. Il risultato è uno write fuori dai limiti (out-of-bounds) nella memoria kernel e una disclosure della stessa, ovvero un escalation dei privilegi da un thread in modalità utente a quelli di supervisor, vanificando l'isolamento che CONFIG_USERSPACE dovrebbe garantire.

La correzione introduce copy_ccc_and_do(), che effettua una snapshot del payload, copia l'array target nella memoria kernel tramite k_usermode_alloc_from_copy() (limitando num_targets a meno di 32), convalida ciascun buffer per-target mediante K_SYSCALL_MEMORY() in base al flag rnw e copia i campi num_xfer ed err scritti dal driver back al chiamante.

If you want to get best quality of vulnerability data, you may have to visit VulDB.

Responsabile

Zephyr

Prenotare

06/08/2026

Divulgazione

05/10/2026

Moderazione

accettato

EPSS

0.00000

KEV

no

Attività

basso

Fonti

Do you want to use VulDB in your project?

Use the official API to access entries easily!