Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2025-38502-Linux-LPE — Repositorio de investigación para CVE-2025-38502, un acceso fuera de límites en el almacenamiento local del cgroup BPF del kernel de Linux mediante tail calls que permite la escalada de privilegios local. | Kitploit
Herramientas/GitHubGitHub/abraxas/cve-2025-38502-linux-lpe
Escalada de PrivilegiosForensia de MemoriaAnálisis de VulnerabilidadesExplotaciónIngeniería InversaPapers e InvestigaciónAprendizaje y EducaciónExplotación de Binarios

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
GitHub
abraxas/cve-2025-38502-linux-lpe

CVE-2025-38502-Linux-LPE

Repositorio de investigación para CVE-2025-38502, un acceso fuera de límites en el almacenamiento local del cgroup BPF del kernel de Linux mediante tail calls que permite la escalada de privilegios local.

Ver Repositorio
hace 9h 35mAún no revisado

ABRAXAS LABS — CVE-2025-38502

Abraxas Labs · abraxaslabs.tech · github.com/abraxas · @abraxas_null

CVE-2025-38502

Acceso fuera de límites al almacenamiento local de cgroup de BPF del kernel de Linux mediante tail calls

CVECVE-2025-38502
CWECWE-125 — Lectura fuera de límites
FabricanteLinux kernel
Componentekernel/bpf/core.c, include/linux/bpf.h (almacenamiento local de cgroup + tail calls)
ImpactoCorrupción de memoria del kernel local; la escalada de privilegios está dentro del alcance en kernels sin parchear
Vector de ataqueLocal (AV:L)
PrivilegiosBajos (PR:L) — un proceso que puede cargar programas BPF de tipo CGROUP_SKB (o programas equivalentes adjuntos a cgroup)
Interacción del usuarioNinguna
CVSS 3.1 (kernel.org CNA)7.8 ALTO — CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS 3.1 (NVD)7.1 ALTO — CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:H
Público16 de agosto de 2025
Corrección upstreamabad3d0 en 6.17-rc1; retroportado a 6.16.1, 6.12.46, 6.6.105, 6.1.151, 5.15.192

Solo para investigación / uso educativo. No ejecute, despliegue ni utilice el material de este repositorio contra ningún host a menos que tenga permiso escrito explícito tanto de la parte que aloja este repositorio como del propietario de los sistemas objetivo. Encontrado en estado salvaje.

El nombre del archivo fuente CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c trunca el identificador. El registro publicado es CVE-2025-38502. No existe un CVE de Linux CVE-2025-3850.


Contenido

  • Resumen
  • Impacto
  • Causa raíz
  • Versiones del kernel afectadas
  • Estado de distribución
  • Precondiciones
  • La corrección
  • Comprobar un sistema en ejecución
  • Mitigación
  • Estructura del repositorio
  • Referencias
  • Contacto
  • Descargo de responsabilidad

Resumen

Lonial informó que el almacenamiento local de BPF de cgroup puede ser accedido fuera de límites a través de una tail call.

El verificador de eBPF comprueba los tipos de cada programa de forma aislada. En tiempo de ejecución, bpf_get_local_storage() no busca el mapa del programa que se está ejecutando actualmente. Lee el puntero del almacenamiento de cgroup desde current->bpf_ctx → bpf_cg_run_ctx → prog_item->cgroup_storage[]. Esa ranura se rellena desde el programa originalmente adjunto, no desde el programa al que se hizo la tail call.

Si el programa A (tamaño de valor pequeño de BPF_MAP_TYPE_CGROUP_STORAGE) hace una tail call al programa B (tamaño de valor grande), el bpf_get_local_storage() de B sigue devolviendo el búfer más pequeño de A. Los accesos que el verificador permitió contra el mapa de B entonces se salen del final de la asignación de A.

El defecto se introdujo en Linux 5.9 mediante 7d9c342 (bpf: Make cgroup storages shared between programs on the same cgroup). Se corrigió extendiendo bpf_map_owner con un storage_cookie[] para que las combinaciones de tail call solo se acepten cuando el destinatario usa los mismos mapas de almacenamiento de cgroup que el llamador, o no usa ninguno.


Impacto

Este es un acceso fuera de límites al heap del kernel local. La puntuación de severidad varía según el proveedor porque no coinciden en si la primitiva es un "DoS de solo lectura" o una corrupción de memoria completa:

