DEBIAN-CVE-2026-23294

Source
https://security-tracker.debian.org/tracker/CVE-2026-23294
Import Source
https://storage.googleapis.com/debian-osv/debian-cve-osv/DEBIAN-CVE-2026-23294.json
JSON Data
https://api.osv.dev/v1/vulns/DEBIAN-CVE-2026-23294
Upstream
Published
2026-03-25T11:16:24.697Z
Modified
2026-04-03T10:01:21.449147Z
Severity
  • 7.0 (High) CVSS_V3 - CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H CVSS Calculator
Summary
[none]
Details

In the Linux kernel, the following vulnerability has been resolved: bpf: Fix race in devmap on PREEMPTRT On PREEMPTRT kernels, the per-CPU xdpdevbulkqueue (bq) can be accessed concurrently by multiple preemptible tasks on the same CPU. The original code assumes bqenqueue() and __devflush() run atomically with respect to each other on the same CPU, relying on localbhdisable() to prevent preemption. However, on PREEMPTRT, localbhdisable() only calls migratedisable() (when PREEMPTRTNEEDSBHLOCK is not set) and does not disable preemption, which allows CFS scheduling to preempt a task during bqxmitall(), enabling another task on the same CPU to enter bqenqueue() and operate on the same per-CPU bq concurrently. This leads to several races: 1. Double-free / use-after-free on bq->q[]: bqxmitall() snapshots cnt = bq->count, then iterates bq->q[0..cnt-1] to transmit frames. If preempted after the snapshot, a second task can call bqenqueue() -> bqxmitall() on the same bq, transmitting (and freeing) the same frames. When the first task resumes, it operates on stale pointers in bq->q[], causing use-after-free. 2. bq->count and bq->q[] corruption: concurrent bqenqueue() modifying bq->count and bq->q[] while bqxmitall() is reading them. 3. devrx/xdpprog teardown race: __devflush() clears bq->devrx and bq->xdpprog after bqxmitall(). If preempted between bqxmitall() return and bq->devrx = NULL, a preempting bqenqueue() sees devrx still set (non-NULL), skips adding bq to the flush_list, and enqueues a frame. When __devflush() resumes, it clears devrx and removes bq from the flush_list, orphaning the newly enqueued frame. 4. __listdelclearprev() on flush_node: similar to the cpumap race, both tasks can call __listdelclearprev() on the same flush_node, the second dereferences the prev pointer already set to NULL. The race between task A (__devflush -> bqxmitall) and task B (bqenqueue -> bqxmitall) on the same CPU: Task A (xdpdoflush) Task B (ndoxdpxmit redirect) ---------------------- -------------------------------- devflush(flushlist) bqxmitall(bq) cnt = bq->count /* e.g. 16 / / start iterating bq->q[] */ <-- CFS preempts Task A --> bqenqueue(dev, xdpf) bq->count == DEVMAPBULKSIZE bqxmitall(bq, 0) cnt = bq->count /* same 16! */ ndoxdpxmit(bq->q[]) /* frames freed by driver */ bq->count = 0 <-- Task A resumes --> ndoxdpxmit(bq->q[]) /* use-after-free: frames already freed! */ Fix this by adding a locallockt to xdpdevbulkqueue and acquiring it in bqenqueue() and _devflush(). These paths already run under localbhdisable(), so use locallocknestedbh() which on non-RT is a pure annotation with no overhead, and on PREEMPTRT provides a per-CPU sleeping lock that serializes access to the bq.

References

Affected packages

Debian:14 / linux

Package

Name
linux
Purl
pkg:deb/debian/linux?arch=source

Affected ranges

Type
ECOSYSTEM
Events
Introduced
0Unknown introduced version / All previous versions are affected
Fixed
6.19.8-1

Affected versions

6.*
6.12.38-1
6.12.41-1
6.12.43-1~bpo12+1
6.12.43-1
6.12.48-1
6.12.57-1~bpo12+1
6.12.57-1
6.12.63-1~bpo12+1
6.12.63-1
6.12.69-1~bpo12+1
6.12.69-1
6.12.73-1~bpo12+1
6.12.73-1
6.12.74-1
6.12.74-2~bpo12+1
6.12.74-2
6.13~rc6-1~exp1
6.13~rc7-1~exp1
6.13.2-1~exp1
6.13.3-1~exp1
6.13.4-1~exp1
6.13.5-1~exp1
6.13.6-1~exp1
6.13.7-1~exp1
6.13.8-1~exp1
6.13.9-1~exp1
6.13.10-1~exp1
6.13.11-1~exp1
6.14.3-1~exp1
6.14.5-1~exp1
6.14.6-1~exp1
6.15~rc7-1~exp1
6.15-1~exp1
6.15.1-1~exp1
6.15.2-1~exp1
6.15.3-1~exp1
6.15.4-1~exp1
6.15.5-1~exp1
6.15.6-1~exp1
6.16~rc7-1~exp1
6.16-1~exp1
6.16.1-1~exp1
6.16.3-1~bpo13+1
6.16.3-1
6.16.5-1
6.16.6-1
6.16.7-1
6.16.8-1
6.16.9-1
6.16.10-1
6.16.11-1
6.16.12-1~bpo13+1
6.16.12-1
6.16.12-2
6.17.2-1~exp1
6.17.5-1~exp1
6.17.6-1
6.17.7-1
6.17.7-2
6.17.8-1~bpo13+1
6.17.8-1
6.17.9-1
6.17.10-1
6.17.11-1
6.17.12-1
6.17.13-1~bpo13+1
6.17.13-1
6.18~rc4-1~exp1
6.18~rc4-1~exp2
6.18~rc5-1~exp1
6.18~rc6-1~exp1
6.18~rc7-1~exp1
6.18.1-1~exp1
6.18.2-1~exp1
6.18.3-1
6.18.5-1~bpo13+1
6.18.5-1
6.18.8-1
6.18.9-1~bpo13+1
6.18.9-1
6.18.10-1
6.18.12-1~bpo13+1
6.18.12-1
6.18.13-1
6.18.14-1
6.18.15-1~bpo13+1
6.18.15-1
6.19~rc4-1~exp1
6.19~rc5-1~exp1
6.19~rc6-1~exp1
6.19~rc7-1~exp1
6.19~rc8-1~exp1
6.19-1~exp1
6.19.2-1~exp1
6.19.3-1~exp1
6.19.4-1~exp1
6.19.5-1~exp1
6.19.6-1
6.19.6-2~bpo13+1
6.19.6-2
6.19.8-1~bpo13+1

Ecosystem specific

{
    "urgency": "not yet assigned"
}

Database specific

source
"https://storage.googleapis.com/debian-osv/debian-cve-osv/DEBIAN-CVE-2026-23294.json"