CVE-2025-40040CVE-2025-40040是Linux内核中的一个中等严重性安全漏洞,位于mm/ksm.c文件中的ksm_madvise函数。该漏洞由于在处理MADV_UNMERGEABLE时意外清除vm_flags结构体的高32位标志位而导致。漏洞的根本原因在于VM_MERGEABLE常量被定义为32位无符号整数(0x80000000),当对其进行按位取反操作(~VM_MERGEABLE)时,由于类型提升规则,表达式被提升为unsigned long后,高32位被填充为0而非预期的全1。这导致在执行&=操作时,vm_flags的高32位被意外清除,使得注册了userfaultfd的VMA(虚拟内存区域)的UFFD标志被移除,造成内核检测到VMA状态不一致并触发kernel BUG或WARNING。攻击者可通过本地低权限进程调用madvise(MADV_UNMERGEABLE)触发此漏洞,可能导致系统崩溃(拒绝服务)。该漏洞由syzkaller模糊测试发现,影响运行6.16.0-rc6及之前版本内核的系统。
漏洞位于Linux内核的ksm_madvise函数中,当用户空间程序对一个已注册userfaultfd(UFFD)的VMA调用madvise(MADV_UNMERGEABLE)时触发。问题的核心是C语言类型提升规则导致位运算错误:VM_MERGEABLE定义为32位常量(unsigned int)值0x80000000,当执行~VM_MERGEABLE时,结果为0x7fffffff(unsigned int)。在后续的&=操作中,0x7fffffff被提升为unsigned long时,高32位填充为0(因为unsigned转换),最终表达式变为vm_flags & 0x000000007fffffff,而非预期的0xffffffff7fffffff。这导致vma->vm_flags的高32位被意外清零,包括存储在其中的userfaultfd上下文指针。内核在userfaultfd_release_all中检测到VMA有有效的vma->vm_userfaultfd_ctx但缺少UFFD标志,触发kernel BUG(早期版本)或WARNING(commit 31defc3b01d9之后)。攻击者需要本地低权限访问即可触发,成功利用可导致系统内核崩溃。