CVE-2025-40040 json
mm/ksm: fix flag-dropping behavior in ksm_madvise
published 2025-10-28 12 mo ago modified 2026-10-19 20 d ago also EUVD-2025-36488
- cvss
- 7.8
- version 3.1, CNA
- cisa kev
- Not listed
- not in CISA's catalog
- epss
- 0.4%
- EPSS 0.4% chance of exploitation in 30 days, percentile 31%
- public exploits
- 0
- none known
Summary
In the Linux kernel, the following vulnerability has been resolved:
mm/ksm: fix flag-dropping behavior in ksm_madvise
syzkaller discovered the following crash: (kernel BUG)
[ 44.607039] ------------[ cut here ]------------ [ 44.607422] kernel BUG at mm/userfaultfd.c:2067! [ 44.608148] Oops: invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC KASAN NOPTI [ 44.608814] CPU: 1 UID: 0 PID: 2475 Comm: reproducer Not tainted 6.16.0-rc6 #1 PREEMPT(none) [ 44.609635] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014 [ 44.610695] RIP: 0010:userfaultfd_release_all+0x3a8/0x460
<snip other registers, drop unreliable trace>
[ 44.617726] Call Trace: [ 44.617926] <TASK> [ 44.619284] userfaultfd_release+0xef/0x1b0 [ 44.620976] __fput+0x3f9/0xb60 [ 44.621240] fput_close_sync+0x110/0x210 [ 44.622222] __x64_sys_close+0x8f/0x120 [ 44.622530] do_syscall_64+0x5b/0x2f0 [ 44.622840] entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 44.623244] RIP: 0033:0x7f365bb3f227
Kernel panics because it detects UFFD inconsistency during userfaultfd_release_all(). Specifically, a VMA which has a valid pointer to vma->vm_userfaultfd_ctx, but no UFFD flags in vma->vm_flags.
The inconsistency is caused in ksm_madvise(): when user calls madvise() with MADV_UNMEARGEABLE on a VMA that is registered for UFFD in MINOR mode, it accidentally clears all flags stored in the upper 32 bits of vma->vm_flags.
Assuming x86_64 kernel build, unsigned long is 64-bit and unsigned int and int are 32-bit wide. This setup causes the following mishap during the &= ~VM_MERGEABLE assignment.
VM_MERGEABLE is a 32-bit constant of type unsigned int, 0x8000'0000. After ~ is applied, it becomes 0x7fff'ffff unsigned int, which is then promoted to unsigned long before the & operation. This promotion fills upper 32 bits with leading 0s, as we're doing unsigned conversion (and even for a signed conversion, this wouldn't help as the leading bit is 0). & operation thus ends up AND-ing vm_flags with 0x0000'0000'7fff'ffff instead of intended 0xffff'ffff'7fff'ffff and hence accidentally clears the upper 32-bits of its value.
Fix it by changing `VM_MERGEABLE` constant to unsigned long, using the BIT() macro.
Note: other VM_* flags are not affected: This only happens to the VM_MERGEABLE flag, as the other VM_* flags are all constants of type int and after ~ operation, they end up with leading 1 and are thus converted to unsigned long with leading 1s.
Note 2: After commit 31defc3b01d9 ("userfaultfd: remove (VM_)BUG_ON()s"), this is no longer a kernel BUG, but a WARNING at the same place:
[ 45.595973] WARNING: CPU: 1 PID: 2474 at mm/userfaultfd.c:2067
but the root-cause (flag-drop) remains the same.
[akpm@linux-foundation.org: rust bindgen wasn't able to handle BIT(), from Miguel]
Patch / fix
- Linux Linux 5.4.302, 5.10.247, 5.15.197, 6.1.158, 6.6.114, 6.12.55, 6.17.3, 6.18
- linux Debian 12 6.1.158-1
- linux Debian 13 6.12.57-1
- linux Debian 14 6.17.6-1
debian advisories DEBIAN-CVE-2025-40040
- linux Ubuntu 22.04 LTS 5.15.0-173.183
- linux Ubuntu 25.10 6.17.0-14.14
- linux-aws Ubuntu 22.04 LTS 5.15.0-1103.110
- linux-aws Ubuntu 25.10 6.17.0-1007.7
- linux-gcp Ubuntu 22.04 LTS 5.15.0-1103.112
- linux-gcp Ubuntu 25.10 6.17.0-1007.7
- linux-gke Ubuntu 22.04 LTS 5.15.0-1099.105
- linux-ibm Ubuntu 22.04 LTS 5.15.0-1097.100
ubuntu advisories UBUNTU-CVE-2025-40040
Ubuntu security data © Canonical Ltd., from https://github.com/canonical/ubuntu-security-notices via OSV; changed: normalised to fixed package versions per release. CC BY-SA 4.0
- kernel-source Linux Micro 6.1, Linux Micro 6.0 6.4.0-38.1
- kernel-default Linux Micro 6.1, Linux Micro 6.0 6.4.0-38.1
- kernel-kvmsmall Linux Micro 6.1, Linux Micro 6.0 6.4.0-38.1
- kernel-default-base Linux Micro 6.1, Linux Micro 6.0 6.4.0-38.1.21.15
- kernel-rt Linux Micro 6.1, Linux Micro 6.0 6.4.0-39.1
- kernel-source-rt Linux Micro 6.1, Linux Micro 6.0 6.4.0-39.1
- kernel-rt SLE Micro 5.5 5.14.21-150500.13.115.2
- kernel-source-rt SLE Micro 5.5 5.14.21-150500.13.115.1
suse advisories SUSE-SU-2026:20473-1SUSE-SU-2026:20496-1SUSE-SU-2026:20039-1SUSE-SU-2026:20059-1SUSE-SU-2026:0034-1SUSE-SU-2026:0033-1
- kernel-source-longterm openSUSE Tumbleweed 6.18.16-1.1
- kernel-rt openSUSE Leap 16.0 6.12.0-160000.7.1
- dtb-aarch64 openSUSE Leap 16.0 6.12.0-160000.7.1
- kernel-64kb openSUSE Leap 16.0 6.12.0-160000.7.1
- kernel-syms openSUSE Leap 16.0 6.12.0-160000.7.1
- kernel-obs-qa openSUSE Leap 16.0 6.12.0-160000.7.1
- kernel-source openSUSE Leap 16.0 6.12.0-160000.7.1
- kernel-default openSUSE Leap 16.0 6.12.0-160000.7.1
opensuse advisories openSUSE-SU-2026:10301-1openSUSE-SU-2025:20091-1openSUSE-SU-2025:15702-1
- kernel Azure Linux 3.0 6.6.117.1-1
- kernel CBL-Mariner 2.0 5.15.200.1-1
azure linux advisories AZL-68870AZL-78386
Azure Linux vulnerability data, Copyright (c) Microsoft Corporation, from https://github.com/microsoft/AzureLinuxVulnerabilityData via OSV, under the MIT licence; changed: normalised to fixed package versions per release. MIT
- git.kernel.org/stable/c/850f1ea245bdc0ce6a3fd36bfb80d8cf9647cb71 commit
- git.kernel.org/stable/c/788e5385d0ff69cdba1cabccb9dab8d9647b9239 commit
- git.kernel.org/stable/c/b69f19244c2b6475c8a6eb72f0fb0d53509e48cd commit
- git.kernel.org/stable/c/41cb9fd904fe0c39d52e82dd84dc3c96b7aa9693 commit
- git.kernel.org/stable/c/92b82e232b8d8b116ac6e57aeae7a6033db92c60 commit
- git.kernel.org/stable/c/ac50c6e0a8f91a02b681af81abb2362fbb67cc18 commit
- git.kernel.org/stable/c/76385629f45740b7888f8fcd83bde955b10f61fe commit
- git.kernel.org/stable/c/f04aad36a07cc17b7a5d5b9a2d386ce6fae63e93 commit
Vendor advisories
What the vendors themselves say about their products: affected, fixed or not affected, and what to do.
red hat product security vex CVE-2025-40040 updated cvss 5.8
kernel: mm/ksm: fix flag-dropping behavior in ksm_madvise
-
Red Hat Enterprise Linux 6 perf, kernel, python-perf, kernel-kdump, kernel-firmware, kernel-bootwrapper, +1 moreaffected: workaround, no fix planned “Out of support scope”
-
Red Hat Enterprise Linux 9 rv, perf, rtla, kernel, bpftool, libperf, +83 more Red Hat Enterprise Linux 10 kernelaffected: workaround, no fix available
-
Red Hat Enterprise Linux 7 perf, kernel, bpftool, kernel-rt, python-perf, kernel-kdump, +8 more Red Hat Enterprise Linux 8 perf, kernel, bpftool, kernel-rt, kernel-core, kernel-tools, +29 morenot affected: vulnerable code not present
Red Hat CSAF VEX © Red Hat, Inc., from https://security.access.redhat.com/data/csaf/v2/vex/; changed: reduced to product statuses and remediations. CC BY 4.0 · csaf
CISA SSVC
- Exploitation
- none
- Automatable
- no
- Technical impact
- total
- Assessed
- 24 d ago
Exploit prediction
0.38% chance of exploitation in the next 30 days, higher than 31% of all scored CVEs (FIRST EPSS, 2026-11-08).
CVSS scores
| assigned by | version | score | vector |
|---|---|---|---|
| CNA | 3.1 | 7.8 | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| NVD | 3.1 | 5.5 | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H |
Affected products
- Linux Linux
Classification
- Technology feeds
References
-
git.kernel.org
/stable/c/850f1ea245bdc0ce6a3fd36bfb80d8cf9647cb71
patch
-
git.kernel.org
/stable/c/788e5385d0ff69cdba1cabccb9dab8d9647b9239
patch
-
git.kernel.org
/stable/c/b69f19244c2b6475c8a6eb72f0fb0d53509e48cd
patch
-
git.kernel.org
/stable/c/41cb9fd904fe0c39d52e82dd84dc3c96b7aa9693
patch
-
git.kernel.org
/stable/c/92b82e232b8d8b116ac6e57aeae7a6033db92c60
patch
-
git.kernel.org
/stable/c/ac50c6e0a8f91a02b681af81abb2362fbb67cc18
patch
-
git.kernel.org
/stable/c/76385629f45740b7888f8fcd83bde955b10f61fe
patch
-
git.kernel.org
/stable/c/f04aad36a07cc17b7a5d5b9a2d386ce6fae63e93
patch
Sources
- CVE List CVE-2025-40040
- NVD CVE-2025-40040
Fencer Vulns keeps one entry per vulnerability: the CVE id wins, then GHSA, and records that alias each other are merged, except that two CVEs always keep separate entries. The same data is available as JSON.