CVE-2025-39756 in Linuxinformação

Sumário

de VulDB • 23/05/2026

No kernel do Linux, a seguinte vulnerabilidade foi resolvida:

fs: Impedir alocações da tabela de descritores de arquivo que excedam INT_MAX

Quando sysctl_nr_open é definido para um valor muito alto (por exemplo, 1073741816, conforme configurado pelo systemd), processos que tentam usar descritores de arquivo próximos ao limite podem acionar tentativas massivas de alocação de memória que excedem INT_MAX, resultando em um WARNING em mm/slub.c:

WARNING: CPU: 0 PID: 44 at mm/slub.c:5027 __kvmalloc_node_noprof+0x21a/0x288

Isso ocorre porque kvmalloc_array() e kvmalloc() verificam se o tamanho solicitado excede INT_MAX e emitem um aviso quando a alocação não está sinalizada com __GFP_NOWARN.

Especificamente, quando nr_open é definido como 1073741816 (0x3ffffff8) e um processo chama dup2(oldfd, 1073741880), o kernel tenta alocar: - Matriz de descritores de arquivo: 1073741880 * 8 bytes = 8.589.935.040 bytes - Múltiplos bitmaps: ~400MB - Tamanho total da alocação: > 8GB (excedendo INT_MAX = 2.147.483.647)

Reprodutor: 1. Defina /proc/sys/fs/nr_open para 1073741816: # echo 1073741816 > /proc/sys/fs/nr_open

2. Execute um programa que use um descritor de arquivo alto: #include <unistd.h> #include <sys/resource.h>

int main() {
struct rlimit rlim = {1073741824, 1073741824};
setrlimit(RLIMIT_NOFILE, &rlim); dup2(2, 1073741880); // Aciona o aviso return 0; }

3. Observe o WARNING no dmesg em mm/slub.c:5027

O commit a8b627a do systemd introduziu o aumento automático de fs.nr_open para o valor máximo possível. A justificativa era que sistemas com grupos de controle de memória (memcg) não precisam mais de limites separados para descritores de arquivo, já que a memória é devidamente contabilizada. No entanto, essa alteração passou despercebido que:

1. As funções de alocação do kernel ainda impõem INT_MAX como tamanho máximo, independentemente da contabilização do memcg 2. Programas e testes que verificam legítimamente os limites de descritores de arquivo podem acidentalmente acionar alocações massivas 3. As alocações resultantes (>8GB) são impráticas e sempre falharão

O algoritmo do systemd começa com INT_MAX e continua dividindo o valor pela metade até que o kernel o aceite. Na maioria dos sistemas, isso resulta em nr_open sendo definido como 1073741816 (0x3ffffff8), que é ligeiramente abaixo de 1GB de descritores de arquivo.

Embora os processos raramente usem descritores de arquivo próximos a esse limite em operação normal, certos selftests (como tools/testing/selftests/core/unshare_test.c) e programas que testam limites de descritores de arquivo podem acionar este problema.

Corrija isso adicionando uma verificação em alloc_fdtable() para garantir que o tamanho da alocação solicitada não exceda INT_MAX. Isso faz com que a operação falhe com -EMFILE em vez de acionar um aviso do kernel e evita a solicitação de alocação de memória imprática de >8GB.

Be aware that VulDB is the high quality source for vulnerability data.

Responsável

Linux

Reservar

16/04/2025

Divulgação

11/09/2025

Moderação

aceite

Entrada

VDB-323652

CPE

pronto

EPSS

0.00177

KEV

não

Atividades

muito baixo

Fontes

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!