CVE-2026-98610
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
net/sched: sch_hfsc: acotar el recorrido interno de clasificación de filtros con un presupuesto de desviación
hfsc_classify() aplica la comprobación de nivel "el filtro solo puede apuntar hacia abajo" únicamente cuando el resultado del filtro no lleva una clase asociada. Un filtro creado con un flowid recibe res.class una sola vez en el momento del enlace, por lo que la comprobación nunca se ejecuta para él durante la clasificación. hfsc_adjust_levels() puede aumentar más tarde el nivel de una clase sin revalidar los enlaces existentes, lo que deja dos enlaces que eran válidos en el momento del enlace apuntando el uno al otro; el recorrido de clasificación rebota entonces indefinidamente entre dos clases interiores con el bloqueo de la cola (qdisc) retenido y las interrupciones de software (BH) deshabilitadas, produciendo un soft lockup a partir de un único paquete. El recorrido bloqueado activa el watchdog:
Leer descripción completaMostrar menos
Se acota el recorrido con un presupuesto de saltos no descendentes, que es la única forma en que un recorrido configurado puede avanzar sin descender por el árbol de clases una vez que los niveles se desvían tras el momento del enlace. El presupuesto es acumulativo para todo el recorrido y deliberadamente no se restablece en un salto descendente: una cadena que alterna un descenso con un salto lateral recuperaría el presupuesto en cada vuelta y nunca se activaría. Los saltos descendentes nunca lo decrementan, por lo que los árboles legítimamente profundos no se ven afectados y una cadena lateral que termina se clasifica con normalidad. Una vez agotado el presupuesto, se descarta el paquete con una advertencia limitada en frecuencia, en línea con la corrección ya integrada para HTB.
Esta corrección es una continuación del commit 729c4896ab82 ("net/sched: sch_htb: limit htb_classify inner-class filter hops"), que acotó el mismo bucle de clasificación en el lado de HTB, pero dejó el recorrido de HFSC sin límite.
Condiciones para reproducir el fallo: - CONFIG_NET_SCHED, CONFIG_NET_SCH_HFSC, CONFIG_NET_CLS_U32, CONFIG_LOCKUP_DETECTOR. - Construir un ciclo con dos enlaces con flowid válidos en el momento del enlace y una desviación de nivel: clase X 1:1 (hija de la raíz) con hija hoja 1:10; clase Y 1:2 (hermana de X) con hijas 1:20 y 1:200; filtro u32 en la raíz con flowid 1:1; filtro en X con flowid 1:2 (válido mientras Y es una hoja); tras subir el nivel de Y a 2, filtro en Y con flowid 1:1 (válido en ese momento). Enviar un paquete (ping por el dispositivo). Kernel sin corregir: la clasificación gira con el bloqueo de la cola retenido; con softlockup_panic=1 provoca un pánico. - Accesible para un usuario sin privilegios mediante unshare -Urn (CAP_NET_ADMIN).
Detalles técnicos trazas, registros y código del informe original
watchdog: BUG: soft lockup - CPU#3 stuck for 13s! [ping:444] RIP: 0010:u32_classify+0x542/0x17f0 ... tcf_classify+0x66/0xa0 hfsc_enqueue+0x166/0xdf0
Traducción automática del texto original de NVD (en inglés).
CVSS
NVD no ha asignado puntuación CVSS a esta CVE (habitual desde el cambio de política de abril de 2026).
Probabilidad de explotación (EPSS)
- Probabilidad de explotación en los próximos 30 días
- 0.21 %
- Percentil entre todas las CVEs puntuadas
- 11
- Fecha de la puntuación
- 19/10/2026
EPSS (Exploit Prediction Scoring System, de FIRST) estima la probabilidad de que una vulnerabilidad sea explotada en 30 días. Complementa a CVSS (impacto) y a CISA KEV (explotación confirmada).
Tecnologías afectadas (1)
⚠ Inferidas por IA a partir de la descripción — NVD aún no ha analizado esta CVE; no son CPE verificados.
Referencias
Mostrar las 8 referencias
- https://git.kernel.org/stable/c/0fa25ba50a382d79c0cf060214c2095756836f5f
- https://git.kernel.org/stable/c/1301a1292c6742b4c96a18715d49f89c3caca0d7
- https://git.kernel.org/stable/c/2bd20245dd658789d8cccb37697967b4caba6ad8
- https://git.kernel.org/stable/c/30d7fea767e830bd81ac2f73d2e33c877cb2e679
- https://git.kernel.org/stable/c/8a60ade2277e1f0e0d0578d565354e52292fa46d
- https://git.kernel.org/stable/c/d4fd251e3311727c32af89344d3332f788c153a2
- https://git.kernel.org/stable/c/e8f9979286f70dfbfe0552e2a63000950841bea6
- https://git.kernel.org/stable/c/f476fb656ca2326d7b2eba98d03ced1cbcf5cd99
JSON original (NVD)
Mostrar
{
"id": "CVE-2026-98610",
"cveTags": [],
"metrics": {},
"affected": [
{
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"affectedData": [
{
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"product": "Linux",
"versions": [
{
"status": "affected",
"version": "a2f79227138c71e08627af5f8961197364edbc98",
"lessThan": "d4fd251e3311727c32af89344d3332f788c153a2",
"versionType": "git"
},
{
"status": "affected",
"version": "a2f79227138c71e08627af5f8961197364edbc98",
"lessThan": "30d7fea767e830bd81ac2f73d2e33c877cb2e679",
"versionType": "git"
},
{
"status": "affected",
"version": "a2f79227138c71e08627af5f8961197364edbc98",
"lessThan": "f476fb656ca2326d7b2eba98d03ced1cbcf5cd99",
"versionType": "git"
},
{
"status": "affected",
"version": "a2f79227138c71e08627af5f8961197364edbc98",
"lessThan": "e8f9979286f70dfbfe0552e2a63000950841bea6",
"versionType": "git"
},
{
"status": "affected",
"version": "a2f79227138c71e08627af5f8961197364edbc98",
"lessThan": "2bd20245dd658789d8cccb37697967b4caba6ad8",
"versionType": "git"
},
{
"status": "affected",
"version": "a2f79227138c71e08627af5f8961197364edbc98",
"lessThan": "0fa25ba50a382d79c0cf060214c2095756836f5f",
"versionType": "git"
},
{
"status": "affected",
"version": "a2f79227138c71e08627af5f8961197364edbc98",
"lessThan": "1301a1292c6742b4c96a18715d49f89c3caca0d7",
"versionType": "git"
},
{
"status": "affected",
"version": "a2f79227138c71e08627af5f8961197364edbc98",
"lessThan": "8a60ade2277e1f0e0d0578d565354e52292fa46d",
"versionType": "git"
}
],
"programFiles": [
"net/sched/sch_hfsc.c"
],
"defaultStatus": "unaffected"
},
{
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"product": "Linux",
"versions": [
{
"status": "affected",
"version": "2.6.35"
},
{
"status": "unaffected",
"version": "0",
"lessThan": "2.6.35",
"versionType": "semver"
},
{
"status": "unaffected",
"version": "5.10.271",
"versionType": "semver",
"lessThanOrEqual": "5.10.*"
},
{
"status": "unaffected",
"version": "5.15.222",
"versionType": "semver",
"lessThanOrEqual": "5.15.*"
},
{
"status": "unaffected",
"version": "6.1.189",
"versionType": "semver",
"lessThanOrEqual": "6.1.*"
},
{
"status": "unaffected",
"version": "6.6.158",
"versionType": "semver",
"lessThanOrEqual": "6.6.*"
},
{
"status": "unaffected",
"version": "6.12.112",
"versionType": "semver",
"lessThanOrEqual": "6.12.*"
},
{
"status": "unaffected",
"version": "6.18.55",
"versionType": "semver",
"lessThanOrEqual": "6.18.*"
},
{
"status": "unaffected",
"version": "7.2.9",
"versionType": "semver",
"lessThanOrEqual": "7.2.*"
},
{
"status": "unaffected",
"version": "7.3",
"versionType": "original_commit_for_fix",
"lessThanOrEqual": "*"
}
],
"programFiles": [
"net/sched/sch_hfsc.c"
],
"defaultStatus": "affected"
}
]
}
],
"published": "2026-10-18T16:17:13.793",
"references": [
{
"url": "https://git.kernel.org/stable/c/0fa25ba50a382d79c0cf060214c2095756836f5f",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/1301a1292c6742b4c96a18715d49f89c3caca0d7",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/2bd20245dd658789d8cccb37697967b4caba6ad8",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/30d7fea767e830bd81ac2f73d2e33c877cb2e679",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/8a60ade2277e1f0e0d0578d565354e52292fa46d",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/d4fd251e3311727c32af89344d3332f788c153a2",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/e8f9979286f70dfbfe0552e2a63000950841bea6",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/f476fb656ca2326d7b2eba98d03ced1cbcf5cd99",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}
],
"vulnStatus": "Received",
"descriptions": [
{
"lang": "en",
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\nnet/sched: sch_hfsc: bound the classify inner-filter walk with a drift budget\n\nhfsc_classify() applies the \"filter may only point downwards\" level check\nonly when the filter result carries no bound class. A filter created with\na flowid gets res.class set once at bind time, so the check never runs for\nit during classification. hfsc_adjust_levels() can later raise a class's\nlevel without revalidating existing bindings, leaving two binds that were\neach legal at bind time pointing at each other; the classify walk then\nbounces between two interior classes forever with the qdisc lock held and\nBH disabled — a soft lockup from a single packet. The stuck walk trips\nthe watchdog:\n\n watchdog: BUG: soft lockup - CPU#3 stuck for 13s! [ping:444]\n RIP: 0010:u32_classify+0x542/0x17f0\n ...\n tcf_classify+0x66/0xa0\n hfsc_enqueue+0x166/0xdf0\n\nBound the traversal with a budget of non-descending hops, the only way a\nconfigured walk can move without descending the class tree once levels\ndrift after bind time. The budget is cumulative over the whole walk and\nis deliberately not reset on a descending hop: a chain that alternates a\ndescent with a lateral hop would return the budget every lap and never\ntrip. Descending hops never decrement it, so legitimately deep trees are\nunaffected and a terminating lateral chain still classifies normally.\nDrop the packet with a rate-limited warning once the budget is exhausted,\nmirroring the merged HTB fix.\n\nThis is a follow-up to commit 729c4896ab82 (\"net/sched: sch_htb: limit\nhtb_classify inner-class filter hops\"), which bounded the same classify\nloop on the HTB side but left the HFSC walk unbounded.\n\nConditions to recreate the bug:\n- CONFIG_NET_SCHED, CONFIG_NET_SCH_HFSC, CONFIG_NET_CLS_U32,\n CONFIG_LOCKUP_DETECTOR.\n- Build a cycle with two legal-at-bind-time flowid binds and a level\n drift: class X 1:1 (child of root) with leaf child 1:10; class Y 1:2\n (sibling of X) with children 1:20 and 1:200; root u32 filter flowid\n 1:1; filter on X flowid 1:2 (legal when Y is a leaf); after Y's level\n rises to 2, filter on Y flowid 1:1 (legal then). Send one packet (ping\n on the device). Unfixed kernel: classify spins with the qdisc lock\n held; with softlockup_panic=1 it panics.\n- Reachable from unprivileged user via unshare -Urn (CAP_NET_ADMIN)."
}
],
"lastModified": "2026-10-19T10:19:23.103",
"sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}