mm/mremap:修复 move_page_tables() 中的地址环绕问题(CVE-2024-53111)
CVE编号
CVE-2024-53111
利用情况
暂无
补丁情况
N/A
披露时间
2024-12-02
漏洞描述
在Linux内核中,存在一个关于`mm/mremap`的漏洞已经被修复。这个漏洞出现在`move_page_tables()`函数中处理地址环绕的问题。在32位平台上,由于表达式`len + old_addr < old_end`可能在`len + old_addr`发生环绕时产生误报。在这里,`old_addr`是已移动页面表项的旧范围的游标。如果操作成功,`old_addr`将是旧区域的末尾,向`old_addr`添加`len`可能会导致地址环绕。这种溢出导致`mremap()`错误地认为页面表项(PTE)已经被复制。其后果是,`mremap()`会失败,但在新的虚拟内存区域(VMA)被解除映射之前,它不会将PTE移回,导致该区域的匿名页面丢失。因此,如果用户空间尝试对私有匿名区域进行`mremap()`操作并遇到此漏洞,`mremap()`将返回错误,私有匿名区域的内容似乎已被清零。此检查的意图是`old_end - len`是原始起始地址,以这种方式写检查也更容易阅读。因此,通过相应地重新排列比较来修复检查。(另一种修复方法是通过引入一个“orig_old_start”变量或类似的东西来重构此函数。)在一个32位X86内核的虚拟机中进行测试,发现没有此补丁时:用户尝试通过代码创建一个特定大小的内存映射区域并进行重新映射操作。在没有补丁的情况下运行此代码时,mremap()操作会失败,并且原始映射区域的内容似乎被清零。但应用此补丁后:相同的代码测试会显示mremap()操作成功,并且映射区域的内容得以保留。
解决建议
建议您更新当前系统或软件至最新版,完成漏洞的修复。
文章评论