mm/mremap:修复 move_normal_pmd/retract_page_tables 竞争 (CVE-2024-50066)
CVE编号
CVE-2024-50066利用情况
暂无补丁情况
N/A披露时间
2024-10-23漏洞描述
在Linux内核中,已经解决了一个漏洞,具体描述如下:该漏洞存在于mm/mremap中,涉及move_normal_pmd和retract_page_tables之间的竞态条件。在mremap()函数中,move_page_tables()会根据PMD条目的类型和指定的地址范围来确定应该使用哪种方法来移动下一组页面表条目。此时,mmap_lock以写模式持有,但尚未持有rmap锁。对于指向页面表并由源地址范围完全覆盖的PMD条目,会调用move_pgt_entry(NORMAL_PMD, ...),该函数首先获取rmap锁,然后执行move_normal_pmd()。move_normal_pmd()会在源和目标处获取必要的页面表锁,然后将整个页面表从源移动到目标。问题是:在PMD条目被读取并决定如何移动它之后,才获取保护THP代码中并发页面表移除的rmap锁。因此,可能会出现以下竞态情况(两个进程具有相同tmpfs文件的映射,该tmpfs挂载在具有advise属性的大页面上):进程A: mremap -> mremap_to -> move_vma -> move_page_tables -> get_old_pmd -> alloc_new_pmd (此时进程B开始操作)进程B: madvise(MADV_COLLAPSE)-> do_madvise -> madvise_walk_vmas -> madvise_vma_behavior -> madvise_collapse -> hpage_collapse_scan_file -> collapse_file -> retract_page_tables (进程A继续执行)当这种情况发生时,move_normal_pmd()可能会在`pmd_populate(mm, new_pmd, pmd_pgtable(pmd))`这一行创建虚假的PMD条目。影响取决于特定的架构和机器细节;在x86上,你可能会将物理页面0映射为页面表,这可能导致用户到内核的权限提升被利用。通过让进程B在获取rmap锁后重新检查PMD是否仍然指向页面表来解决这个竞态条件。否则,我们将退出并让调用者回退到PTE级别的复制路径,该路径将在pmd_none()检查处立即失败。关于漏洞的可访问性:触发此漏洞需要创建shmem/文件THP映射,匿名THP使用不同的代码,不会在rmap锁下清除内容。文件THP依赖于实验性的配置标志(CONFIG_READ_ONLY_THP_FOR_FS),因此在正常的发行版内核上,需要使用shmem THP来触发此漏洞。据我所知,要在挂载点上使用正确的挂载标志来挂载自己的tmpfs才能获得shmem THP,这可能需要创建自己的用户和挂载命名空间;尽管我不知道某些发行版是否默认启用shmem THP或类似的东西。关于漏洞的影响:当漏洞可访问时,此问题可能被用于用户到内核的权限提升。解决建议
建议您更新当前系统或软件至最新版,完成漏洞的修复。受影响软件情况
# | 类型 | 厂商 | 产品 | 版本 | 影响面 | ||||
1 | |||||||||
---|---|---|---|---|---|---|---|---|---|
运行在以下环境 | |||||||||
系统 | debian_11 | linux | * | Up to (excluding) 5.10.226-1 | |||||
运行在以下环境 | |||||||||
系统 | debian_12 | linux | * | Up to (excluding) 6.1.112-1 |
- 攻击路径 N/A
- 攻击复杂度 N/A
- 权限要求 N/A
- 影响范围 N/A
- 用户交互 N/A
- 可用性 N/A
- 保密性 N/A
- 完整性 N/A
CWE-ID | 漏洞类型 |
Exp相关链接

版权声明
本站原创文章转载请注明文章出处及链接,谢谢合作!
评论