CVE-2026-97990 PUBLISHED

vdpa_sim_net: check TX pull result before RX copy

Assigner: Linux
Reserved: 25.09.2026 Published: 25.09.2026 Updated: 25.09.2026

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

vdpa_sim_net: check TX pull result before RX copy

vringh_iov_pull_iotlb() returns a signed byte count. A failed TX pull is currently added to the unsigned byte counter and then passed as a size_t length to receive_filter() and vringh_iov_push_iotlb(). A negative error can therefore become a large length in the RX path.

Handle non-positive pull results before every length use. Count the TX error and complete the consumed TX descriptor with zero bytes.

I found this bug myself, though the patch was written with AI assistance.

Metrics

CVSS Vector: CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:H
CVSS Score: 7.5

AV:L - The malformed input is a virtqueue TX descriptor with an unmapped address, written into the vring by whoever drives the vdpa_sim_net device (a guest via vhost-vdpa or a local vhost-vdpa user). vdpasim_net_work() processes it and no network protocol carries it. AC:H - Once reached, the failed vringh_iov_pull_iotlb() is deterministic. But it requires an admin to create a vdpa_sim_net device (a test-only simulator under RUNTIME_TESTING_MENU) and assign it to the attacker's VM or process, a configuration the attacker cannot produce. PR:L - Device creation needs GENL_ADMIN_PERM in init_net (not reachable via user namespaces). The attacker is the guest or process given the device, which only needs ordinary control of its own virtqueues and no host privileges. UI:N - The attacker queues a broadcast TX frame, then a TX descriptor that fails IOTLB translation, plus large RX descriptors, all on their own rings. No victim action is needed. S:C - A guest driving vdpa_sim_net through vhost-vdpa causes the host kernel to copy host heap memory into guest-visible RX buffers, crossing the VM-to-host boundary. C:H - The negative read, cast to size_t, is passed to vringh_iov_push_iotlb(). It copies from the PAGE_SIZE net->buffer up to the attacker-sized RX iov, leaking adjacent host kernel heap (an out-of-bounds read not limited to a few bytes) into attacker memory. I:N - The overlong copy only reads kernel memory and writes into the attacker's own RX buffers; no kernel memory is written. The only other effect is corrupted tx_bytes statistics. A:H - A large RX descriptor chain makes the out-of-bounds read of net->buffer run into unmapped memory, oopsing the host kernel and taking down every guest on it.

Product Status

Vendor Linux
Product Linux
Versions Default: unaffected
  • affected from cfe226892913a448e83e7a19db93862baa3cb99c to c001abcde865b74231da8f1412c3217dbf66781e (excl.)
  • affected from cfe226892913a448e83e7a19db93862baa3cb99c to 3af20238a09ca180d66623e3bed16b64e9975f39 (excl.)
  • affected from cfe226892913a448e83e7a19db93862baa3cb99c to 2bbf1c1f69991e28787e02b0a2f826289d5fc730 (excl.)
  • affected from cfe226892913a448e83e7a19db93862baa3cb99c to 0d195797a80b77f2ec56718cd26d3ee65d0093e8 (excl.)
Vendor Linux
Product Linux
Versions Default: affected
  • Version 5.19 is affected
  • unaffected from 0 to 5.19 (excl.)
  • unaffected from 6.12.111 to 6.12.* (incl.)
  • unaffected from 6.18.53 to 6.18.* (incl.)
  • unaffected from 7.2.7 to 7.2.* (incl.)
  • unaffected from 7.3-rc3 to * (incl.)

References