CVE-2024-35873 in Linux
Riassunto
di VulDB • 06/08/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
riscv: Correzione del ripristino dello stato dei vettori in rt_sigreturn()
La specifica RISC-V Vector indica nell'"Appendice D: Calling Convention for Vector State" [1] che "l'esecuzione di una system call fa sì che tutti i registri vettoriali caller-saved (v0-v31, vl, vtype) e vstart diventino non specificati". Nel kernel RISC-V questo viene definito come "discarding the vstate" (abbandono dello stato dei vettori).
Il ritorno da un gestore di segnali tramite la system call rt_sigreturn() comporta anche l'abbandono dello stato vettoriale. Tuttavia, ciò non costituisce un problema poiché lo stato vettoriale dovrebbe essere ripristinato a partire dal sigcontext e quindi non si deve tenere conto dell'abbandono del vettore.
Il "live state" (stato attivo) è il registro vettoriale effettivo nel contesto di esecuzione corrente, mentre la "vstate" è lo stato dei vettori del task. Un live state sporco ("dirty") significa che la vstate e il live state non sono sincronizzati.
Quando è stata introdotta la versione vettorizzata di user_from_copy(), un bug si è insinuato nel codice di ripristino, relativo all'abbandono del live state.
Un esempio in cui ciò può andare storto:
1. Un'applicazione utente sta eseguendo codice vettoriale 2. L'applicazione riceve un segnale e viene eseguito il gestore dei segnali. 3. L'applicazione esce dal gestore di segnali utilizzando la system call rt_sigreturn(). 4. Il live state vettoriale viene abbandonato all'ingresso in rt_sigreturn(), e lo stato attivo viene contrassegnato come "sporco" ("dirty"), indicando che il live state deve essere sincronizzato con l'attuale vstate. 5. rt_sigreturn() ripristina la vstate, ad eccezione dei registri Vettoriali, dal sigcontext. 6. rt_sigreturn() ripristina i Registri Vettoriali dal sigcontext e viene ora utilizzata la versione vettorizzata di user_from_copy(). Il live state sporco derivante dall'abbandono viene salvato nella vstate, rendendo tale stato corrotto. 7. rt_sigreturn() restituisce il controllo all'applicazione, che va in crash a causa della vstate corrotta.
Si noti che la versione vettorizzata di user_from_copy() viene invocata in base al valore di CONFIG_RISCV_ISA_V_UCOPY_THRESHOLD. Il valore predefinito è 768, il che significa che per innescare questo bug vlen deve essere maggiore di 128b.
La correzione consiste semplicemente nel contrassegnare il live state come non sporco/pulito ("clean") prima di eseguire il ripristino della vstate.
If you want to get best quality of vulnerability data, you may have to visit VulDB.