Qué significa esto en la práctica:

  • Confidencialidad. Una lectura OOB del objeto kmalloc vecino puede filtrar punteros del kernel (desplazamiento de KASLR), cookies del heap y contenidos de estructuras adyacentes.
  • Integridad. El mismo desajuste es una escritura dimensionada relativa al mapa del destinatario, contra el búfer más pequeño del llamador. Los objetos del heap adyacentes (por ejemplo, un struct bpf_array rociado en el mismo slab/orden) pueden corromperse.
  • Disponibilidad. Una escritura mal dirigida es un oops / pánico del kernel directo.
  • Privilegio. En un kernel sin parchear donde se pueden cargar programas BPF de cgroup, esta clase de OOB del heap se ha utilizado como primitiva de escalada de privilegios local (sobrescribir map->ops, secuestrar un helper, commit_creds / cambio de namespace). Por eso este árbol etiqueta el problema como LPE. La puntuación más baja de Red Hat refleja su evaluación específica del producto, no la ausencia del fallo.

El fallo no requiere un servicio expuesto a la red. Es local. No requiere una TTY, un helper setuid ni interacción del usuario.


Causa raíz

Verificador vs tiempo de ejecución

Dos programas BPF de cgroup, cada uno con su propio BPF_MAP_TYPE_CGROUP_STORAGE (variante compartida, BPF_CGROUP_STORAGE_SHARED):

ProgramaRolTamaño del valor de almacenamiento
Aadjunto / llamador de tail callpequeño (p. ej., cabe en un orden de kmalloc dado)
Bobjetivo de tail callgrande (el verificador permite accesos hasta este tamaño)

El verificador comprueba A contra el mapa de A y B contra el mapa de B. Ambos pasan.

En tiempo de ejecución el helper hace:

root@kitploit:~
ctx = container_of(current->bpf_ctx, struct bpf_cg_run_ctx, run_ctx);
storage = ctx->prog_item->cgroup_storage[stype];
if (stype == BPF_CGROUP_STORAGE_SHARED)
    ptr = &READ_ONCE(storage->buf)->data[0];
else
    ptr = this_cpu_ptr(storage->percpu_buf);

prog_item es la entrada del array para el programa que inició la ejecución del cgroup, no el programa que se está ejecutando actualmente tras bpf_tail_call. Por lo tanto, B opera sobre el objeto de almacenamiento de A.

Por qué importan los tamaños

bpf_cgroup_storage_alloc() dimensiona el búfer de respaldo a partir del value_size del mapa. El búfer de A es demasiado pequeño para los accesos verificados de B. El resultado es una clásica confusión de tipos de la identidad del mapa a través de una transferencia de control — la misma familia de fallos que otros problemas de BPF en los que "el helper ve un mapa diferente al que vio el verificador".

Almacenamiento compartido en un cgroup

El commit 7d9c342 hizo que los almacenamientos de cgroup fueran compartidos entre programas adjuntos al mismo cgroup. Esa compartición es lo que hace que la ranura del contexto de ejecución sea un único puntero en lugar de una búsqueda por programa, y es por lo que los kernels anteriores a 5.9 no se ven afectados.

Objetos adyacentes

BPF_PROG_TEST_RUN sobre un programa BPF_PROG_TYPE_CGROUP_SKB asigna almacenamiento de cgroup durante la duración de la prueba. Esa asignación se sitúa en el heap del kernel junto a cualquier otra cosa liberada recientemente en la misma clase de tamaño — incluidos mapas struct bpf_array cuyo value_size se eligió para caer en el mismo orden de kmalloc. Por lo tanto, un OOB desde el búfer de almacenamiento puede alcanzar campos de bpf_map (ops, lista RCU, value[]) de un mapa de array vecino.

Ese detalle del diseño del heap es la razón por la que un aviso de "mera lectura OOB" y un informe de LPE pueden describir el mismo CVE.


Versiones del kernel afectadas

Introducido: Linux 5.9 (7d9c3427894fe70d1347b4820476bf37736d2ff0)
No afectados: todos los kernels anteriores a 5.9

En una línea:

root@kitploit:~
/* CVE-2025-38502: affected 5.9–5.15.191, 5.16–6.1.150, 6.2–6.6.104, 6.7–6.12.45, 6.13–6.16.0; fixed in 5.15.192, 6.1.151, 6.6.105, 6.12.46, 6.16.1, 6.17-rc1 */

Todavía abierto en algunos stables: el rastreador de kernels de Debian listaba 5.10 upstream-stable / bullseye 5.10 como needed. No asuma que todos los 5.10.y están parcheados.

Los números de ABI de las distros mienten. Ubuntu 5.15.0-163 es un 5.15 parcheado aunque 5.15.0 parezca más antiguo que el upstream 5.15.192. Compare el changelog del paquete / USN / DSA / ALAS / RHSA, no uname -r contra la tabla anterior.


Estado de distribución

Cualquier distribución que haya enviado un kernel en los rangos anteriores estaba dentro del alcance hasta que retroportara abad3d0 (o el commit estable correspondiente). Este es código BPF genérico, no un parche específico de una distro.

Típicamente afectadas hasta ser parcheadas

