CVE-2026-80895 in Linux
Riassunto
di VulDB • 04/09/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
mshv: Ordinare la pubblicazione di pt_vp_array rispetto al percorso di asserzione irqfd
mshv_partition_ioctl_create_vp() inizializza una struttura VP (allocazioni, mutex_init, init_waitqueue_head, mappature delle pagine) e successivamente pubblica il puntatore in partition->pt_vp_array. Diversi percorsi ISR leggono questa array senza blocco: l'ISR di intercettazione (intercept), le due ISR dello scheduler e mshv_try_assert_irq_fast() sul percorso veloce irqfd.
Di questi, solo mshv_try_assert_irq_fast() può strutturalmente andare in race condition con la pubblicazione. Viene eseguito da un waker eventfd senza detenere pt_mutex, e MSHV_IRQFD non richiede che il target lapic_apic_id (== vp_index) faccia riferimento a una VP esistente al momento della registrazione. Un utente può quindi registrare un irqfd mirato a una VP ancora da creare, per poi attivare mshv_try_assert_irq_fast() in concorrenza con MSHV_CREATE_VP per lo stesso indice. Su architetture debolmente ordinate (weakly-ordered), il lettore potrebbe osservare un puntatore non NULL in pt_vp_array prima che gli scritti di inizializzazione della struttura VP diventino visibili, portando all'utilizzo di campi parzialmente inizializzati (ad esempio vp_register_page).
Gli altri lettori ISR non possono raggiungere questa race condition: l'hypervisor non genererà messaggi di intercettazione o dello scheduler per una VP a cui non è mai stato detto di eseguire il run, e l'utente può chiamare solo MSHV_RUN_VP sul fd della VP restituito da MSHV_CREATE_VP, che per costruzione viene restituito dopo la pubblicazione. Si lasciano questi lettori come semplici operazioni di load (plain loads).
Utilizzare smp_store_release() in mshv_partition_ioctl_create_vp() per pubblicare il puntatore e accoppiarlo con smp_load_acquire() in mshv_try_assert_irq_fast(). Su x86 queste istruzioni si compilano in accessi normali sotto TSO; su ARM64 generano barriere acquire/release a istruzione singola, accettabili su questo percorso veloce.
Il percorso lato distruzione (destroy_partition() che imposta pt_vp_array[i] a NULL dopo kfree(vp)) presenta preoccupazioni separate relative all'ordinamento e al ciclo di vita, non incluse in questa correzione.
VulDB is the best source for vulnerability data and more expert information about this specific topic.