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

veth: fix queue index used to wake the peer txq in veth_poll

veth_poll() derives the index of the peer TX queue to wake from
rq->xdp_rxq.queue_index. That field is only initialized by
xdp_rxq_info_reg() in veth_enable_xdp_range(), which runs only when an
XDP program is attached. On the plain GRO/NAPI path
(veth_napi_enable_range()) xdp_rxq_info_reg() is never called, so
queue_index stays 0 for every queue, as priv->rq is zero-allocated.

So in a multi-queue setup with GRO enabled and no XDP program attached,
every NAPI instance looks at the peer's TX queue 0. If veth_xmit() stops
peer TX queue 1 because the ptr_ring is full (NETDEV_TX_BUSY), nothing
ever wakes it again: the poller draining queue 1 wakes queue 0 instead.
veth implements no ndo_tx_timeout, so the netdev watchdog does not kick
in either, and the queue stays stopped indefinitely.

Derive the index from the position of the rq within priv->rq instead,
which is correct regardless of whether XDP was ever enabled.

Scripts to reproduce the stall are available at
https://github.com/netoptimizer/veth-backpressure-performance-testing
Published: 2026-08-26
Score: n/a
EPSS: n/a
KEV: No
Impact: n/a
Action: n/a
AI Analysis

Impact

The Linux kernel contains a bug in the veth_poll() routine that selects the peer transmit queue index from rq->xdp_rxq.queue_index. This field is only initialized when an XDP program is attached, but remains zero on the normal NAPI path. In a multi‑queue configuration with Generic Receive Offload enabled and no XDP program attached, the poller always targets queue 0. When another queue reaches NETDEV_TX_BUSY, it never wakes, and the stalled queue stays paused forever because the driver lacks a tx timeout handler. The result is a local denial of service where traffic on a vulnerable veth pair stalls indefinitely.

Affected Systems

Every Linux kernel that supports veth virtual Ethernet devices with multiple transmit queues is affected as long as Generic Receive Offload (GRO) is enabled on those interfaces and no XDP program is attached. The vulnerability is a kernel‑level flaw and thus applies to all distributions that ship the affected kernel code, regardless of vendor.

Risk and Exploitability

The attack requires local access to a veth pair or the ability to generate traffic that triggers the head‑of‑line stall. There is no remote exploitation vector or path to arbitrary code execution. The EPSS score is not provided and the vulnerability is not listed in the CISA KEV catalog. The impact is a high‑grade denial of service for network traffic on the affected interfaces. The risk is moderate to high for environments where local privileged users can attach or configure veth devices with multiple queues and GRO enabled.

Generated by OpenCVE AI on August 26, 2026 at 18:06 UTC.

Remediation

No vendor fix or workaround currently provided.

OpenCVE Recommended Actions

  • Upgrade to a Linux kernel version that includes the veth_poll queue index fix.
  • If a kernel upgrade cannot be applied immediately, disable Generic Receive Offload on the veth interfaces to avoid exercising the faulty wake path.
  • Ensure that veth devices use a single transmit queue or have an XDP program attached before re‑enabling multi‑queue operation to prevent the stale queue index scenario.

Generated by OpenCVE AI on August 26, 2026 at 18:06 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Wed, 26 Aug 2026 18:30:00 +0000

Type Values Removed Values Added
Weaknesses CWE-399

Wed, 26 Aug 2026 14:45:00 +0000

Type Values Removed Values Added
Description In the Linux kernel, the following vulnerability has been resolved: veth: fix queue index used to wake the peer txq in veth_poll veth_poll() derives the index of the peer TX queue to wake from rq->xdp_rxq.queue_index. That field is only initialized by xdp_rxq_info_reg() in veth_enable_xdp_range(), which runs only when an XDP program is attached. On the plain GRO/NAPI path (veth_napi_enable_range()) xdp_rxq_info_reg() is never called, so queue_index stays 0 for every queue, as priv->rq is zero-allocated. So in a multi-queue setup with GRO enabled and no XDP program attached, every NAPI instance looks at the peer's TX queue 0. If veth_xmit() stops peer TX queue 1 because the ptr_ring is full (NETDEV_TX_BUSY), nothing ever wakes it again: the poller draining queue 1 wakes queue 0 instead. veth implements no ndo_tx_timeout, so the netdev watchdog does not kick in either, and the queue stays stopped indefinitely. Derive the index from the position of the rq within priv->rq instead, which is correct regardless of whether XDP was ever enabled. Scripts to reproduce the stall are available at https://github.com/netoptimizer/veth-backpressure-performance-testing
Title veth: fix queue index used to wake the peer txq in veth_poll
First Time appeared Linux
Linux linux Kernel
CPEs cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
Vendors & Products Linux
Linux linux Kernel
References

Subscriptions

Linux Linux Kernel
cve-icon MITRE

Status: PUBLISHED

Assigner: Linux

Published:

Updated: 2026-08-26T14:36:53.580Z

Reserved: 2026-08-15T05:44:03.930Z

Link: CVE-2026-74742

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-08-26T15:16:52.990

Modified: 2026-08-26T15:16:52.990

Link: CVE-2026-74742

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-08-26T18:15:08Z

Weaknesses