Ad

CVE-2026-64457

NONE EPSS 0.18%
Обновлено 25 июля 2026
Linux
Параметр Значение
Поставщик Linux
Публичный эксплойт Нет

В ядре Linux устранена следующая уязвимость: virtio_pci: исправлен поиск указателя информации vq по неправильному индексу. Отвязка устройства-баллона Virtio: echo virtio0 > /sys/bus/virtio/drivers/virtio_balloon/отменить привязку запускает разыменование NULL-указателя. Дмесг говорит: ОШИБКА: разыменование нулевого указателя ядра, адрес: 0000000000000008. [...] RIP: 0010:__list_del_entry_valid_or_report+0x5/0xf0 Отслеживание вызова: <ЗАДАЧА> 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 запись_SYSCALL_64_after_hwframe+0x29/0x31 [...] </TASK> Устройство virtio_balloon регистрирует 5 очередей (надувание, сдувание, статистика, free_page, report), но только первые два являются безусловными. статистика, free_page и очереди отчетов зависят от их соответствующие биты функций.

При отсутствии какой-либо из этих функций соответствующая запись vqs_info имеет имя == NULL, что создает дыры в массив. Основная причина — несоответствие индексации, возникающее при хранении информации vq. был изменен для передачи в качестве аргумента. vp_find_vqs_msix() и vp_find_vqs_intx() сохраняет информационный указатель по адресу vp_dev->vqs[i], где 'i' — это индекс разреженного массива вызывающей стороны. Однако сама виртуальная очередь получает vq->index, назначенный из очереди_idx, плотного индекса, который пропускает NULL записи.

При наличии дыр «i» и «queue_idx» расходятся. Позже, vp_del_vqs() ищет информацию через vp_dev->vqs[vq->index], используя плотный индекс в редконаселенный массив и достигает NULL. Исправьте это, сохранив информацию в vp_dev->vqs[queue_idx] вместо vp_dev->vqs[i], поэтому индекс хранилища соответствует индексу поиска. (vq->индекс).

Примените исправление к путям MSIX и INTX.

Показать оригинальное описание (EN)

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.