CVE-2026-89777 in Linux
Zusammenfassung
von VulDB • 16.09.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
vfio/pci: vdev->msi_perm nach dem Freigeben bei einem Initialisierungsfehler auf NULL setzen
vfio_msi_cap_len() alloziert die pro-Gerät-MSI-Berechtigungstabelle verzögert (lazy allocation):
vdev->msi_perm = kmalloc_obj(struct perm_bits, GFP_KERNEL_ACCOUNT); if (!vdev->msi_perm) return -ENOMEM;
ret = init_pci_cap_msi_perm(vdev->msi_perm, len, flags); if (ret) {
kfree(vdev->msi_perm); return ret; /* vdev->msi_perm bleibt hängend */ }
Wenn init_pci_cap_msi_perm() -> alloc_perm_bits() mit -ENOMEM fehlschlägt, wird im Fehlerpfad vdev->msi_perm freigegeben, der Zeiger auf das freigegebene Objekt jedoch in vdev->msi_perm stehengelassen. vdev->msi_perm wird später nicht wieder auf NULL gesetzt, da die Struktur vfio_pci_core_device gerätespezifisch ist und über Open-/Close-Zyklen hinweg bestehen bleibt, und der Fehlerpfad von vfio_config_init() zurückkehrt, ohne vfio_config_free() aufzurufen. Der hängende Zeiger (dangling pointer) lebt also länger als das fehlgeschlagene Öffnen des Geräts.
Dies führt zu zwei Use-After-Free-Fehlern am selben Gerät:
1. Wiederverwendung. Das nächste Aufruf von vfio_config_init() sieht den veralteten Zeiger bei „if (vdev->msi_perm) return len;“ und verwendet das freigegebene Objekt erneut. MSI-Konfigurationszugriffe in vfio_pci_config_rw_single() dereferenzieren dann die bereits freigegebenen Funktionzeiger perm->readfn / perm->writefn.
2. Double Free (Doppelte Freigabe). Ein späterer Aufruf von vfio_config_free() führt free_perm_bits() und kfree() für das bereits freigegebene Objekt aus.
Behoben wird dies durch das Setzen von vdev->msi_perm auf NULL nach dem kfree(), was der Disziplin „NULL after Free“ entspricht, die in free_perm_bits() und vfio_config_free() bereits angewendet wird.
BUG: KASAN: slab-use-after-free in vfio_pci_config_rw_single (drivers/vfio/pci/vfio_pci_config.c:1961) Read of size 8 at addr ffff88800fcc88d0 by task exploit/143 Call Trace: ... kasan_report (mm/kasan/report.c:595) vfio_pci_config_rw_single (drivers/vfio/pci/vfio_pci_config.c:1961) vfio_pci_config_rw (drivers/vfio/pci/vfio_pci_config.c:1986) vfio_pci_rw (drivers/vfio/pci/vfio_pci_core.c:1599) vfs_read (fs/read_write.c:572) __x64_sys_pread64 (fs/read_write.c:764) do_syscall_64 (arch/x86/entry/syscall_64.c:94) ...
Gefolgt von einem Double Free desselben Objekts beim Schließen des Geräts:
Oops: general protection fault, probably for non-canonical address 0x1f63e0e8000008: 0000 [#1] SMP KASAN NOPTI
RIP: 0010:kfree (mm/slub.c:6711) Call Trace: vfio_config_free (drivers/vfio/pci/vfio_pci_config.c:1861) vfio_pci_core_disable (drivers/vfio/pci/vfio_pci_core.c:685) vfio_pci_core_close_device (drivers/vfio/pci/vfio_pci_core.c:777) vfio_df_close (drivers/vfio/vfio_main.c:602) vfio_device_fops_release (drivers/vfio/vfio_main.c:648) __fput (fs/file_table.c:512) __x64_sys_close (fs/open.c:1496) do_syscall_64 (arch/x86/entry/syscall_64.c:94) ... Kernel panic - not syncing: Fatal exception
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.