CVE-2025-39756

Source
https://nvd.nist.gov/vuln/detail/CVE-2025-39756
Import Source
https://storage.googleapis.com/osv-test-cve-osv-conversion/osv-output/CVE-2025-39756.json
JSON Data
https://api.test.osv.dev/v1/vulns/CVE-2025-39756
Downstream
Related
Published
2025-09-11T16:52:26.136Z
Modified
2025-11-28T02:35:12.099818Z
Summary
fs: Prevent file descriptor table allocations exceeding INT_MAX
Details

In the Linux kernel, the following vulnerability has been resolved:

fs: Prevent file descriptor table allocations exceeding INT_MAX

When sysctlnropen 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 _kvmallocnode_noprof+0x21a/0x288

This happens because kvmallocarray() and kvmalloc() check if the requested size exceeds INTMAX and emit a warning when the allocation is not flagged with _GFPNOWARN.

Specifically, when nropen 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 INTMAX = 2,147,483,647)

Reproducer: 1. Set /proc/sys/fs/nropen to 1073741816: # echo 1073741816 > /proc/sys/fs/nropen

  1. 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; }

  2. 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 INTMAX and keeps halving the value until the kernel accepts it. On most systems, this results in nropen 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 allocfdtable() to ensure the requested allocation size does not exceed INTMAX. This causes the operation to fail with -EMFILE instead of triggering a kernel warning and avoids the impractical >8GB memory allocation request.

Database specific
{
    "cna_assigner": "Linux",
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2025/39xxx/CVE-2025-39756.json"
}
References

Affected packages

Git / git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

Affected ranges

Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
9cfe015aa424b3c003baba3841a60dd9b5ad319b
Fixed
b4159c5a90c03f8acd3de345a7f5fc63b0909818
Fixed
f95638a8f22eba307dceddf5aef9ae2326bbcf98
Fixed
749528086620f8012b83ae032a80f6ffa80c45cd
Fixed
628fc28f42d979f36dbf75a6129ac7730e30c04e
Fixed
237e416eb62101f21b28c9e6e564d10efe1ecc6f
Fixed
d4f9351243c17865a8cdbe6b3ccd09d0b13a7bcc
Fixed
9f61fa6a2a89a610120bc4e5d24379c667314b5c
Fixed
dfd1f4ea98c3bd3a03d12169b5b2daa1f0a3e4ae
Fixed
04a2c4b4511d186b0fce685da21085a5d4acd370

Linux / Kernel

Package

Name
Kernel

Affected ranges

Type
ECOSYSTEM
Events
Introduced
2.6.25
Fixed
5.4.297
Type
ECOSYSTEM
Events
Introduced
5.5.0
Fixed
5.10.241
Type
ECOSYSTEM
Events
Introduced
5.11.0
Fixed
5.15.190
Type
ECOSYSTEM
Events
Introduced
5.16.0
Fixed
6.1.149
Type
ECOSYSTEM
Events
Introduced
6.2.0
Fixed
6.6.103
Type
ECOSYSTEM
Events
Introduced
6.7.0
Fixed
6.12.43
Type
ECOSYSTEM
Events
Introduced
6.13.0
Fixed
6.15.11
Type
ECOSYSTEM
Events
Introduced
6.16.0
Fixed
6.16.2