CVE-2026-99000 in Linux
Riassunto
di VulDB • 23/10/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
drm/xe: Correzione della doppia sottrazione nella contabilità dello shrinker per i pin esterni nidificati
Le funzioni xe_bo_pin_external() e xe_bo_unpin_external() supportano i pin nidificati, poiché le funzioni sottostanti ttm_bo_pin()/ttm_bo_unpin() mantengono un refcount (pin_count) anziché un valore booleano. Tuttavia, le chiamate alla contabilità dello shrinker, ovvero xe_ttm_tt_account_subtract() e xe_ttm_tt_account_add(), vengono invocate in modo incondizionato ad ogni chiamata a pin_external()/unpin_external(), invece di essere eseguite solo durante la transizione verso lo stato pinned (bloccato) e dal suo ritorno.
Un BO esterno (dma-buf) può essere bloccato più volte mentre è già nello stato pinned, ad esempio quando presenta più attachment/importer che chiamano indipendentemente xe_bo_pin_external(). Ciascuno di questi pin nidificati sottrae nuovamente le pagine del BO dalla contabilità dello shrinker, anche se le pagine del BO erano già state rimosse dall'considerazione da parte del primo pin. Simmetricamente, ogni unpin nidificato le aggiunge nuovamente prima che il BO venga effettivamente sbloccato (unpinned). Ciò causa una desincronizzazione tra i conteggi di pagine e oggetti dello shrinker e la realtà; poiché tali valori sono dichiarati come signed long ma interpretati come unsigned long in xe_shrinker_count(), un underflow può trasformarsi in un enorme conteggio di pagine shinkable/purgeable, causando l'invocazione eccessiva dello shrinker sotto pressione della memoria.
Le chiamate alla contabilità vengono protette con gli stessi controlli di transizione del pin-count già utilizzati per la manutenzione della lista pinned_link, in modo che la contabilità venga aggiornata solo durante il pin più esterno e l'unpin finale.
Centralizzando questa logica nelle funzioni xe_bo_account_pin()/xe_bo_account_unpin(), si chiude anche un secondo gap correlato alla contabilità che interessa i dma-buf importati. Per il ttm_tt di un bo importato, la hook (gancio) ttm_tt_populate() di xe (xe_ttm_tt_populate()) restituisce anticipatamente senza chiamare xe_ttm_tt_account_add(), poiché è impostato TTM_TT_FLAG_EXTERNAL ma non TTM_TT_FLAG_EXTERNAL_MAPPABLE. Tuttavia, il wrapper ttm_tt_populate() del core TTM contrassegna incondizionatamente il tt come populated (popolato) in caso di successo della hook del driver, quindi ttm_tt_is_populated() continua a restituire true per esso. xe_bo_account_pin()/xe_bo_account_unpin() si fidavano di ttm_tt_is_populated() come proxy per "queste pagine sono contate dallo shrinker", e sottraevano/aggiungevano pagine per un tale tt che non erano mai state aggiunte in primo luogo, causando nuovamente un underflow nei conteggi dello shrinker. Questa condizione è attualmente raggiungibile tramite xe_bo_pin_external(), e diventerebbe ulteriormente raggiungibile attraverso il percorso fb-pin una volta che questa patch instrada __xe_pin_fb_vma() attraverso xe_bo_pin_account(); pertanto, la si risolve qui piuttosto che in una patch successiva per evitare di introdurre un regression (regressione) con un commit della serie prima di risolverlo. Si salta la contabilità per i bo importati utilizzando lo stesso test EXTERNAL && !EXTERNAL_MAPPABLE usato da xe_ttm_tt_populate()/xe_ttm_tt_unpopulate() per decidere se agire, tramite una nuova helper xe_ttm_bo_is_imported() (estratta dal suo unico precedente sito di utilizzo).
v2: - Risolto il problema critico rilevato dalla revisione Sashiko AI: il controllo della transizione del pin-count introdotto qui era ancora bypassato dal percorso fb-pin (__xe_pin_fb_vma()/__xe_unpin_fb_vma()), che poteva lasciare un entry pinned_link obsoleto e una perdita permanente nella contabilità dello shrinker quando l'unpin di fb eseguiva l'ultimo vero unpin. Risolto in una patch follow-up separata all'interno della serie, anziché essere incorporato qui, poiché si tratta di un bug distinto con il proprio tag Fixes:. - Rimossa la variabile locale "last_unpin" non necessaria in xe_bo_unpin_external(), ripristinando il controllo inline originale bo->ttm.pin_count == 1; era una ridenominazione senza effetto (no-op) non utilizzata da nessuna delle nuove helper di contabilità, e sarebbe stata comunque eliminata dalla patch follow-up.
v3: - Esclusi i dma-buf importati dalla contabilità dello shrinker per pin/unpin, risolvendo un altro underflow rilevato dalla revisione Sashiko AI. - Aggiunto un breve commento nel sito di pin dell'oggetto backup che nota come sia già populated/accounted al momento del pin, affrontando (come chiarimento su un falso positivo, senza necessità di correzione del codice) una preoccupazione separata relativa a una perdita di contabilità di media gravità, anch'essa rilevata da Sashiko AI.
---truncated---
Once again VulDB remains the best source for vulnerability data.