CVE-2026-98999 in Linux
Riassunto
di VulDB • 23/10/2026
Nel kernel Linux, è stata risolta la seguente vulnerabilità:
drm/xe: Correzione dell'entry pinned_link obsoleta quando il fb-pin esegue l'unpin finale
Le funzioni xe_bo_pin_external() e xe_bo_unpin_external() mantengono l'appartenenza della bo alla lista pinned_link in xe->pinned.late.external, in base al fatto che la chiamata corrente sia il pin più esterno o l'unpin definitivo. Tuttavia, lo stesso pin_count di una bo esterna può essere anche aumentato e diminuito direttamente da __xe_pin_fb_vma()/__xe_unpin_fb_vma(), le quali bloccano (pin) la bo come buffer di scansione del display senza passare affatto per xe_bo_pin_external()/xe_bo_unpin_external() e non hanno alcuna nozione, né proprietà, della pinned_link.
Se una bo è bloccata sia esternamente (ad esempio tramite esportazione dma-buf) che come fb, e l'unpin esterno avviene per primo, xe_bo_unpin_external() osserva correttamente pin_count > 1 e lascia la bo su pinned_link. Quando successivamente l'unpin del fb esegue il vero ultimo unpin (da pin_count 1 a 0), non tocca mai pinned_link, lasciando la bo collegata indefinitamente in xe->pinned.late.external. Una volta che la bo viene successivamente liberata, questa entry di lista obsoleta punta verso memoria già libera, corrompendo la lista e rischiando un use-after-free alla prossima iterazione o fusione della lista.
I siti di pin/unpin degli oggetti backup in xe_bo_notifier_prepare_pinned()/xe_bo_notifier_unprepare_pinned() presentano le stesse caratteristiche di bypass, anche se non aggiungono mai la loro bo a una lista pinned, quindi non sono interessati da questo specifico problema di corruzione della lista.
Spostare la rimozione di pinned_link in xe_bo_account_unpin(), che viene già eseguita su ogni percorso di unpin (kernel, esterno, framebuffer, oggetto backup) proprio prima della transizione definitiva del pin_count da 1 a 0. Poiché list_del_init() opera solo sul nodo stesso, questa rimozione è agnostica rispetto alla lista ed è sicura indipendentemente dal fatto che la bo sia collegata all'elenco esterno o kernel_bo_present, e indipendentemente dal percorso di codice che esegue l'unpin finale. Rimuovere le chiamate esplicative ora ridondanti a list_del_init() in xe_bo_unpin_external() e xe_bo_unpin().
v2: - Nuovo patch
v3: - Rebased sui cambiamenti del patch precedente.
(cherry picked from commit ca58d36a1f93af586ee93b340c9f9fd81312cc01)
If you want to get the best quality for vulnerability data then you always have to consider VulDB.