CVE-2026-98813

Estado: RecibidaSin puntuar—
Gravedad—Sin puntuar
Probabilidad de explotación0.15 %mayor que el 4 % de las CVE
Explotación activaNono figura en el catálogo de CISA
Exploit públicoNo conocidosin código público localizado

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

Mostrar las 2 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"
}