CVE-2026-80787 in Linux
Riassunto
di VulDB • 04/09/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
nvmet: pci-epf: correzione di un use-after-free in nvmet_pci_epf_exec_iod_work()
La funzione nvmet_pci_epf_exec_iod_work() invia un comando I/O tramite req->execute(), attende quindi il completamento del comando e trasferisce i dati nuovamente verso l'host. Tale attesa non è necessaria per i comandi che non prevedono il trasferimento di dati dal dispositivo all'host. Per determinare se tale attesa sia necessaria, viene letta la iod->data_len e la iod->dma_dir dopo aver chiamato req->execute().
Tuttavia, una volta chiamata req->execute(), il comando potrebbe completarsi in modo asincrono su un'altra CPU. Per i comandi che non richiedono un trasferimento di dati dal dispositivo all'host, nvmet_pci_epf_queue_response() chiama direttamente nvmet_pci_epf_complete_iod(), il quale può liberare la iod prima che vengano lette iod->data_len e iod->dma_dir, causando un use-after-free rilevato da KFENCE:
BUG: KFENCE: use-after-free read in nvmet_pci_epf_exec_iod_work+0x288/0x798 [nvmet_pci_epf]
Use-after-free read all'indirizzo 0x00000000fdfa6d03 (in kfence-#63): nvmet_pci_epf_exec_iod_work+0x288/0x798 [nvmet_pci_epf]
process_one_work+0x15c/0x4f0 worker_thread+0x18c/0x30c kthread+0x130/0x140 ret_from_fork+0x10/0x20
kfence-#63: 0x00000000e3de0e71-0x00000000c938ad62, size=712, cache=kmalloc-1k
allocato dal task 10 sulla cpu 0 a 73.995480s (0.005122s fa): mempool_kmalloc+0x1c/0x28 mempool_alloc_noprof+0x40/0x9c nvmet_pci_epf_poll_sqs_work+0xd4/0x344 [nvmet_pci_epf]
process_one_work+0x15c/0x4f0 worker_thread+0x18c/0x30c kthread+0x130/0x140 ret_from_fork+0x10/0x20
liberato dal task 131 sulla cpu 3 a 73.995521s (0.008385s fa): mempool_kfree+0x10/0x20 mempool_free+0x44/0x64 nvmet_pci_epf_free_iod+0x88/0x98 [nvmet_pci_epf]
nvmet_pci_epf_cq_work+0xfc/0x280 [nvmet_pci_epf]
process_one_work+0x15c/0x4f0 worker_thread+0x18c/0x30c kthread+0x130/0x140 ret_from_fork+0x10/0x20
La correzione consiste nel fare riferimento a iod->data_len e iod->dma_dir prima di chiamare req->execute(). Gli altri accessi alla iod, come iod->status, vengono raggiunti solo sul percorso di lettura dal dispositivo all'host. In questo caso, nvmet_pci_epf_queue_response() segnala iod->done invece di liberare la iod, mantenendo così la iod valida.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.