CVE-2026-99079 PUBLISHED

net/mlx5e: Prevent stale XSK buffer release on refill retry

Assigner: Linux
Reserved: 25.09.2026 Published: 23.10.2026 Updated: 24.10.2026

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

net/mlx5e: Prevent stale XSK buffer release on refill retry

When an XDP redirect to an AF_XDP socket fails because its RX ring is full, the XSK core frees the buffer. During the subsequent batched refill of a legacy cyclic RQ, mlx5e also releases the WQE's XSK buffer before allocating a replacement. If that refill succeeds only partially, a WQE left without a replacement retains its old buffer pointer.

The buffer can meanwhile be allocated to another WQE. A later refill retry can then free the live buffer through the stale pointer and publish the same UMEM frame twice.

Mark the WQE as released immediately after the driver-side free. The flag is already cleared when a replacement buffer is assigned, so refill retries no longer release stale pointers.

The failure is silent and produces no kernel warning or splat. A standalone legacy cyclic-RQ zero-copy libxsk reproducer, using 64-byte UDP traffic offered at 12 Mpps, detected it: stock stopped after 2,854,914 packets in 4.094 seconds, with 4,542 xdp_rx_ring_full events and 64 ownership/double-publication errors. With this change it processed 356,904,225 packets in 30 seconds despite 571,405 xdp_rx_ring_full events, with no ownership or data errors.

Metrics

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

AV:N - UDP datagrams reaching mlx5 drive mlx5e_completion_event() -> mlx5e_napi_poll() -> mlx5e_poll_rx_cq()/XDP redirect, then mlx5e_napi_xsk_post() -> mlx5e_post_rx_wqes() -> patched mlx5e_xsk_free_rx_wqe(); sustained routable traffic fills the XSK RX ring and triggers stale release. AC:L - A sender can sustain small-packet traffic until __xsk_rcv_zc() reports RX-ring-full and mlx5e_xsk_alloc_rx_wqes_batched() refills only part of the missing WQEs; retries are deterministic and require no uncontrolled race or memory layout. PR:N - The NIC-CQE/NAPI receive path contains no capability or authentication check; xsk_create()'s CAP_NET_RAW check applies to victim-side AF_XDP provisioning, while the remote UDP sender needs no privileges. UI:N - Once the zero-copy XSK pool and XDP redirect are active, xsk_rcv_zc() failure, mlx5e_napi_xsk_post(), and refill retries occur automatically as packets arrive, without further victim action. S:U - mlx5e_xsk_free_rx_wqe() corrupts the host kernel's xsk_buff_pool and mlx5 receive state without crossing a VM, IOMMU, or other security-authority boundary. C:H - Duplicate xdp_buff_xsk ownership lets repeated successful __xsk_rcv_zc() calls invoke unbounded xp_release(); in unaligned-UMEM mode, free_heads_cnt can write kernel pointers past the flexible free_heads[] array, yielding heap corruption exploitable for arbitrary disclosure. I:H - The duplicate WQEs can make xp_release() write beyond free_heads[], while xp_get_xskb() later trusts pointers popped through the corrupted count; this supplies out-of-bounds and corrupted-pointer write primitives capable of control-flow hijacking. A:H - The free_heads[] overflow or a bogus xskb consumed by xp_get_xskb() can oops or panic; additionally, the dma_dev_need_sync refill path can store NULL on allocation failure and have the stale retry pass it to xsk_buff_free().

Product Status

Vendor Linux
Product Linux
Versions Default: unaffected
  • affected from 3f93f82988bc6b4104314bf9aa485d47fbb7e241 to 32bbb870078d467479965c21bbc4960c57eea208 (excl.)
  • affected from 3f93f82988bc6b4104314bf9aa485d47fbb7e241 to 34d1db2b18e1c1d189e34dd51923e031815f88e3 (excl.)
  • affected from 3f93f82988bc6b4104314bf9aa485d47fbb7e241 to 639522e5056cade578a324acfa993ec6c9f7f5dc (excl.)
  • affected from 3f93f82988bc6b4104314bf9aa485d47fbb7e241 to 655f47477054d19de3b138840be229a1a4490d0c (excl.)
  • affected from 3f93f82988bc6b4104314bf9aa485d47fbb7e241 to e01620844c5c88b6fcf819d171df8e3976a0e76f (excl.)
Vendor Linux
Product Linux
Versions Default: affected
  • Version 6.4 is affected
  • unaffected from 0 to 6.4 (excl.)
  • unaffected from 6.6.160 to 6.6.* (incl.)
  • unaffected from 6.12.113 to 6.12.* (incl.)
  • unaffected from 6.18.57 to 6.18.* (incl.)
  • unaffected from 7.2.11 to 7.2.* (incl.)
  • unaffected from 7.3 to * (incl.)

References