CVE-2026-98629
En el kernel de Linux se ha resuelto la siguiente vulnerabilidad:
net/sched: cls_u32: corrige el aliasing del IDR de los identificadores de las tablas hash manuales
Una tabla hash u32 creada con un identificador explícito ('tc filter add ... handle 801: u32 divisor N') indexa su entrada del IDR por el identificador sin procesar, mientras que las rutas de destrucción la liberan usando handle2id(handle). Los dos espacios de claves no coinciden para los identificadores del rango htid 0x800..0xFFF: handle2id() los vuelve a integrar en el espacio de identificadores asignados automáticamente (1..0x7FF).
Leer descripción completaMostrar menos
Por tanto, una tabla manual deja su entrada del IDR, indexada con el valor sin procesar, inaccesible al eliminarla (una fuga permanente), y su eliminación puede borrar la entrada del idr de una tabla automática activa no relacionada. Una asignación automática posterior puede entonces devolver un identificador que se solapa con la tabla manual activa; u32_lookup_ht() (primera coincidencia) dirige las búsquedas y TCA_U32_LINK para ese htid a la tabla equivocada.
La asignación de la ruta del divisor usa ahora handle2id(handle), de modo que la asignación y la eliminación comparten un mismo espacio de claves. Un identificador manual que se corresponde con un id ya en uso se rechaza con -ENOSPC, y la asignación automática omite los ids retenidos por tablas manuales activas.
También probado con un PoC con una tabla u32 activa en el bloque, añadiendo y eliminando dos veces una tabla manual 'handle 901: u32 divisor 1'; sin parchear, la segunda adición falla con -ENOSPC porque la clave sin procesar se filtró en la primera eliminación.
Detalles técnicos trazas, registros y código del informe original
Condiciones para reproducirlo:
ip link add test0 type dummy
tc qdisc add dev test0 clsact
tc filter add dev test0 ingress protocol ip pref 1 \
handle 801: u32 divisor 16
tc filter add dev test0 ingress protocol ip pref 2 u32 divisor 16
tc -d filter show dev test0 ingress | grep 'fh 801:'
# sin parchear: dos tablas activas con identificador 0x80100000 (el hnode raíz de pref 2
# recibe el id 1 asignado automáticamente); parcheado: el hnode automático recibe el id 2.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
- 10
- Fecha de la puntuación
- 20/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 6 referencias
- https://git.kernel.org/stable/c/0a5f5d9e94dead312d32c366b917c64e552b72f7
- https://git.kernel.org/stable/c/0fac292d93fdb313099e98cce928b3a524c92c94
- https://git.kernel.org/stable/c/21fc07924e996e1e661268ca269c86b8d59d25b3
- https://git.kernel.org/stable/c/2f898f9ec7c73c5697ee462681e7ea6984ee1f3d
- https://git.kernel.org/stable/c/54a454c5e41f5e2cb70c8163140ce095c5d5eefd
- https://git.kernel.org/stable/c/f6696481eedfd5752b4b56eed715d0b0fe48b9c5
JSON original (NVD)
Mostrar
{
"id": "CVE-2026-98629",
"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": "9b2c3184e126b941dfa716b8128ed6db92a64e2f",
"lessThan": "21fc07924e996e1e661268ca269c86b8d59d25b3",
"versionType": "git"
},
{
"status": "affected",
"version": "789f9963bd031c3a185605665b744912df8e7eda",
"lessThan": "0fac292d93fdb313099e98cce928b3a524c92c94",
"versionType": "git"
},
{
"status": "affected",
"version": "73af53d82076bbe184d9ece9e14b0dc8599e6055",
"lessThan": "54a454c5e41f5e2cb70c8163140ce095c5d5eefd",
"versionType": "git"
},
{
"status": "affected",
"version": "73af53d82076bbe184d9ece9e14b0dc8599e6055",
"lessThan": "f6696481eedfd5752b4b56eed715d0b0fe48b9c5",
"versionType": "git"
},
{
"status": "affected",
"version": "73af53d82076bbe184d9ece9e14b0dc8599e6055",
"lessThan": "2f898f9ec7c73c5697ee462681e7ea6984ee1f3d",
"versionType": "git"
},
{
"status": "affected",
"version": "73af53d82076bbe184d9ece9e14b0dc8599e6055",
"lessThan": "0a5f5d9e94dead312d32c366b917c64e552b72f7",
"versionType": "git"
},
{
"status": "affected",
"version": "4403f9293ce9ecc2a55c688d84ee37e3ba0fc1a8",
"versionType": "git"
},
{
"status": "affected",
"version": "6.1.119",
"lessThan": "6.1.189",
"versionType": "semver"
},
{
"status": "affected",
"version": "6.6.63",
"lessThan": "6.6.158",
"versionType": "semver"
},
{
"status": "affected",
"version": "6.11.10",
"lessThan": "6.12",
"versionType": "semver"
}
],
"programFiles": [
"net/sched/cls_u32.c"
],
"defaultStatus": "unaffected"
},
{
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"product": "Linux",
"versions": [
{
"status": "affected",
"version": "6.12"
},
{
"status": "unaffected",
"version": "0",
"lessThan": "6.12",
"versionType": "semver"
},
{
"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/cls_u32.c"
],
"defaultStatus": "affected"
}
]
}
],
"published": "2026-10-18T16:17:15.960",
"references": [
{
"url": "https://git.kernel.org/stable/c/0a5f5d9e94dead312d32c366b917c64e552b72f7",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/0fac292d93fdb313099e98cce928b3a524c92c94",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/21fc07924e996e1e661268ca269c86b8d59d25b3",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/2f898f9ec7c73c5697ee462681e7ea6984ee1f3d",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/54a454c5e41f5e2cb70c8163140ce095c5d5eefd",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/f6696481eedfd5752b4b56eed715d0b0fe48b9c5",
"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: cls_u32: fix manual hash table handle IDR aliasing\n\nA u32 hash table created with an explicit handle ('tc filter add ...\nhandle 801: u32 divisor N') keys its IDR entry on the raw handle, while\nthe destroy paths free it under handle2id(handle). The two key domains\ndisagree for handles in the 0x800..0xFFF htid range:\nhandle2id() folds them back into the auto-allocated id space (1..0x7FF).\n\nA manual table therefore leaves its raw-keyed IDR entry unreachable on\ndelete (a permanent leak), and its delete can drop the idr entry of an\nunrelated live auto table. A later auto allocation can then hand out a\nhandle that aliases the live manual table; u32_lookup_ht() first-match\nroutes lookups and TCA_U32_LINK for that htid to the wrong table.\n\nKey the divisor-path alloc on handle2id(handle) so allocation and\nremoval share one key domain. A manual handle that maps onto an id\nalready in use is rejected with -ENOSPC, and auto allocation skips ids\nheld by live manual tables.\n\nConditions to recreate:\n ip link add test0 type dummy\n tc qdisc add dev test0 clsact\n tc filter add dev test0 ingress protocol ip pref 1 \\\n handle 801: u32 divisor 16\n tc filter add dev test0 ingress protocol ip pref 2 u32 divisor 16\n tc -d filter show dev test0 ingress | grep 'fh 801:'\n # unpatched: two live tables with handle 0x80100000 (the pref 2 root\n # hnode is auto-allocated id 1); patched: the auto hnode takes id 2.\n\nAlso tested with a poc with a live u32 table on the block, add/delete a manual\ntable 'handle 901: u32 divisor 1' twice; unpatched, the re-add fails with\n-ENOSPC because the raw key leaked on the first delete."
}
],
"lastModified": "2026-10-19T10:19:27.130",
"sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}