No afectadas (kernel GA anterior a 5.9)

  • Ubuntu 20.04 GA (5.4), 18.04, 16.04
  • RHEL 8 predeterminado (4.18)
  • Amazon Linux 1; Amazon Linux 2 core / 5.4 extra

Versiones de paquetes parcheadas conocidas (ejemplos)

Ubuntu 26.04 / 25.10 están listados como no afectados (se ramificaron después de la corrección). Ubuntu 25.04 alcanzó EOL todavía needed.


Precondiciones

Un host puede coincidir con una versión afectada y aun así no ser alcanzable. Comprobaciones útiles:

unprivileged_bpf_disabled=1 no es una corrección completa — un usuario con capacidad BPF todavía puede alcanzar el fallo — pero elimina la ruta sin privilegios.


La corrección

Commit upstream abad3d0bad72a52137e0c350c59542d75ae4f513 (bpf: Fix oob access in cgroup local storage, Daniel Borkmann).

struct bpf_map_owner gana un array storage_cookie[]. En la actualización del objetivo de tail call, el kernel ahora:

  1. Si el destinatario usa bpf_get_local_storage() — exige que los mapas de almacenamiento de cgroup del destinatario sean exactamente los mapas del llamador (mismas cookies).
  2. Si el destinatario no usa almacenamiento local de cgroup — permite la combinación de tail call.

Los tamaños de valor que no coinciden ya no pueden componerse a espaldas del verificador. Cada programa sigue verificándose por separado; la nueva comprobación está en el borde entre ellos.

No haga cherry-pick del commit sobre un árbol arbitrario sin los helpers de propietario/cookie de BPF que lo rodean. Use el retroporte estable para su serie.


Comprobar un sistema en ejecución

root@kitploit:~
uname -r
# Compare against the table above, then against your distro advisory —
# Ubuntu/Debian ABI numbers are not upstream stable numbers.

grep -E 'CONFIG_BPF_SYSCALL|CONFIG_CGROUP_BPF' \
  /boot/config-$(uname -r) /proc/config.gz 2>/dev/null

sysctl kernel.unprivileged_bpf_disabled
# 0  = unprivileged bpf allowed (widest exposure)
# 1  = disabled after first privileged use, or fully disabled depending on kernel
# 2  = disabled (admin can re-enable)

Confirme el paquete, no solo la cadena de versión:

root@kitploit:~
# Debian / Ubuntu
apt changelog linux-image-$(uname -r) 2>/dev/null | grep -i 38502

# RHEL family
rpm -q --changelog kernel | grep -i 38502

Un kernel ≥ 6.17, o un estable listado en la columna "primera corrección", o un paquete de distro de la tabla de avisos, es el cierre real.


Mitigación

  1. Parchear. Instale el kernel de la distro que contiene abad3d0 / el equivalente estable. Esta es la única corrección completa.
  2. Hasta que pueda parchear:
    • Establezca kernel.unprivileged_bpf_disabled=1 (o 2) para eliminar los cargadores sin privilegios.
    • Restrinja CAP_BPF, CAP_PERFMON y CAP_SYS_ADMIN a usuarios y contenedores no confiables.
    • En namespaces de usuario / contenedores sin privilegios, deshabilite BPF (seccomp, LSM, o eliminando esas capacidades en el runtime).
  3. No trate "nosotros no adjuntamos programas cgroup SKB" como seguridad. BPF_PROG_TEST_RUN es suficiente para ejercitar la ruta de asignación; un atacante local proporciona los programas.

Estructura del repositorio

root@kitploit:~
CVE-2025-38502/
├── README.md
├── banner.png
├── CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c
└── ebpf_lpe.h
ArchivoQué es
banner.pngBanner del README (Abraxas Labs / CVE-2025-38502)
CVE-2025-3850-Linux-LPE-Abaraxas-Labs.cCódigo fuente de investigación recuperado en estado salvaje (el nombre del archivo trunca el id del CVE)
ebpf_lpe.hConstructores de instrucciones BPF compartidos, helpers de mapas y macros de desplazamiento del kernel usados por ese código fuente

Este directorio documenta la vulnerabilidad y contiene el árbol de investigación correspondiente. No es un kit de exploit listo para usar: los símbolos de gadgets del kernel (ARRAY_MAP_OPS_OFF, COMMIT_CREDS, …) son entradas en tiempo de compilación para un vmlinux específico, y ejecutar el programa contra un kernel en vivo está fuera del alcance de este README.


Referencias

CVE / NVD

  • CVE-2025-38502
  • NVD
  • GitHub Advisory GHSA-x96j-4m6x-jcvx

Upstream

  • Introducido: 7d9c342 — bpf: Make cgroup storages shared between programs on the same cgroup
  • Corregido: abad3d0 — bpf: Fix oob access in cgroup local storage
  • linux-cve-announce

