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

net/sched: cls_api: reclaim an empty proto on the error path

Two racing tc filter add requests on the same chain/prio of an
unlocked classifier both run change() on the shared proto and both
can fail: the winner's tcf_chain_tp_delete_empty() attempt gives up
because the loser's handle is still in the idr, and the loser's
error path drops only its own reference without a second reclamation
attempt. The empty proto stays linked in the chain, holding the
chain reference, a block reference and the classifier module
reference until the chain or block is torn down.

Reclaim the proto on the error path of any failed request that holds
a proto reference. The reclamation is emptiness-gated:
tcf_chain_tp_delete_empty() unlinks the proto only when
delete_empty() admits it is empty, so a live shared proto is never
unlinked. A proto the request created is reclaimed unconditionally -
it is the only owner, so marking it for deletion is safe even without
a delete_empty callback. Classifiers without one (the check marks the
proto unconditionally) are rtnl-serialized, so the raced window this
guard closes cannot arise for them.

This is a follow-up to commit d4e359b3608a ("net/sched: cls_api: fix
teardown of an adopted proto on insert-race loss"), which stopped the
loser of the insert race from unlinking the winner's live proto but
left the empty-proto residual in place.

Conditions to recreate:
- CONFIG_NET_CLS_FLOWER=y; veth pair
- tc qdisc add dev veth0 ingress
- two concurrent `tc filter add dev veth0 ingress protocol ip pref 1
flower skip_sw ... action drop` (both fail in fl_hw_replace_filter
after publishing their handle in the idr); repeat in a loop
- an empty flower tp stays linked after both requests fail; visible
as a bare `filter protocol ip pref 1 flower chain 0` header in
`tc filter show` with no filter entries
- CAP_NET_ADMIN (namespace-local via unshare -Urn suffices)
Published: 2026-10-18
Score: 3.3 Low
EPSS: < 1% Very Low
KEV: No
Impact: Denial of Service (inferred)
Action: Apply Kernel Patch
AI Analysis

Impact

A race condition in the Linux kernel’s traffic control API allows two concurrent filter‑add commands on the same queue discipline to both fail, leaving an empty classifier prototype object linked in the chain. The object is left unreclaimed, holding chain, block, and module references. Over time this can consume kernel resources and destabilize the networking stack, possibly leading to loss of packet filtering or service interruption (inferred).

Affected Systems

All Linux kernel configurations that enable the Flower classifier (CONFIG_NET_CLS_FLOWER=y) and use libtc commands are affected. The problem exists in kernel versions prior to the commit that removes the residual empty prototype from the chain. Distributions shipping kernels before that fix, regardless of vendor, are vulnerable. Anything that runs the tc binary with CAP_NET_ADMIN privileges inside a network namespace can trigger the race.

Risk and Exploitability

The exploit requires local control with CAP_NET_ADMIN or root, and the attacker must orchestrate simultaneous filter‑add operations to reproduce the race. The EPSS score is < 1% and the vulnerability does not appear in the CISA KEV catalog. While the attack is limited to systems that use the Flower classifier, the impact could be high if an attacker is able to exhaust kernel resources or cause a denial of service (inferred). The CVSS score is 3.3, indicating a low‑severity risk but still potential for DoS (inferred).

Generated by OpenCVE AI on October 24, 2026 at 03:53 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Upgrade the Linux kernel to a version that incorporates the fix committing d4e359b3608a and its subsequent adjustments.
  • If an upgrade is not immediately possible, avoid using the Flower classifier or remove any existing Flower qdisc entries.
  • Restart affected networking components or reload tc configurations to flush any residual prototype objects after any known failure conditions (inferred).
  • Consider migrating to alternative traffic control classifiers that do not exhibit this race condition (inferred).

Generated by OpenCVE AI on October 24, 2026 at 03:53 UTC.

Tracking

Sign in to view the affected projects.

Advisories
Source ID Title
Debian DLA Debian DLA DLA-4850-1 linux-6.12 security update
History

Fri, 30 Oct 2026 13:00:00 +0000


Sat, 24 Oct 2026 02:30:00 +0000

Type Values Removed Values Added
Weaknesses CWE-362
CWE-754

Sat, 24 Oct 2026 00:30:00 +0000

Type Values Removed Values Added
Weaknesses CWE-772
References
Metrics threat_severity

None

cvssV3_1

{'score': 3.3, 'vector': 'CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:L'}

threat_severity

Low


Wed, 21 Oct 2026 13:15:00 +0000


Sun, 18 Oct 2026 20:45:00 +0000

Type Values Removed Values Added
Weaknesses CWE-362
CWE-754

Sun, 18 Oct 2026 16:00:00 +0000

Type Values Removed Values Added
Description In the Linux kernel, the following vulnerability has been resolved: net/sched: cls_api: reclaim an empty proto on the error path Two racing tc filter add requests on the same chain/prio of an unlocked classifier both run change() on the shared proto and both can fail: the winner's tcf_chain_tp_delete_empty() attempt gives up because the loser's handle is still in the idr, and the loser's error path drops only its own reference without a second reclamation attempt. The empty proto stays linked in the chain, holding the chain reference, a block reference and the classifier module reference until the chain or block is torn down. Reclaim the proto on the error path of any failed request that holds a proto reference. The reclamation is emptiness-gated: tcf_chain_tp_delete_empty() unlinks the proto only when delete_empty() admits it is empty, so a live shared proto is never unlinked. A proto the request created is reclaimed unconditionally - it is the only owner, so marking it for deletion is safe even without a delete_empty callback. Classifiers without one (the check marks the proto unconditionally) are rtnl-serialized, so the raced window this guard closes cannot arise for them. This is a follow-up to commit d4e359b3608a ("net/sched: cls_api: fix teardown of an adopted proto on insert-race loss"), which stopped the loser of the insert race from unlinking the winner's live proto but left the empty-proto residual in place. Conditions to recreate: - CONFIG_NET_CLS_FLOWER=y; veth pair - tc qdisc add dev veth0 ingress - two concurrent `tc filter add dev veth0 ingress protocol ip pref 1 flower skip_sw ... action drop` (both fail in fl_hw_replace_filter after publishing their handle in the idr); repeat in a loop - an empty flower tp stays linked after both requests fail; visible as a bare `filter protocol ip pref 1 flower chain 0` header in `tc filter show` with no filter entries - CAP_NET_ADMIN (namespace-local via unshare -Urn suffices)
Title net/sched: cls_api: reclaim an empty proto on the error path
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-10-30T12:39:57.018Z

Reserved: 2026-09-25T10:25:14.371Z

Link: CVE-2026-98811

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-10-18T16:17:35.200

Modified: 2026-10-30T13:21:28.767

Link: CVE-2026-98811

cve-icon Redhat

Severity : Low

Publid Date: 2026-10-18T00:00:00Z

Links: CVE-2026-98811 - Bugzilla

cve-icon OpenCVE Enrichment

Updated: 2026-10-24T04:00:16Z

Weaknesses
  • CWE-772

    Missing Release of Resource after Effective Lifetime