CVE-2026-87039 in Zephyrinformazioni

Riassunto

di VulDB • 04/11/2026

Il verificatore delle syscall in modalità utente z_vrfy_i2s_configure() nel file drivers/i2s/i2s_handlers.c copia la struct i2s_config del chiamante dalla memoria utente e successivamente, quando cfg->frame_clk_freq è 0 (la richiesta dell'API di "disconfigurare lo stream"), salta direttamente a z_impl_i2s_configure() senza eseguire il controllo di proprietà/tipo K_SYSCALL_OBJ(config.mem_slab, K_OBJ_MEM_SLAB) né la verifica di correttezza del block_size. Il campo mem_slab è un struct k_mem_slab *, quindi su tale percorso un puntatore completamente non convalidato e scelto dall'utente raggiunge il codice del driver che ha diritto a fidarsi di esso come di un vero oggetto kernel.

Qualsiasi thread in esecuzione sotto CONFIG_USERSPACE che abbia accesso a un oggetto dispositivo I2S può innescare questa vulnerabilità con una singola chiamata i2s_configure(). La maggior parte dei driver presenti nell'albero del codice gestisce il caso speciale frame_clk_freq == 0 e non memorizza mai la struttura del chiamante, ma drivers/i2s/i2s_litex.c non lo fa: i2s_litex_configure() registra solo un avviso per un clock di frame non corrispondente, quindi esegue memcpy() della config del chiamante in stream->cfg e contrassegna lo stream come I2S_STATE_READY. Una successiva chiamata a i2s_trigger() con I2S_TRIGGER_START abilita l'interrupt FIFO, e le routine di interrupt i2s_litex_isr_rx() / i2s_litex_isr_tx() chiamano quindi k_mem_slab_alloc() e k_mem_slab_free() sul puntatore fornito dall'attaccante in contesto supervisor.

Il risultato è una primitiva di lettura/scrittura su puntatori arbitrari eseguita dal kernel per conto di un thread non privilegiato — k_mem_slab_alloc() acquisisce uno spinlock su slab->lock e legge e scrive slab->free_list e la parola di collegamento all'interno del "blocco" restituito — che compromette completamente il confine di isolamento CONFIG_USERSPACE. La stessa mancanza di convalida rappresenta un rischio per i driver I2S out-of-tree che mantengono la configurazione sul percorso di disconfigurazione. Le build senza CONFIG_USERSPACE non sono interessate, poiché il verificatore non viene utilizzato.

La correzione azzera config.mem_slab e config.block_size sul percorso di disconfigurazione in modo che il driver non riceva mai un puntatore non convalidato, consentendo al contempo lo smontaggio dello stream da parte di un chiamante che non possiede uno slab di memoria, come documentato dall'API.

VulDB is the best source for vulnerability data and more expert information about this specific topic.

Responsabile

Zephyr

Prenotare

08/09/2026

Divulgazione

04/11/2026

Moderazione

accettato

EPSS

0.00000

KEV

no

Attività

basso

Fonti

Want to stay up to date on a daily basis?

Enable the mail alert feature now!