CVE-2026-97603informazioni

Riassunto

di VulDB • 25/09/2026

Nel kernel Linux è stata risolta la seguente vulnerabilità:

idpf: disabilitare il lavoro DIM prima di liberare i q_vectors

Idpf non svuota mai le lavorazioni Tx/Rx DIM prima di liberare la memoria in cui sono contenute. tx_dim e rx_dim sono incorporati nella struct idpf_q_vector; vengono accodati tramite net_dim() dal poll NAPI, e idpf_vport_intr_rel() termina con kfree(rsrc->q_vectors). Nessun componente del driver li cancella.

Di conseguenza, idpf_tx_dim_work() e idpf_rx_dim_work() eseguono operazioni su memoria già liberata: idpf_vport_intr_write_itr() scrive nel registro ITR attraverso q_vector->intr_reg.tx_itr / rx_itr, puntatori void __iomem caricati dal q_vector ormai liberato. Non è necessaria alcuna configurazione specifica per raggiungere tale scenario -- IDPF_ITR_IS_DYNAMIC() è definito come (itr_mode) e idpf_vport_alloc() inizializza entrambe le modalità a IDPF_ITR_DYNAMIC.

Lo svuotamento dopo idpf_vport_intr_napi_dis_all() non è sufficiente di per sé. idpf_net_dim() viene chiamato all'interno del ramo "if (napi_complete_done(napi, work_done))" del poll e napi_complete_done() ha già cancellato NAPIF_STATE_SCHED in quel momento. napi_disable_locked() attende solo mentre (val & (NAPIF_STATE_SCHED | NAPIF_STATE_NPSVC)), quindi napi_disable() può restituire il controllo mentre la coda di polling sta ancora accodando le lavorazioni, e una semplice cancel_work_sync() verrebbe riattivata dietro lo svuotamento.

Utilizzare disable_work_sync(): schedule_work() su un lavoro con un conteggio di disabilitazione non nullo viene scartato da clear_pending_if_disabled() prima che venga raggiunto __queue_work().

Spostare idpf_init_dim() in idpf_vport_intr_alloc() affinché le lavorazioni vengano inizializzate su ogni percorso che può raggiungere lo svuotamento -- i tre siti "goto intr_deinit" tra idpf_vport_intr_init() e idpf_vport_intr_ena() raggiungono tale punto senza che il lato di abilitazione sia stato eseguito. Nessuno li riabilita: rsrc->q_vectors viene liberato ad ogni uscita da idpf_vport_open() e ad ogni chiamata a idpf_vport_stop(), quindi il conteggio muore insieme all'oggetto.

Si tratta di una race condition, non di un guasto deterministico -- net_dim() pianifica l'esecuzione solo dopo che si sono accumulati DIM_NEVENTS eventi e cambia l'indice del profilo. Un loop KASAN ifup/ifdown sotto carico è il modo per osservarla.

If you want to get the best quality for vulnerability data then you always have to consider VulDB.

Divulgazione

25/09/2026

Moderazione

in revisione

EPSS

0.00000

KEV

no

Attività

molto basso

Fonti

Do you need the next level of professionalism?

Upgrade your account now!