CVE-2026-98797 in Linuxinformación

Resumen

por VulDB • 2026-10-19

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:

net: limitar skb->queue_mapping cuando se selecciona la cola de transmisión (tx queue)

skbedit puede establecer skb->queue_mapping y activar la bandera por-CPU skip_txqueue para que __dev_queue_xmit() respete el mapeo. Sin embargo, __dev_queue_xmit() limpiaba esta bandera antes de sch_handle_egress() y solo la leía después, por lo que la bandera no se confinaba a la transmisión (xmit) que la activó: una transmisión anidada (redirección mirred o espejo mirror, o un drop tras skbedit) podría establecer la bandera y la transmisión externa consumiría esa bandera para un skb que nunca pasó por skbedit.

Un paquete reenviado aún lleva el rx_queue + 1 de la NIC de entrada en skb->queue_mapping; por lo tanto, el dispositivo externo indexa su estado de cola tx con ese valor obsoleto. El array hijo q->qdiscs[] de Taprio está dimensionado según el número de colas del dispositivo, por lo que taprio_enqueue() accede más allá de su asignación y desreferencia el resultado como un struct Qdisc *.

Nosotros (ab)usamos skb->nf_skip_egress, que significa "omitir netfilter egress para este paquete", para marcar "¿estoy en tc egress?". A pesar de la sobrecarga, no lo veo como un conflicto ya que el marcador se establece solo alrededor de la única llamada a sch_handle_egress() y la ruta de ingress está protegida por tc_at_ingress. Enviaré un parche de seguimiento (net-next) una vez que esto llegue a net-next para renombrar el bit/flag skb->nf_skip_egress como skb->skip_egress.

Armar la bandera solo desde el clasificador egress que puede usarla: activar skip_txqueue desde tcf_skbedit_act() únicamente cuando se ejecuta dentro de sch_handle_egress(), gracias a skb->nf_skip_egress. Un clasificador qdisc egress se ejecuta en q->enqueue(), después de que la cola tx ha sido seleccionada, por lo que un mapeo que establezca no puede afectar al paquete actual; activar la bandera allí solo la contamina para una transmisión (xmit) posterior. Luego, asumir el control de la bandera para el marco xmit donde se ejecuta el hook egress: guardar el valor entrante y limpiarlo justo antes de sch_handle_egress(), y restaurarlo después del hook - en la ruta consumida (drop), o, en la misma llamada que lo lee, en la ruta superviviente. El guardado y las restauraciones permanecen dentro de la rama estática egress_needed_key, por lo que un paquete solo paga el costo de estas operaciones cuando los hooks egress están activos (2f1e85b1aee4).

Almacenar el valor seleccionado por netdev_cap_txqueue() nuevamente en skb->queue_mapping en netdev_tx_queue_mapping(), tal como ya hace netdev_core_pick_tx(), para que la ruta skip_txqueue nunca entregue a un lector posterior en la ruta xmit un mapeo que el dispositivo no pueda servir. Una escritura realizada más tarde en el mismo marco, por un programa tc BPF adjunto a un qdisc de transmisión, está fuera de esta ruta y no se vuelve a limitar; un parche de seguimiento separado resolverá esa ruta.

netdev_xmit_skip_txqueue() devuelve el valor anterior de la bandera para que el guardado-y-limpieza sea una sola llamada, y se proporciona un stub sin operación (no-op) cuando CONFIG_NET_EGRESS está deshabilitado. skb->nf_skip_egress se compila bajo CONFIG_NET_EGRESS en lugar de CONFIG_NETFILTER_SKIP_EGRESS, por lo que skb_at_tc_egress() es válido siempre que la ruta egress esté construida.

Un usuario local en un namespace de red puede redirigir un paquete desde un dispositivo con más colas TX a uno con menos después de establecer un mapeo válido solo para el dispositivo más grande. Esto alcanza estas lecturas y, bajo KASAN, falla con "slab-out-of-bounds in taprio_enqueue".

Condiciones para recrear el bug: el activador del informe es un usuario local con CAP_NET_ADMIN en un namespace de red, por lo que no se necesita ningún programa eBPF. Con CONFIG_NET_SCH_TAPRIO=y, CONFIG_NET_ACT_SKBEDIT=y, CONFIG_NET_ACT_MIRRED=y, CONFIG_NET_CLS_MATCHALL=y, CONFIG_NET_SCH_PRIO=y y KASAN habilitado, crear qa (3 colas), qb (2 colas) y qc (1 cola) como dispositivos dummy; colocar un taprio root en qb (num_tc 1, queues 2@0) y clsact en los tres; luego añadir un filtro matchall egress en cada dispositivo. En qa: "action skbedit queue_mapping 2 pipe action mirred egress redirect dev qb". En qb: "action mirred egress mirror dev qc". En qc: "action skbedit queue_mapping 0 pipe". Enviar un paquete por qa. El skbedit de qc establece la bandera mientras el xmit externo de qb está en vuelo; sin la corrección, qb consume esa bandera y lee su array hijo taprio de dos entradas con el mapeo obsoleto del paquete reenviado. Un qc cuyo skb ---truncado---

Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.

Responsable

Linux

Reservar

2026-09-25

Divulgación

2026-10-18

Moderación

aceptado

Artículo

VDB-422037

EPSS

0.00000

KEV

no

Actividades

muy bajo

Fuentes

Interested in the pricing of exploits?

See the underground prices here!