CVE-2026-98613
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
bpf: Limitar la profundidad de propiedad a través de kptrs locales y raíces de grafo
Los objetos asignados por el programa pueden poseer otros objetos locales mediante kptrs referenciados. bpf_obj_free_fields() sigue esos punteros a través de __bpf_obj_drop_impl() de forma síncrona, antes de que el almacenamiento del objeto se libere mediante RCU. Un tipo de kptr local autorreferencial permite, por tanto, cadenas de objetos arbitrariamente profundas, y al soltar el nodo inicial se puede agotar la pila del kernel. Las cadenas de tipos largas y acíclicas presentan el mismo problema.
Leer descripción completaMostrar menos
btf_check_and_fixup_fields() sigue asumiendo que los kptrs referenciados solo apuntan a tipos del kernel y comprueba la propiedad únicamente a través de las raíces de listas y de árboles rb. Su regla actual es suficiente para los ciclos formados solo por grafos: el destino de cada arista del grafo debe contener un nodo, por lo que cada tipo de un ciclo tiene tanto una raíz como un nodo. La regla rechaza que dicho tipo sea propietario de otra raíz, lo que rompe todos los ciclos. Además, limita las cadenas formadas solo por grafos a tres tipos, o a dos si el primer tipo contiene un nodo, y rechaza de forma conservadora cadenas acíclicas más largas. El problema no es un ciclo solo de grafo no detectado, sino que faltan las aristas de kptrs locales; este fallo lo introdujo el soporte de bpf_kptr_xchg() para kptrs locales.
Se sustituye esa restricción por un único recorrido de propiedad acotado que abarca las raíces de grafo y los kptrs locales referenciados. Se ejecuta después de que todos los registros BTF hayan sido corregidos, rechaza los ciclos y las rutas más profundas que ocho tipos con registros, y almacena en caché la profundidad de sufijo de cada tipo al comprobarla frente al presupuesto restante. Esto también permite las disposiciones de grafo acíclicas y más largas, solo con grafos, que la regla antigua rechazaba; sus pruebas BTF existentes deben actualizarse en consecuencia.
La cota debe ser independiente de MAX_CALL_FRAMES, porque la destrucción recursiva puede ejecutarse por debajo de una cadena de llamadas BPF. Un objeto apuntado local simple sin metadatos de campos especiales añade únicamente una liberación final que no recursiona. Los kptrs no propietarios y los kptrs de BTF del kernel no recursionan a través de registros locales y quedan fuera del recorrido. Se incluyen también las aristas de kptrs percpu locales, aunque la asignación de objetos percpu con campos especiales esté actualmente prohibida, de modo que relajar esa restricción no pueda eludir la cota de propiedad.
btf_check_and_fixup_fields() sigue inicializando graph_root.value_rec, también para los registros de mapa asignados por separado. Las relaciones de propiedad pertenecen al BTF inmutable del programa y solo necesitan validarse en el momento de cargar el BTF.
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.18 %
- Percentil entre todas las CVEs puntuadas
- 7
- 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-98613",
"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": "b0966c724584a5a9fd7fb529de19807c31f27a45",
"lessThan": "92aa0502c781d72bb9685245c3280efb3766a110",
"versionType": "git"
},
{
"status": "affected",
"version": "b0966c724584a5a9fd7fb529de19807c31f27a45",
"lessThan": "9c11e543fec32e92b3aa3f693339ca3ee79ea9dd",
"versionType": "git"
},
{
"status": "affected",
"version": "b0966c724584a5a9fd7fb529de19807c31f27a45",
"lessThan": "4105870a4b8afe852aeb24a6dd58e1836cc4ce58",
"versionType": "git"
},
{
"status": "affected",
"version": "b0966c724584a5a9fd7fb529de19807c31f27a45",
"lessThan": "bfc888f04588f591851e95c974954cfca58e6c19",
"versionType": "git"
}
],
"programFiles": [
"kernel/bpf/btf.c",
"tools/testing/selftests/bpf/prog_tests/linked_list.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.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": [
"kernel/bpf/btf.c",
"tools/testing/selftests/bpf/prog_tests/linked_list.c"
],
"defaultStatus": "affected"
}
]
}
],
"published": "2026-10-18T16:17:14.150",
"references": [
{
"url": "https://git.kernel.org/stable/c/4105870a4b8afe852aeb24a6dd58e1836cc4ce58",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/92aa0502c781d72bb9685245c3280efb3766a110",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/9c11e543fec32e92b3aa3f693339ca3ee79ea9dd",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/bfc888f04588f591851e95c974954cfca58e6c19",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}
],
"vulnStatus": "Received",
"descriptions": [
{
"lang": "en",
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\nbpf: Bound ownership depth through local kptrs and graph roots\n\nProgram-allocated objects can own other local objects through referenced\nkptrs. bpf_obj_free_fields() follows those pointers through\n__bpf_obj_drop_impl() synchronously, before the object storage is freed\nthrough RCU. A self-referential local kptr type therefore permits arbitrarily\ndeep object chains, and dropping the head can exhaust the kernel stack.\nLong acyclic type chains have the same problem.\n\nbtf_check_and_fixup_fields() still assumes referenced kptrs only point to\nkernel types and checks ownership through list and rbtree roots only. Its\nexisting rule is sufficient for graph-only cycles: the target of each graph\nedge must contain a node, so every type in a cycle has both a root and a\nnode. The rule rejects such a type owning another root, breaking every\ncycle. It also limits graph-only chains to three types, or two if the first\ntype contains a node, and conservatively rejects longer acyclic chains.\nThe missing local-kptr edges, rather than a missed graph-only cycle, are the\nbug introduced by support for bpf_kptr_xchg() into local kptrs.\n\nReplace that restriction with one bounded ownership walk covering graph\nroots and local referenced kptrs. Run it after all BTF records have been\nfixed up, reject cycles and paths deeper than eight record-bearing types,\nand cache each type's suffix depth while checking it against the remaining\nbudget. This also permits the longer acyclic graph-only layouts rejected\nby the old rule; update their existing BTF tests accordingly.\n\nKeep the bound independent of MAX_CALL_FRAMES because recursive destruction\ncan run below a BPF call chain. A plain local pointee without special-field\nmetadata adds only a final non-recursing drop. Non-owning kptrs and\nkernel-BTF kptrs do not recurse through local records and remain outside the\nwalk. Include local percpu-kptr edges too, although allocation of percpu\nobjects with special fields is currently forbidden, so that relaxing that\nrestriction cannot bypass the ownership bound.\n\nbtf_check_and_fixup_fields() continues to initialize graph_root.value_rec,\nincluding for separately allocated map records. The ownership relationships\nbelong to immutable program BTF and only need validation at BTF load time."
}
],
"lastModified": "2026-10-19T10:19:23.637",
"sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}