CVE-2025-21702: pfifo_tail_enqueue: Drop new packet when sch->limit == 0
In the Linux kernel, the following vulnerability has been resolved:
pfifo_tail_enqueue: Drop new packet when sch->limit == 0
Expected behaviour:
In case we reach scheduler's limit, pfifo_tail_enqueue() will drop a
packet in scheduler's queue and decrease scheduler's qlen by one.
Then, pfifo_tail_enqueue() enqueue new packet and increase
scheduler's qlen by one. Finally, pfifo_tail_enqueue() return
`NET_XMIT_CN` status code.
Weird behaviour:
In case we set `sch->limit == 0` and trigger pfifo_tail_enqueue() on a
scheduler that has no packet, the 'drop a packet' step will do nothing.
This means the scheduler's qlen still has value equal 0.
Then, we continue to enqueue new packet and increase scheduler's qlen by
one. In summary, we can leverage pfifo_tail_enqueue() to increase qlen by
one and return `NET_XMIT_CN` status code.
The problem is:
Let's say we have two qdiscs: Qdisc_A and Qdisc_B.
- Qdisc_A's type must have '->graft()' function to create parent/child relationship.
Let's say Qdisc_A's type is `hfsc`. Enqueue packet to this qdisc will trigger `hfsc_enqueue`.
- Qdisc_B's type is pfifo_head_drop. Enqueue packet to this qdisc will trigger `pfifo_tail_enqueue`.
- Qdisc_B is configured to have `sch->limit == 0`.
- Qdisc_A is configured to route the enqueued's packet to Qdisc_B.
Enqueue packet through Qdisc_A will lead to:
- hfsc_enqueue(Qdisc_A) -> pfifo_tail_enqueue(Qdisc_B)
- Qdisc_B->q.qlen += 1
- pfifo_tail_enqueue() return `NET_XMIT_CN`
- hfsc_enqueue() check for `NET_XMIT_SUCCESS` and see `NET_XMIT_CN` => hfsc_enqueue() don't increase qlen of Qdisc_A.
The whole process lead to a situation where Qdisc_A->q.qlen == 0 and Qdisc_B->q.qlen == 1.
Replace 'hfsc' with other type (for example: 'drr') still lead to the same problem.
This violate the design where parent's qlen should equal to the sum of its childrens'qlen.
Bug impact: This issue can be used for user->kernel privilege escalation when it is reachable.
Security readout for executives and security teams
Plain-English summary
A Linux traffic-control queue bug can leave parent and child queue counters inconsistent. If a low-privileged local user can reach the vulnerable path, the flaw may enable kernel-level privilege escalation, potentially giving full control of the system. This is not described as a remote attack.
Executive priority
Treat this as a high-priority local privilege-escalation issue, especially on shared, multi-user, or otherwise untrusted systems. Patch through supported vendor channels promptly. Internet exposure alone does not establish exploitability, but successful local exploitation could provide full system control.
Technical view
When a zero-limit pfifo_head_drop queue uses pfifo_tail_enqueue(), it can enqueue a packet while returning NET_XMIT_CN. A parent qdisc such as HFSC or DRR may then retain a zero queue length while its child reports one. This invariant violation can support user-to-kernel privilege escalation when reachable.
Likely exposure
Exposure is limited to Linux systems running an affected kernel where a low-privileged local actor can reach the vulnerable qdisc configuration and enqueue path. The supplied version data is ambiguous, so precise affected ranges should be confirmed against distribution or product-vendor advisories.
Exploitation context
CVSS 3.1 is 7.8: local access, low complexity, low privileges, no user interaction, and potentially complete confidentiality, integrity, and availability impact. The bundle does not identify CISA KEV listing or active exploitation. Public exploitation status is therefore unconfirmed.
Researcher notes
The source describes an invariant failure between parent and child qdisc queue lengths and supplies fixes across several stable branches. Exact affected-version interpretation is incomplete: the bundle contains repeated commit identifiers and an unexplained version value of "0." Confirm branch-specific status from upstream commits and vendor advisories before declaring exposure.
Mitigation direction
Install a vendor-supported kernel update that incorporates the applicable upstream stable fix.
Check distribution and appliance-vendor advisories for the correct fixed package or firmware version.
Until patched, restrict untrusted local access and traffic-control administration where operationally feasible.
Prioritize shared or multi-user systems where low-privileged users may reach kernel networking features.
Validation and detection
Record each system's running kernel version and vendor package revision.
Compare package changelogs with CVE-2025-21702 and the applicable upstream stable commit.
Confirm systems booted into the updated kernel after installation.
Review which low-privileged users can access or administer traffic-control queue disciplines.
Repeat vulnerability scanning after remediation and investigate remaining detections manually.
Generated from the cited source records. This long-tail analysis has not been individually reviewed by a named human.
Potential ATT&CK relevance
Conservative CVE-to-ATT&CK context
These mappings and lookup hints may be relevant to the vulnerability behavior, CWE, affected product, or exposure path. Glexia-inferred context is not an official MITRE, ATT&CK, CWE, or CVE Program mapping.
ATT&CK lookup starting points
Use these exact CWE pages and searches to review the Glexia ATT&CK library from this CVE's weakness and description context.
description · low confidence lookup
Privilege behavior lookup
The CVE wording references privilege impact, so privilege escalation and authorization behavior review may help. This is a Glexia inferred lookup path, not an official MITRE, ATT&CK, or CVE Program mapping.
These fields come from the CVE record and ADP containers, not from Glexia's Take. They preserve time-varying source decisions such as CISA SSVC, KEV status, CVSS metrics, and provider references.
1CVSS vectors
3Timeline events
2ADP providers
13Source links
CVSS vector scores
1 official score
We collect every scored CVSS vector available in the official CNA and ADP containers. When more than one version is present, the table keeps the source vectors side by side instead of collapsing them into the highest score.