CVE-2026-98813
En el kernel de Linux se ha resuelto la siguiente vulnerabilidad:
bpf: mantener la BTF del mapa para el registro del destructor del asignador de memoria
bpf_ma_set_dtor() duplica map->record para que el destructor de bpf_mem_alloc pueda liberar los campos especiales de los elementos de los mapas hash y rhash una vez que el asignador los libera definitivamente. btf_record_dup() solo adquiere referencias sobre la BTF del kernel y de los módulos. Los campos cuyos tipos residen en la BTF del mapa siguen apuntando a ella: un kptr a un tipo local se refiere a map->btf, y un list_head o rb_root lleva un value_rec que pertenece a la tabla de metadatos de struct de map->btf.
Leer descripción completaMostrar menos
Ese estado prestado puede sobrevivir al mapa. Cuando hay callbacks de RCU todavía en curso, bpf_mem_alloc_destroy() copia el asignador y aplaza el vaciado final, junto con el contexto del destructor, a una cola de trabajo. bpf_map_free() entonces libera map->record y suelta la referencia a la BTF del mapa en cuanto map_free() retorna. Cuando el programa que cargó la BTF también desaparece, la BTF se libera mientras el worker sigue usando el duplicado. El worker desreferencia la BTF mediante btf_is_kernel() y btf_find_struct_meta() en bpf_obj_free_fields() al destruir elementos liberados bajo RCU, y mediante btf_is_kernel() en btf_record_free() al liberar el propio contexto:
Basta con liberar un mapa que aún contiene más elementos que la marca de agua alta del asignador para llegar ahí, porque la liberación en bloque durante el desmontaje encola el callback de RCU que hace que bpf_mem_alloc_destroy() aplace la operación. Tanto los mapas hash no preasignados como los mapas hash redimensionables registran el destructor y se ven afectados por igual.
Mantener una referencia sobre la BTF del mapa en el contexto del destructor. Todo puntero no kernel del registro duplicado es map->btf o memoria que esta posee, por lo que una única referencia cubre los kptr, los list_head y las raíces rb, y replica lo que hace bpf_map_meta_alloc() con el registro duplicado de un mapa interno. Soltarla solo después de liberar el registro duplicado: el worker es expulsable y no está en una sección crítica de lectura RCU, así que soltar primero la última referencia permitiría liberar la BTF mientras btf_record_free() todavía lee sus campos.
Detalles técnicos trazas, registros y código del informe original
BUG: KASAN: slab-use-after-free in btf_is_kernel+0x19/0x30 Read of size 1 at addr ffff88811505dce8 by task kworker/u16:2/50 Workqueue: events_unbound free_mem_alloc_deferred Call Trace: btf_is_kernel+0x19/0x30 btf_record_free+0xc7/0xf0 htab_dtor_ctx_free+0x1a/0x30 free_mem_alloc_no_barrier+0x39/0x230 free_mem_alloc_deferred+0x2a/0x40 process_scheduled_works+0x5ce/0x9d0 worker_thread+0x42a/0x5e0 kthread+0x1f5/0x230 ret_from_fork+0x1dd/0x390 ret_from_fork_asm+0x1a/0x30 Allocated by task 358: __kmalloc_cache_noprof+0x287/0x510 btf_new_fd+0xf7/0x3d0 __sys_bpf+0x487/0x840 Freed by task 0: kfree+0x186/0x560 rcu_core+0x6f6/0xd40
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.15 %
- Percentil entre todas las CVEs puntuadas
- 4
- 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
JSON original (NVD)
Mostrar
{
"id": "CVE-2026-98813",
"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": "1df97a7453eec80c1912c2d0360290a3970a7671",
"lessThan": "b506f5699e145196ee29d76cf1ca1cbb2202c055",
"versionType": "git"
},
{
"status": "affected",
"version": "1df97a7453eec80c1912c2d0360290a3970a7671",
"lessThan": "ab39974240a0cff765f3bb9cce81d8001ffdb144",
"versionType": "git"
},
{
"status": "affected",
"version": "451a84a3ad3c897c03181af433e7c98640730f1f",
"versionType": "git"
},
{
"status": "affected",
"version": "51a17f0ce19c4ee2a25cf16c93490d509b1ebb0a",
"versionType": "git"
},
{
"status": "affected",
"version": "6.12.112",
"lessThan": "6.13",
"versionType": "semver"
},
{
"status": "affected",
"version": "6.18.55",
"lessThan": "6.19",
"versionType": "semver"
}
],
"programFiles": [
"kernel/bpf/hashtab.c"
],
"defaultStatus": "unaffected"
},
{
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"product": "Linux",
"versions": [
{
"status": "affected",
"version": "7.0"
},
{
"status": "unaffected",
"version": "0",
"lessThan": "7.0",
"versionType": "semver"
},
{
"status": "unaffected",
"version": "7.2.10",
"versionType": "semver",
"lessThanOrEqual": "7.2.*"
},
{
"status": "unaffected",
"version": "7.3",
"versionType": "original_commit_for_fix",
"lessThanOrEqual": "*"
}
],
"programFiles": [
"kernel/bpf/hashtab.c"
],
"defaultStatus": "affected"
}
]
}
],
"published": "2026-10-18T16:17:35.427",
"references": [
{
"url": "https://git.kernel.org/stable/c/ab39974240a0cff765f3bb9cce81d8001ffdb144",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/b506f5699e145196ee29d76cf1ca1cbb2202c055",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}
],
"vulnStatus": "Received",
"descriptions": [
{
"lang": "en",
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\nbpf: Hold map BTF for the memory allocator destructor record\n\nbpf_ma_set_dtor() duplicates map->record so that the bpf_mem_alloc\ndestructor can release the special fields of hash and rhash map elements\nonce the allocator frees them for good. btf_record_dup() only acquires\nreferences on kernel and module BTF. Fields whose types live in the map\nBTF keep pointing into it: a kptr to a local type refers to map->btf,\nand a list_head or rb_root field carries a value_rec owned by the struct\nmeta table of map->btf.\n\nThat borrowed state can outlive the map. When RCU callbacks are still in\nflight, bpf_mem_alloc_destroy() copies the allocator and defers the final\ndrain, together with the destructor context, to a workqueue.\nbpf_map_free() then frees map->record and drops the map's BTF reference\nas soon as map_free() returns. Once the program that loaded the BTF is\ngone as well, the BTF is freed while the worker still uses the\nduplicate. The worker dereferences it through btf_is_kernel() and\nbtf_find_struct_meta() in bpf_obj_free_fields() when destroying elements\nthat were freed under RCU, and through btf_is_kernel() in\nbtf_record_free() when releasing the context itself:\n\n BUG: KASAN: slab-use-after-free in btf_is_kernel+0x19/0x30\n Read of size 1 at addr ffff88811505dce8 by task kworker/u16:2/50\n Workqueue: events_unbound free_mem_alloc_deferred\n Call Trace:\n btf_is_kernel+0x19/0x30\n btf_record_free+0xc7/0xf0\n htab_dtor_ctx_free+0x1a/0x30\n free_mem_alloc_no_barrier+0x39/0x230\n free_mem_alloc_deferred+0x2a/0x40\n process_scheduled_works+0x5ce/0x9d0\n worker_thread+0x42a/0x5e0\n kthread+0x1f5/0x230\n ret_from_fork+0x1dd/0x390\n ret_from_fork_asm+0x1a/0x30\n\n Allocated by task 358:\n __kmalloc_cache_noprof+0x287/0x510\n btf_new_fd+0xf7/0x3d0\n __sys_bpf+0x487/0x840\n\n Freed by task 0:\n kfree+0x186/0x560\n rcu_core+0x6f6/0xd40\n\nFreeing a map that still holds more elements than the allocator's high\nwatermark is enough to get there, because the bulk free during teardown\nqueues the RCU callback that makes bpf_mem_alloc_destroy() defer.\nNon-preallocated hash maps and resizable hash maps both register the\ndestructor and are affected alike.\n\nKeep one reference on the map BTF in the destructor context. Every\nnon-kernel pointer in the duplicated record is either map->btf or memory\nowned by it, so a single reference covers kptrs, list heads, and rb\nroots, and mirrors what bpf_map_meta_alloc() does for the duplicated\nrecord of an inner map. Release it only after the duplicated record has\nbeen freed: the worker is preemptible and not in an RCU read-side\ncritical section, so dropping the last reference first would let the\nBTF be freed while btf_record_free() still reads its fields."
}
],
"lastModified": "2026-10-19T10:19:45.330",
"sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}