Retroportes estables

  • 6.16.1 19341d5c
  • 6.12.46 41688d1f
  • 6.6.105 7acfa07c
  • 6.1.151 66da7cee
  • 5.15.192 c1c74584

Distros

  • Página CVE de Ubuntu
  • Rastreador de seguridad de Debian
  • Debian kernel-sec
  • Red Hat
  • Amazon Linux ALAS
  • SUSE

Contacto

Abraxas Labs — solo investigación / pruebas autorizadas

Sitio webhttps://abraxaslabs.tech
GitHubhttps://github.com/abraxas
X@abraxas_null

Descargo de responsabilidad

Este repositorio es para investigación y educación.

No compile, ejecute, despliegue ni utilice de otro modo el código aquí contra ningún sistema a menos que tenga autorización escrita explícita tanto de la parte que aloja este repositorio como del propietario del objetivo. El acceso no autorizado a sistemas informáticos es un delito.

Los autores y Abraxas Labs proporcionan este material tal cual, sin garantía de que sea completo, correcto o seguro de ejecutar. La investigación de explotación del kernel puede provocar un pánico de la máquina, corromper sistemas de archivos y perder datos. Usted asume ese riesgo.

Encontrado en estado salvaje.

Descargar herramienta
FuentePuntuaciónIntegridadNotas
kernel.org CNA / cve.org7.8 ALTOAltaC:H/I:H/A:H — trata el fallo como impacto local completo
NVD7.1 ALTONingunaC:H/I:N/A:H — confidencialidad + disponibilidad
UbuntuMedio (7.1)—USN-7909
Red Hat4.0 BAJONingunaC:N/I:N/A:L — calificado como disponibilidad limitada
Amazon Linux4.0 MedioNingunamismo vector que Red Hat
SUSE6.1 ModeradoNingunaalgunos flujos de SLE 15 marcados como WONTFIX
SerieAfectadosPrimera corrección
5.9 – 5.155.9 hasta 5.15.1915.15.192 (c1c74584…)
5.16 – 6.15.16 hasta 6.1.1506.1.151 (66da7cee…)
6.2 – 6.66.2 hasta 6.6.1046.6.105 (7acfa07c…)
6.7 – 6.126.7 hasta 6.12.456.12.46 (41688d1f…)
6.13 – 6.166.13 hasta 6.16.06.16.1 (19341d5c…)
mainlinehasta que llegó la corrección6.17-rc1 (abad3d0b…)
DistroVersiones / kernels que estaban en rango
Ubuntu22.04 LTS (5.15), 24.04 LTS (6.8), 25.04 (EOL todavía needed). 20.04 HWE 5.15.
Debian11 bullseye (5.10), 12 bookworm (6.1), 13 trixie (6.12)
RHEL 9 / 10, Rocky, Alma, FedoraRHEL 9 ≈ 5.14; RHEL 10 ≈ 6.12; Fedora rolling 5.9–6.16
SUSE / openSUSESLE Micro 5.3/5.4; algunos flujos de SLE 15 WONTFIX
Amazon Linux 2023kernel predeterminado y kernel6.12
Amazon Linux 2 extras5.10 extra (sin corrección planificada) y 5.15 extra
Arch, Gentoo, Tumbleweedkernels rolling entre 5.9 y la corrección 6.16.1 / 6.17-rc1
DistroPaquete corregido (indicativo)Aviso
Ubuntu 22.04linux 5.15.0-163.173USN-7909
Ubuntu 24.04linux 6.8.0-106.106mismo
Debian 12linux 6.1.153-1DSA-6009-1
Debian 13linux 6.12.48-1DSA-6008-1
Debian 11 (retroporte 6.1)linux-6.1 6.1.153-1~deb11u1DLA-4328-1
Amazon Linux 2023kernel / kernel6.12, 2025-09-29ALAS2023-2025-1210 / 1208
Amazon Linux 2 5.15 extra2025-09-29ALAS2KERNEL-5.15-2025-091
CondiciónPor qué importa
CONFIG_BPF_SYSCALL=ybpf(2) debe existir
CONFIG_CGROUP_BPF=yprogramas adjuntos a cgroup y almacenamiento local de cgroup
kernel.unprivileged_bpf_disabled0 permite la carga de programas sin privilegios; 1/2 requieren CAP_BPF / CAP_PERFMON / CAP_SYS_ADMIN
Lockdown / LSM / seccomppueden bloquear BPF_PROG_LOAD o BPF_PROG_TEST_RUN
BPF_PROG_TYPE_CGROUP_SKB (u otros tipos de programa de cgroup que llevan almacenamiento local)el contexto de ejecución que contiene cgroup_storage[]