CVE-2026-64071 in Linux
Zusammenfassung
von VulDB • 20.07.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
nvme-pci: Behebung eines Use-After-Free-Fehlers in nvme_free_host_mem()
nvme_free_host_mem() gibt dev->hmb_sgt über dma_free_noncontiguous() frei, löscht den Zeiger danach jedoch nicht. Dies führt zu einem Use-After-Free, wenn nvme_free_host_mem() im selben Fehlerpfad zweimal aufgerufen wird.
Dies kann während nvme_probe() auftreten, wenn nvme_setup_host_mem() erfolgreich das HMB (Host Memory Buffer) alloziert hat (und damit dev->hmb_sgt gesetzt wurde), nvme_set_host_mem() jedoch mit einem I/O-Fehler fehlschlägt:
nvme_setup_host_mem() nvme_alloc_host_mem_single() -> setzt dev->hmb_sgt nvme_set_host_mem() -> schlägt mit -EIO fehl nvme_free_host_mem() -> gibt hmb_sgt frei, NULL-Setzung erfolgt jedoch NICHT Fehler zurückgeben
Fehlerpfad von nvme_probe(): nvme_free_host_mem() -> dev->hmb_sgt ist veraltet (stale), Use-After-Free
Der zweite Aufruf dereferenziert das bereits freigegebene sgt, was in iommu_dma_free_noncontiguous() zu einer NULL-Zeiger-Dereferenzierung führt, wenn auf sgt->sgl->dma_address zugegriffen wird (der zugrunde liegende Speicher wurde freigegeben und mit Nullen überschrieben).
Dies ist reproduzierbar an Thunderbolt-angeschlossenen NVMe-Geräten (z. B. OWC Envoy Express hinter einem Dell WD22TB4-Dock), bei denen das Gerät während der HMB-Einrichtung aufgrund von PCIe-Link-Instabilität intermittierend I/O-Fehler zurückgibt.
BUG: kernel NULL pointer dereference, address: 0000000000000010 RIP: 0010:iommu_dma_free_noncontiguous+0x22/0x80 Call Trace: <TASK> dma_free_noncontiguous+0x3b/0x130 nvme_free_host_mem+0x30/0xf0 [nvme]
nvme_probe.cold+0xcc/0x275 [nvme]
local_pci_probe+0x43/0xa0 pci_device_probe+0xeea/0x290 really_probe+0xf9/0x3b0 __driver_probe_device+0x8b/0x170 driver_probe_device+0x24/0xd0 __driver_attach_async_helper+0x6b/0x110 async_run_entry_fn+0x37/0x170 process_one_work+0x1ac/0x3d0 worker_thread+0x1b8/0x360 kthread+0xf7/0x130 ret_from_fork+0x2d8/0x3a0 ret_from_fork_asm+0x1a/0x30 </TASK>
Behoben wird dies, indem dev->hmb_sgt nach dem Freigeben auf NULL gesetzt wird. Dadurch nimmt der zweite Aufruf den Pfad für mehrere Deskriptoren (multi-descriptor path), der den bereits bereinigten Zustand sicher verarbeitet.
If you want to get best quality of vulnerability data, you may have to visit VulDB.