CVE-2026-98811
En el kernel de Linux se ha resuelto la siguiente vulnerabilidad:
net/sched: cls_api: recuperar un proto vacío en la ruta de error
Dos solicitudes concurrentes de adición de filtros tc sobre la misma cadena/prioridad de un clasificador sin bloqueo ejecutan ambas change() sobre el proto compartido, y ambas pueden fallar: el intento de tcf_chain_tp_delete_empty() de la ganadora no prospera porque el handle de la perdedora sigue en el idr, y la ruta de error de la perdedora solo libera su propia referencia sin un segundo intento de recuperación. El proto vacío permanece enlazado en la cadena, reteniendo la referencia de la cadena, una referencia al bloque y la referencia al módulo del clasificador hasta que la cadena o el bloque se desmantelan.
Leer descripción completaMostrar menos
Recuperar el proto en la ruta de error de cualquier solicitud fallida que mantenga una referencia al proto. La recuperación está condicionada a que el proto esté vacío: tcf_chain_tp_delete_empty() desenlaza el proto solo cuando delete_empty() confirma que está vacío, por lo que nunca se desenlaza un proto compartido en uso. Un proto creado por la propia solicitud se recupera incondicionalmente, ya que es su único propietario, por lo que marcarlo para su eliminación es seguro incluso sin un callback delete_empty. Los clasificadores sin dicho callback (la comprobación lo marca incondicionalmente) están serializados por rtnl, por lo que la ventana de carrera que esta protección cierra no puede darse en ellos.
Este cambio es una continuación del commit d4e359b3608a ("net/sched: cls_api: fix teardown of an adopted proto on insert-race loss"), que impedía que la perdedora de la carrera de inserción desenlazara el proto activo de la ganadora, pero dejaba el residuo de proto vacío en su lugar.
Condiciones para reproducir: - CONFIG_NET_CLS_FLOWER=y; par veth - tc qdisc add dev veth0 ingress - dos ejecuciones concurrentes de `tc filter add dev veth0 ingress protocol ip pref 1 flower skip_sw ... action drop` (ambas fallan en fl_hw_replace_filter tras publicar su handle en el idr); repetir en un bucle - un proto vacío de flower permanece enlazado tras fallar ambas solicitudes; se observa como una cabecera sola `filter protocol ip pref 1 flower chain 0` en `tc filter show`, sin entradas de filtro - CAP_NET_ADMIN (dentro del espacio de nombres basta con unshare -Urn)
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.17 %
- Percentil entre todas las CVEs puntuadas
- 6
- 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 4 referencias
JSON original (NVD)
Mostrar
{
"id": "CVE-2026-98811",
"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": "8b64678e0af8f4d62a40149baedebe78503a5255",
"lessThan": "315e4fe65cf02ef052de5e6298c3088e448b7517",
"versionType": "git"
},
{
"status": "affected",
"version": "8b64678e0af8f4d62a40149baedebe78503a5255",
"lessThan": "ebc9611ab154c0cd9f1320e2a73f5e936d7535a9",
"versionType": "git"
},
{
"status": "affected",
"version": "8b64678e0af8f4d62a40149baedebe78503a5255",
"lessThan": "570141625d212fbbcffb9665cb45c0f04610e61a",
"versionType": "git"
},
{
"status": "affected",
"version": "8b64678e0af8f4d62a40149baedebe78503a5255",
"lessThan": "0bb8eab29b55045281a4963d4557f2776cdf8cfa",
"versionType": "git"
}
],
"programFiles": [
"net/sched/cls_api.c"
],
"defaultStatus": "unaffected"
},
{
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"product": "Linux",
"versions": [
{
"status": "affected",
"version": "5.1"
},
{
"status": "unaffected",
"version": "0",
"lessThan": "5.1",
"versionType": "semver"
},
{
"status": "unaffected",
"version": "6.12.113",
"versionType": "semver",
"lessThanOrEqual": "6.12.*"
},
{
"status": "unaffected",
"version": "6.18.56",
"versionType": "semver",
"lessThanOrEqual": "6.18.*"
},
{
"status": "unaffected",
"version": "7.2.10",
"versionType": "semver",
"lessThanOrEqual": "7.2.*"
},
{
"status": "unaffected",
"version": "7.3",
"versionType": "original_commit_for_fix",
"lessThanOrEqual": "*"
}
],
"programFiles": [
"net/sched/cls_api.c"
],
"defaultStatus": "affected"
}
]
}
],
"published": "2026-10-18T16:17:35.200",
"references": [
{
"url": "https://git.kernel.org/stable/c/0bb8eab29b55045281a4963d4557f2776cdf8cfa",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/315e4fe65cf02ef052de5e6298c3088e448b7517",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/570141625d212fbbcffb9665cb45c0f04610e61a",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/ebc9611ab154c0cd9f1320e2a73f5e936d7535a9",
"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_api: reclaim an empty proto on the error path\n\nTwo racing tc filter add requests on the same chain/prio of an\nunlocked classifier both run change() on the shared proto and both\ncan fail: the winner's tcf_chain_tp_delete_empty() attempt gives up\nbecause the loser's handle is still in the idr, and the loser's\nerror path drops only its own reference without a second reclamation\nattempt. The empty proto stays linked in the chain, holding the\nchain reference, a block reference and the classifier module\nreference until the chain or block is torn down.\n\nReclaim the proto on the error path of any failed request that holds\na proto reference. The reclamation is emptiness-gated:\ntcf_chain_tp_delete_empty() unlinks the proto only when\ndelete_empty() admits it is empty, so a live shared proto is never\nunlinked. A proto the request created is reclaimed unconditionally -\nit is the only owner, so marking it for deletion is safe even without\na delete_empty callback. Classifiers without one (the check marks the\nproto unconditionally) are rtnl-serialized, so the raced window this\nguard closes cannot arise for them.\n\nThis is a follow-up to commit d4e359b3608a (\"net/sched: cls_api: fix\nteardown of an adopted proto on insert-race loss\"), which stopped the\nloser of the insert race from unlinking the winner's live proto but\nleft the empty-proto residual in place.\n\nConditions to recreate:\n- CONFIG_NET_CLS_FLOWER=y; veth pair\n- tc qdisc add dev veth0 ingress\n- two concurrent `tc filter add dev veth0 ingress protocol ip pref 1\n flower skip_sw ... action drop` (both fail in fl_hw_replace_filter\n after publishing their handle in the idr); repeat in a loop\n- an empty flower tp stays linked after both requests fail; visible\n as a bare `filter protocol ip pref 1 flower chain 0` header in\n `tc filter show` with no filter entries\n- CAP_NET_ADMIN (namespace-local via unshare -Urn suffices)"
}
],
"lastModified": "2026-10-19T10:19:45.123",
"sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}