CVE-2025-21702
pfifo_tail_enqueue:当 sch->limit == 0 时丢弃新数据包
- 已发布
- 2025年2月18日
- 已更新
- 2026年9月8日
- 分配 CNA
- Linux
- 观察到的证据
- 2026年8月14日
初级CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H低 · 未来 30 天
- 百分位
- 19.8%
- 型号日期
- 2026年9月21日
EPSS 是统计估计,而不是确定性或影响衡量标准。将其与 CVSS、KEV 状态、暴露程度和您的环境相结合。
总结
在 Linux 内核中,已解决以下漏洞:pfifo_tail_enqueue:当 sch->limit == 0 时丢弃新数据包 预期行为:当达到调度器的限制时,pfifo_tail_enqueue() 会丢弃调度器队列中的一个数据包,并将调度器的 qlen 减一。然后,pfifo_tail_enqueue() 将新数据包入队,并将调度器的 qlen 加一。最后,pfifo_tail_enqueue() 返回 `NET_XMIT_CN` 状态码。 异常行为:当我们设置 `sch->limit == 0` 并在一个没有数据包的调度器上触发 pfifo_tail_enqueue() 时,“丢弃一个数据包”这一步不会执行任何操作。这意味着调度器的 qlen 仍然等于 0。然后,我们继续将新数据包入队,并将调度器的 qlen 加一。总之,我们可以利用 pfifo_tail_enqueue() 将 qlen 加一,并返回 `NET_XMIT_CN` 状态码。 问题在于:假设我们有两个 qdisc:Qdisc_A 和 Qdisc_B。 - Qdisc_A 的类型必须具有 '->graft()' 函数来创建父/子关系。假设 Qdisc_A 的类型为 `hfsc`。向此 qdisc 入队数据包将触发 `hfsc_enqueue`。 - Qdisc_B 的类型为 pfifo_head_drop。向此 qdisc 入队数据包将触发 `pfifo_tail_enqueue`。 - Qdisc_B 被配置为 `sch->limit == 0`。 - Qdisc_A 被配置为将入队的数据包路由到 Qdisc_B。 通过 Qdisc_A 入队数据包将导致: - hfsc_enqueue(Qdisc_A) -> pfifo_tail_enqueue(Qdisc_B) - Qdisc_B->q.qlen += 1 - pfifo_tail_enqueue() 返回 `NET_XMIT_CN` - hfsc_enqueue() 检查 `NET_XMIT_SUCCESS` 并看到 `NET_XMIT_CN` => hfsc_enqueue() 不会增加 Qdisc_A 的 qlen。 整个过程导致 Qdisc_A->q.qlen == 0 且 Qdisc_B->q.qlen == 1 的情况。将 'hfsc' 替换为其他类型(例如:'drr')仍会导致相同的问题。这违反了父级 qlen 应等于其所有子级 qlen 之和的设计。 漏洞影响:当该问题可被触及时,可用于用户到内核的权限提升。
来源
1Linux 内核 CVE 漏洞利用分析报告及相关调试环境。你不再需要编译 Linux 内核和配置你的环境了。
负责任的使用
仅在您拥有或有权测试的系统上使用漏洞信息。 Kitploit 链接到公共研究元数据,并且不存储漏洞代码或恶意负载。