CVE-2026-64457: virtio_pci: fix vq info pointer lookup via wrong index

Greg Kroah-Hartman <[email protected]> Sat, 25 Jul 2026 10:51:14 +0200
Newsgroups org.kernel.vger.linux-cve-announce
Message-ID <2026072542-CVE-2026-64457-9f4a@gregkh>
From: Greg Kroah-Hartman <[email protected]>

Description
===========

In the Linux kernel, the following vulnerability has been resolved:

virtio_pci: fix vq info pointer lookup via wrong index

Unbinding a virtio balloon device:

    echo virtio0 > /sys/bus/virtio/drivers/virtio_balloon/unbind

triggers a NULL pointer dereference. The dmesg says:

    BUG: kernel NULL pointer dereference, address: 0000000000000008
    [...]
    RIP: 0010:__list_del_entry_valid_or_report+0x5/0xf0
    Call Trace:
    <TASK>
    vp_del_vqs+0x121/0x230
    remove_common+0x135/0x150
    virtballoon_remove+0xee/0x100
    virtio_dev_remove+0x3b/0x80
    device_release_driver_internal+0x187/0x2c0
    unbind_store+0xb9/0xe0
    kernfs_fop_write_iter.llvm.11660790530567441834+0xf6/0x180
    vfs_write+0x2a9/0x3b0
    ksys_write+0x5c/0xd0
    do_syscall_64+0x54/0x230
    entry_SYSCALL_64_after_hwframe+0x29/0x31
    [...]
    </TASK>

The virtio_balloon device registers 5 queues (inflate, deflate, stats,
free_page, reporting) but only the first two are unconditional. The
stats, free_page and reporting queues are each conditional on their
respective feature bits. When any of these features are absent, the
corresponding vqs_info entry has name == NULL, creating holes in the
array.

The root cause is an indexing mismatch introduced when vq info storage
was changed to be passed as an argument. vp_find_vqs_msix() and
vp_find_vqs_intx() store the info pointer at vp_dev->vqs[i], where 'i'
is the caller's sparse array index. However, the virtqueue itself gets
vq->index assigned from queue_idx, a dense index that skips NULL
entries. When holes exist, 'i' and queue_idx diverge. Later,
vp_del_vqs() looks up info via vp_dev->vqs[vq->index] using the dense
index into the sparsely-populated array, and hits NULL.

Fix this by storing info at vp_dev->vqs[queue_idx] instead of
vp_dev->vqs[i], so the store index matches the lookup index
(vq->index). Apply the fix to both the MSIX and INTX paths.

The Linux kernel CVE team has assigned CVE-2026-64457 to this issue.


Affected and fixed versions
===========================

	Issue introduced in 6.11 with commit 89a1c435aec269d109ed46ca7bbb10fa8edf7ace and fixed in 6.12.96 with commit 41e6dc1a10036c9f47057033f19af7e52ec464b6
	Issue introduced in 6.11 with commit 89a1c435aec269d109ed46ca7bbb10fa8edf7ace and fixed in 6.18.39 with commit 075bc3c779e1ea7294afabdcb7e0a49536959b28
	Issue introduced in 6.11 with commit 89a1c435aec269d109ed46ca7bbb10fa8edf7ace and fixed in 7.1.4 with commit 64a4c0befa77bcc01076aec9f93863ffd4ed06b7
	Issue introduced in 6.11 with commit 89a1c435aec269d109ed46ca7bbb10fa8edf7ace and fixed in 7.2-rc1 with commit f7d380fb525c13bdd114369a1979c80c346e6abc

Please see https://www.kernel.org for a full list of currently supported
kernel versions by the kernel community.

Unaffected versions might change over time as fixes are backported to
older supported kernel versions.  The official CVE entry at
	https://cve.org/CVERecord/?id=CVE-2026-64457
will be updated if fixes are backported, please check that for the most
up to date information about this issue.


Affected files
==============

The file(s) affected by this issue are:
	drivers/virtio/virtio_pci_common.c


Mitigation
==========

The Linux kernel CVE team recommends that you update to the latest
stable kernel version for this, and many other bugfixes.  Individual
changes are never tested alone, but rather are part of a larger kernel
release.  Cherry-picking individual commits is not recommended or
supported by the Linux kernel community at all.  If however, updating to
the latest release is impossible, the individual changes to resolve this
issue can be found at these commits:
	https://git.kernel.org/stable/c/41e6dc1a10036c9f47057033f19af7e52ec464b6
	https://git.kernel.org/stable/c/075bc3c779e1ea7294afabdcb7e0a49536959b28
	https://git.kernel.org/stable/c/64a4c0befa77bcc01076aec9f93863ffd4ed06b7
	https://git.kernel.org/stable/c/f7d380fb525c13bdd114369a1979c80c346e6abc