CVE-2025-39756

In the Linux kernel, the following vulnerability has been resolved: fs: Prevent file descriptor table allocations exceeding INT_MAX When sysctl_nr_open is set to a very high value (for example, 1073741816 as set by systemd), processes attempting to use file descriptors near the limit can trigger massive memory allocation attempts that exceed INT_MAX, resulting in a WARNING in mm/slub.c: WARNING: CPU: 0 PID: 44 at mm/slub.c:5027 __kvmalloc_node_noprof+0x21a/0x288 This happens because kvmalloc_array() and kvmalloc() check if the requested size exceeds INT_MAX and emit a warning when the allocation is not flagged with __GFP_NOWARN. Specifically, when nr_open is set to 1073741816 (0x3ffffff8) and a process calls dup2(oldfd, 1073741880), the kernel attempts to allocate: - File descriptor array: 1073741880 * 8 bytes = 8,589,935,040 bytes - Multiple bitmaps: ~400MB - Total allocation size: > 8GB (exceeding INT_MAX = 2,147,483,647) Reproducer: 1. Set /proc/sys/fs/nr_open to 1073741816: # echo 1073741816 > /proc/sys/fs/nr_open 2. Run a program that uses a high file descriptor: #include <unistd.h> #include <sys/resource.h> int main() { struct rlimit rlim = {1073741824, 1073741824}; setrlimit(RLIMIT_NOFILE, &rlim); dup2(2, 1073741880); // Triggers the warning return 0; } 3. Observe WARNING in dmesg at mm/slub.c:5027 systemd commit a8b627a introduced automatic bumping of fs.nr_open to the maximum possible value. The rationale was that systems with memory control groups (memcg) no longer need separate file descriptor limits since memory is properly accounted. However, this change overlooked that: 1. The kernel's allocation functions still enforce INT_MAX as a maximum size regardless of memcg accounting 2. Programs and tests that legitimately test file descriptor limits can inadvertently trigger massive allocations 3. The resulting allocations (>8GB) are impractical and will always fail systemd's algorithm starts with INT_MAX and keeps halving the value until the kernel accepts it. On most systems, this results in nr_open being set to 1073741816 (0x3ffffff8), which is just under 1GB of file descriptors. While processes rarely use file descriptors near this limit in normal operation, certain selftests (like tools/testing/selftests/core/unshare_test.c) and programs that test file descriptor limits can trigger this issue. Fix this by adding a check in alloc_fdtable() to ensure the requested allocation size does not exceed INT_MAX. This causes the operation to fail with -EMFILE instead of triggering a kernel warning and avoids the impractical >8GB memory allocation request.
Configurations

Configuration 1 (hide)

OR cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*

Configuration 2 (hide)

cpe:2.3:o:debian:debian_linux:11.0:*:*:*:*:*:*:*

History

19 Oct 2026, 21:10

Type Values Removed Values Added
Summary
  • (es) En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta: fs: Evitar asignaciones de tablas de descriptores de archivo que excedan INT_MAX Cuando sysctl_nr_open se establece en un valor muy alto (por ejemplo, 1073741816 como lo establece systemd), los procesos que intentan usar descriptores de archivo cerca del límite pueden desencadenar intentos masivos de asignación de memoria que exceden INT_MAX, lo que resulta en una ADVERTENCIA en mm/slub.c: WARNING: CPU: 0 PID: 44 at mm/slub.c:5027 __kvmalloc_node_noprof+0x21a/0x288 Esto sucede porque kvmalloc_array() y kvmalloc() verifican si el tamaño solicitado excede INT_MAX y emiten una advertencia cuando la asignación no está marcada con __GFP_NOWARN. Específicamente, cuando nr_open se establece en 1073741816 (0x3ffffff8) y un proceso llama a dup2(oldfd, 1073741880), el kernel intenta asignar: - Matriz de descriptores de archivo: 1073741880 * 8 bytes = 8,589,935,040 bytes - Múltiples mapas de bits: ~400MB - Tamaño total de asignación: > 8GB (excediendo INT_MAX = 2,147,483,647) Reproductor: 1. Establecer /proc/sys/fs/nr_open en 1073741816: # echo 1073741816 > /proc/sys/fs/nr_open 2. Ejecutar un programa que usa un descriptor de archivo alto: #include <unistd.h> #include <sys/resource> int main() { struct rlimit rlim = {1073741824, 1073741824}; setrlimit(RLIMIT_NOFILE, &rlim); dup2(2, 1073741880); // Desencadena la advertencia return 0; } 3. Observar ADVERTENCIA en dmesg en mm/slub.c:5027 El commit a8b627a de systemd introdujo el aumento automático de fs.nr_open al valor máximo posible. La razón era que los sistemas con grupos de control de memoria (memcg) ya no necesitan límites de descriptores de archivo separados, ya que la memoria se contabiliza correctamente. Sin embargo, este cambio pasó por alto que: 1. Las funciones de asignación del kernel aún imponen INT_MAX como tamaño máximo, independientemente de la contabilidad de memcg 2. Los programas y pruebas que prueban legítimamente los límites de descriptores de archivo pueden desencadenar inadvertidamente asignaciones masivas 3. Las asignaciones resultantes (>8GB) son poco prácticas y siempre fallarán El algoritmo de systemd comienza con INT_MAX y sigue reduciendo el valor a la mitad hasta que el kernel lo acepta. En la mayoría de los sistemas, esto resulta en que nr_open se establece en 1073741816 (0x3ffffff8), lo que equivale a poco menos de 1GB de descriptores de archivo. Si bien los procesos rara vez usan descriptores de archivo cerca de este límite en operación normal, ciertas autopruebas (como tools/testing/selftests/core/unshare_test.c) y programas que prueban los límites de descriptores de archivo pueden desencadenar este problema. Solucione esto agregando una verificación en alloc_fdtable() para asegurar que el tamaño de asignación solicitado no exceda INT_MAX. Esto hace que la operación falle con -EMFILE en lugar de desencadenar una advertencia del kernel y evita la solicitud de asignación de memoria poco práctica de >8GB.

15 Oct 2026, 02:17

Type Values Removed Values Added
References
  • () https://cert-portal.siemens.com/productcert/html/ssa-457936.html -

Information

Published : 2025-09-11 17:15

Updated : 2026-10-19 21:10


NVD link : CVE-2025-39756

Mitre link : CVE-2025-39756

CVE.ORG link : CVE-2025-39756


JSON object : View

Products Affected

debian

  • debian_linux

linux

  • linux_kernel
CWE
CWE-401

Missing Release of Memory after Effective Lifetime