CVE-2025-21702

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.
Configurations

Configuration 1 (hide)

OR cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc1:*:*:*:*:*:*

History

16 Oct 2025, 13:58

Type Values Removed Values Added
CVSS v2 : unknown
v3 : unknown
v2 : unknown
v3 : 7.0
CWE NVD-CWE-noinfo
CPE cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc1:*:*:*:*:*:*
First Time Linux
Linux linux Kernel
References () https://git.kernel.org/stable/c/020ecb76812a0526f4130ab5aeb6dc7c773e7ab9 - () https://git.kernel.org/stable/c/020ecb76812a0526f4130ab5aeb6dc7c773e7ab9 - Patch
References () https://git.kernel.org/stable/c/647cef20e649c576dff271e018d5d15d998b629d - () https://git.kernel.org/stable/c/647cef20e649c576dff271e018d5d15d998b629d - Patch
References () https://git.kernel.org/stable/c/78285b53266d6d51fa4ff504a23df03852eba84e - () https://git.kernel.org/stable/c/78285b53266d6d51fa4ff504a23df03852eba84e - Patch
References () https://git.kernel.org/stable/c/79a955ea4a2e5ddf4a36328959de0de496419888 - () https://git.kernel.org/stable/c/79a955ea4a2e5ddf4a36328959de0de496419888 - Patch
References () https://git.kernel.org/stable/c/7a9723ec27aff5674f1fd4934608937f1d650980 - () https://git.kernel.org/stable/c/7a9723ec27aff5674f1fd4934608937f1d650980 - Patch
References () https://git.kernel.org/stable/c/a56a6e8589a9b98d8171611fbcc1e45a15fd2455 - () https://git.kernel.org/stable/c/a56a6e8589a9b98d8171611fbcc1e45a15fd2455 - Patch
References () https://git.kernel.org/stable/c/b6a079c3b6f95378f26e2aeda520cb3176f7067b - () https://git.kernel.org/stable/c/b6a079c3b6f95378f26e2aeda520cb3176f7067b - Patch
References () https://git.kernel.org/stable/c/e40cb34b7f247fe2e366fd192700d1b4f38196ca - () https://git.kernel.org/stable/c/e40cb34b7f247fe2e366fd192700d1b4f38196ca - Patch

13 Mar 2025, 13:15

Type Values Removed Values Added
References
  • () https://git.kernel.org/stable/c/78285b53266d6d51fa4ff504a23df03852eba84e -
  • () https://git.kernel.org/stable/c/79a955ea4a2e5ddf4a36328959de0de496419888 -
  • () https://git.kernel.org/stable/c/7a9723ec27aff5674f1fd4934608937f1d650980 -
  • () https://git.kernel.org/stable/c/a56a6e8589a9b98d8171611fbcc1e45a15fd2455 -

07 Mar 2025, 18:15

Type Values Removed Values Added
References
  • () https://git.kernel.org/stable/c/020ecb76812a0526f4130ab5aeb6dc7c773e7ab9 -
Summary
  • (es) En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: pfifo_tail_enqueue: Descartar nuevo paquete cuando sch->limit == 0 Comportamiento esperado: En caso de que alcancemos el límite del planificador, pfifo_tail_enqueue() descartará un paquete en la cola del planificador y disminuirá el qlen del planificador en uno. Luego, pfifo_tail_enqueue() pone en cola un nuevo paquete y aumenta el qlen del planificador en uno. Finalmente, pfifo_tail_enqueue() devuelve el código de estado `NET_XMIT_CN`. Comportamiento extraño: En caso de que establezcamos `sch->limit == 0` y activemos pfifo_tail_enqueue() en un planificador que no tiene ningún paquete, el paso 'descartar un paquete' no hará nada. Esto significa que el qlen del planificador todavía tiene un valor igual a 0. Luego, continuamos poniendo en cola un nuevo paquete y aumentamos el qlen del planificador en uno. En resumen, podemos aprovechar pfifo_tail_enqueue() para aumentar qlen en uno y devolver el código de estado `NET_XMIT_CN`. El problema es: digamos que tenemos dos qdiscs: Qdisc_A y Qdisc_B. - El tipo de Qdisc_A debe tener la función '->graft()' para crear una relación padre/hijo. Digamos que el tipo de Qdisc_A es `hfsc`. Poner en cola un paquete en esta qdisc activará `hfsc_enqueue`. - El tipo de Qdisc_B es pfifo_head_drop. Poner en cola un paquete en esta qdisc activará `pfifo_tail_enqueue`. - Qdisc_B está configurado para tener `sch->limit == 0`. - Qdisc_A está configurado para enrutar el paquete en cola a Qdisc_B. Poner en cola un paquete a través de Qdisc_A conducirá a: - hfsc_enqueue(Qdisc_A) -> pfifo_tail_enqueue(Qdisc_B) - Qdisc_B->q.qlen += 1 - pfifo_tail_enqueue() devuelve `NET_XMIT_CN` - hfsc_enqueue() comprueba `NET_XMIT_SUCCESS` y ve `NET_XMIT_CN` => hfsc_enqueue() no aumenta el qlen de Qdisc_A. Todo el proceso conduce a una situación en la que Qdisc_A->q.qlen == 0 y Qdisc_B->q.qlen == 1. Reemplazar 'hfsc' por otro tipo (por ejemplo: 'drr') sigue conduciendo al mismo problema. Esto viola el diseño donde el qlen del padre debe ser igual a la suma del qlen de sus hijos. Impacto del error: este problema se puede utilizar para la escalada de privilegios de usuario a kernel cuando sea posible.

18 Feb 2025, 15:15

Type Values Removed Values Added
New CVE

Information

Published : 2025-02-18 15:15

Updated : 2025-10-16 13:58


NVD link : CVE-2025-21702

Mitre link : CVE-2025-21702

CVE.ORG link : CVE-2025-21702


JSON object : View

Products Affected

linux

  • linux_kernel