
Repositório de pesquisa para CVE-2025-38502, um acesso fora dos limites ao armazenamento local do cgroup BPF do kernel Linux via tail calls, permitindo escalonamento local de privilégios.

Abraxas Labs · abraxaslabs.tech · github.com/abraxas · @abraxas_null
Acesso fora dos limites ao armazenamento local de cgroup do BPF do kernel Linux via tail calls
| CVE | CVE-2025-38502 |
| CWE | CWE-125 — Leitura fora dos limites |
| Fornecedor | Linux kernel |
| Componente | kernel/bpf/core.c, include/linux/bpf.h (armazenamento local de cgroup + tail calls) |
| Impacto | Corrupção de memória local do kernel; escalonamento de privilégios está no escopo em kernels não corrigidos |
| Vetor de ataque | Local (AV:L) |
| Privilégios | Baixo (PR:L) — um processo capaz de carregar programas BPF do tipo CGROUP_SKB (ou programas equivalentes anexados a cgroup) |
| Interação do usuário | Nenhuma |
| 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úblico | 16 de agosto de 2025 |
| Correção upstream | abad3d0 em 6.17-rc1; backport para 6.16.1, 6.12.46, 6.6.105, 6.1.151, 5.15.192 |
Apenas para pesquisa / uso educacional. Não execute, implante ou use o material deste repositório contra qualquer host, a menos que você tenha permissão explícita por escrito tanto da parte que hospeda este repositório quanto do proprietário dos sistemas-alvo. Encontrado em ambiente real.
O nome do arquivo de origem CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c trunca o identificador. O registro publicado é CVE-2025-38502. Não existe CVE do Linux CVE-2025-3850.
Lonial relatou que o armazenamento local de cgroup do BPF pode ser acessado fora dos limites através de uma tail call.
O verificador do eBPF faz a checagem de tipos de cada programa isoladamente. Em tempo de execução, bpf_get_local_storage() não consulta o mapa do programa atualmente em execução. Ele lê o ponteiro do armazenamento de cgroup de current->bpf_ctx → bpf_cg_run_ctx → prog_item->cgroup_storage[]. Esse slot é preenchido a partir do programa originalmente anexado, não do programa para o qual foi feita a tail call.
Se o programa A (com tamanho de valor pequeno em BPF_MAP_TYPE_CGROUP_STORAGE) faz uma tail call para o programa B (com tamanho de valor grande), o bpf_get_local_storage() de B ainda retorna o buffer menor de A. Os acessos que o verificador permitiu em relação ao mapa de B então ultrapassam o fim da alocação de A.
O defeito foi introduzido no Linux 5.9 por 7d9c342 (bpf: Make cgroup storages shared between programs on the same cgroup). Foi corrigido estendendo bpf_map_owner com um storage_cookie[], de modo que combinações de tail call só são aceitas quando o chamado usa os mesmos mapas de armazenamento de cgroup que o chamador, ou não usa nenhum.
Este é um acesso fora dos limites no heap do kernel local. A pontuação de severidade varia por fornecedor porque eles discordam sobre se a primitiva é “DoS somente leitura” ou corrupção total de memória:
O que isso significa na prática:
struct bpf_array pulverizado na mesma slab/ordem) podem ser corrompidos.map->ops, sequestrar um helper, commit_creds / troca de namespace). É por isso que esta árvore rotula o problema como LPE. A pontuação mais baixa do Red Hat reflete sua avaliação específica de produto, não a ausência do bug.O bug não exige um serviço exposto à rede. É local. Não exige um TTY, um helper setuid ou interação do usuário.
Dois programas BPF de cgroup, cada um com seu próprio BPF_MAP_TYPE_CGROUP_STORAGE (variante compartilhada, BPF_CGROUP_STORAGE_SHARED):
| Programa | Papel | Tamanho do valor de armazenamento |
|---|---|---|
| A | anexado / chamador da tail call | pequeno (por exemplo, cabe em uma dada ordem de kmalloc) |
| B | alvo da tail call | grande (o verificador permite acessos até esse tamanho) |
O verificador checa A em relação ao mapa de A e B em relação ao mapa de B. Ambos passam.
Em tempo de execução, o helper faz:
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 é a entrada do array para o programa que iniciou a execução do cgroup, não o programa atualmente em execução após bpf_tail_call. Portanto, B opera sobre o objeto de armazenamento de A.
bpf_cgroup_storage_alloc() dimensiona o buffer de suporte a partir do value_size do mapa. O buffer de A é pequeno demais para os acessos verificados de B. O resultado é uma clássica confusão de tipo da identidade do mapa através de uma transferência de controle — a mesma família de bugs de outros problemas de BPF em que “o helper vê um mapa diferente do que o verificador viu”.
O commit 7d9c342 tornou os armazenamentos de cgroup compartilhados entre programas anexados ao mesmo cgroup. Esse compartilhamento é o que faz o slot do contexto de execução ser um único ponteiro em vez de uma consulta por programa, e é por isso que kernels anteriores ao 5.9 não são afetados.
BPF_PROG_TEST_RUN em um programa BPF_PROG_TYPE_CGROUP_SKB aloca armazenamento de cgroup durante o teste. Essa alocação fica no heap do kernel ao lado de qualquer outra coisa recentemente liberada na mesma classe de tamanho — incluindo mapas struct bpf_array cujo value_size foi escolhido para cair na mesma ordem de kmalloc. Um OOB a partir do buffer de armazenamento pode, portanto, alcançar campos de bpf_map (ops, lista RCU, value[]) de um mapa de array vizinho.
Esse detalhe de layout do heap é o motivo pelo qual um aviso de “mera leitura OOB” e um relatório de LPE podem descrever o mesmo CVE.
Introduzido: Linux 5.9 (7d9c3427894fe70d1347b4820476bf37736d2ff0)
Não afetados: todos os kernels anteriores ao 5.9
Em uma linha:
/* CVE-2025-38502: afeta 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; corrigido em 5.15.192, 6.1.151, 6.6.105, 6.12.46, 6.16.1, 6.17-rc1 */
Ainda aberto em alguns stables: o rastreador de kernel do Debian listava o 5.10 upstream-stable / bullseye 5.10 como needed. Não presuma que todo 5.10.y está corrigido.
Números de ABI de distro enganam. O Ubuntu 5.15.0-163 é um 5.15 corrigido, embora 5.15.0 pareça mais antigo que o upstream 5.15.192. Compare o changelog do pacote / USN / DSA / ALAS / RHSA, não o uname -r com a tabela acima.
Qualquer distribuição que tenha enviado um kernel nas faixas acima estava no escopo até fazer backport de abad3d0 (ou do commit stable correspondente). Este é código BPF genérico, não um patch específico de distro.
Ubuntu 26.04 / 25.10 estão listados como não afetados (eles derivaram após a correção). O Ubuntu 25.04 chegou ao EOL ainda needed.
Um host pode corresponder a uma versão afetada e ainda assim não ser alcançável. Verificações úteis:
unprivileged_bpf_disabled=1 não é uma correção completa — um usuário com capacidade BPF ainda pode atingir o bug — mas remove o caminho sem privilégios.
Commit upstream abad3d0bad72a52137e0c350c59542d75ae4f513 (bpf: Fix oob access in cgroup local storage, Daniel Borkmann).
struct bpf_map_owner ganha um array storage_cookie[]. Na atualização do alvo da tail call, o kernel agora:
bpf_get_local_storage() — exige que os mapas de armazenamento de cgroup do chamado sejam exatamente os mapas do chamador (mesmos cookies).Tamanhos de valor incompatíveis não podem mais ser compostos pelas costas do verificador. Cada programa ainda é verificado isoladamente; a nova checagem está na aresta entre eles.
Não faça cherry-pick do commit em uma árvore arbitrária sem os helpers de owner/cookie do BPF ao redor. Use o backport stable para a sua série.
uname -r
# Compare com a tabela acima e depois com o aviso da sua distro —
# números de ABI do Ubuntu/Debian não são números stable do upstream.
grep -E 'CONFIG_BPF_SYSCALL|CONFIG_CGROUP_BPF' \
/boot/config-$(uname -r) /proc/config.gz 2>/dev/null
sysctl kernel.unprivileged_bpf_disabled
# 0 = bpf sem privilégios permitido (exposição mais ampla)
# 1 = desabilitado após o primeiro uso privilegiado, ou totalmente desabilitado dependendo do kernel
# 2 = desabilitado (admin pode reabilitar)
Confirme o pacote, não apenas a string de versão:
# Debian / Ubuntu
apt changelog linux-image-$(uname -r) 2>/dev/null | grep -i 38502
# Família RHEL
rpm -q --changelog kernel | grep -i 38502
Um kernel ≥ 6.17, ou um stable listado na coluna “primeira correção”, ou um pacote de distro da tabela de avisos, é o fechamento real.
abad3d0 / o equivalente stable. Esta é a única correção completa.kernel.unprivileged_bpf_disabled=1 (ou 2) para eliminar carregadores sem privilégios.CAP_BPF, CAP_PERFMON e CAP_SYS_ADMIN para usuários e contêineres não confiáveis.seccomp, LSM ou removendo essas capacidades no runtime).BPF_PROG_TEST_RUN é suficiente para exercitar o caminho de alocação; um atacante local fornece os programas.CVE-2025-38502/
├── README.md
├── banner.png
├── CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c
└── ebpf_lpe.h
| Arquivo | O que é |
|---|---|
banner.png | Banner do README (Abraxas Labs / CVE-2025-38502) |
CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c | Código-fonte de pesquisa recuperado em ambiente real (o nome do arquivo trunca o id do CVE) |
ebpf_lpe.h | Construtores de instruções BPF compartilhados, helpers de mapa e macros de deslocamento do kernel usados por esse código-fonte |
Este diretório documenta a vulnerabilidade e contém a árvore de pesquisa correspondente. Não é um kit de exploit pronto para uso: símbolos de gadget do kernel (ARRAY_MAP_OPS_OFF, COMMIT_CREDS, …) são entradas de tempo de compilação para um vmlinux específico, e executar o programa contra um kernel em produção está fora do escopo deste README.
CVE / NVD
Upstream
7d9c342 — bpf: Make cgroup storages shared between programs on the same cgroupabad3d0 — bpf: Fix oob access in cgroup local storageBackports stable
Distros
Abraxas Labs — apenas pesquisa / testes autorizados
Este repositório é para pesquisa e educação.
Não compile, execute, implante ou use de qualquer outra forma o código aqui contra qualquer sistema, a menos que você tenha autorização explícita por escrito tanto da parte que hospeda este repositório quanto do proprietário do alvo. Acesso não autorizado a sistemas de computador é crime.
Os autores e a Abraxas Labs fornecem este material como está, sem garantia de que seja completo, correto ou seguro para execução. Pesquisa de exploração de kernel pode causar panic em uma máquina, corromper sistemas de arquivos e perder dados. Você assume esse risco.
Encontrado em ambiente real.
| Fonte | Pontuação | Integridade | Notas |
|---|
| kernel.org CNA / cve.org | 7.8 ALTO | Alta | C:H/I:H/A:H — trata o bug como impacto local total |
| NVD | 7.1 ALTO | Nenhuma | C:H/I:N/A:H — confidencialidade + disponibilidade |
| Ubuntu | Médio (7.1) | — | USN-7909 |
| Red Hat | 4.0 BAIXO | Nenhuma | C:N/I:N/A:L — avaliado como disponibilidade limitada |
| Amazon Linux | 4.0 Médio | Nenhuma | mesmo vetor do Red Hat |
| SUSE | 6.1 Moderado | Nenhuma | alguns fluxos do SLE 15 marcados como WONTFIX |
| Série | Afetados | Primeira correção |
|---|
| 5.9 – 5.15 | 5.9 até 5.15.191 | 5.15.192 (c1c74584…) |
| 5.16 – 6.1 | 5.16 até 6.1.150 | 6.1.151 (66da7cee…) |
| 6.2 – 6.6 | 6.2 até 6.6.104 | 6.6.105 (7acfa07c…) |
| 6.7 – 6.12 | 6.7 até 6.12.45 | 6.12.46 (41688d1f…) |
| 6.13 – 6.16 | 6.13 até 6.16.0 | 6.16.1 (19341d5c…) |
| mainline | até a correção chegar | 6.17-rc1 (abad3d0b…) |
| Distro | Versões / kernels que estavam na faixa |
|---|
| Ubuntu | 22.04 LTS (5.15), 24.04 LTS (6.8), 25.04 (EOL ainda needed). 20.04 HWE 5.15. |
| Debian | 11 bullseye (5.10), 12 bookworm (6.1), 13 trixie (6.12) |
| RHEL 9 / 10, Rocky, Alma, Fedora | RHEL 9 ≈ 5.14; RHEL 10 ≈ 6.12; Fedora rolling 5.9–6.16 |
| SUSE / openSUSE | SLE Micro 5.3/5.4; alguns fluxos do SLE 15 WONTFIX |
| Amazon Linux 2023 | kernel padrão e kernel6.12 |
| Amazon Linux 2 extras | extra 5.10 (sem correção planejada) e extra 5.15 |
| Arch, Gentoo, Tumbleweed | kernels rolling entre 5.9 e a correção 6.16.1 / 6.17-rc1 |
| Distro | Pacote corrigido (indicativo) | Aviso |
|---|
| Ubuntu 22.04 | linux 5.15.0-163.173 | USN-7909 |
| Ubuntu 24.04 | linux 6.8.0-106.106 | mesmo |
| Debian 12 | linux 6.1.153-1 | DSA-6009-1 |
| Debian 13 | linux 6.12.48-1 | DSA-6008-1 |
| Debian 11 (backport 6.1) | linux-6.1 6.1.153-1~deb11u1 | DLA-4328-1 |
| Amazon Linux 2023 | kernel / kernel6.12, 2025-09-29 | ALAS2023-2025-1210 / 1208 |
| Amazon Linux 2 extra 5.15 | 2025-09-29 | ALAS2KERNEL-5.15-2025-091 |
| Condição | Por que importa |
|---|
CONFIG_BPF_SYSCALL=y | bpf(2) precisa existir |
CONFIG_CGROUP_BPF=y | programas anexados a cgroup e armazenamento local de cgroup |
kernel.unprivileged_bpf_disabled | 0 permite carregamento de programas sem privilégios; 1/2 exigem CAP_BPF / CAP_PERFMON / CAP_SYS_ADMIN |
| Lockdown / LSM / seccomp | podem bloquear BPF_PROG_LOAD ou BPF_PROG_TEST_RUN |
BPF_PROG_TYPE_CGROUP_SKB (ou outros tipos de programa de cgroup que carregam armazenamento local) | o contexto de execução que contém cgroup_storage[] |