maple_tree:纠正跨度存储上的树损坏(CVE-2024-50200)
CVE编号
CVE-2024-50200利用情况
暂无补丁情况
N/A披露时间
2024-11-08漏洞描述
以下是漏洞描述的中文翻译:在Linux内核中,已经解决了一个漏洞,该漏洞与maple_tree有关:补丁系列“maple_tree:修正跨越存储时的树损坏”,版本3。存在一个棘手但微妙的maple树损坏漏洞,似乎自该算法诞生之初就已存在。自从提交名为“mm/mmap:避免在mmap_region()中清空vma树”(commit f8d112a4e657)的提交后,这个漏洞似乎更容易发生,也是从这个点开始,有关此漏洞的报告开始提交。我们之所以能够确定这个漏洞,要归功于Bert Karwatzki的善意努力,他极大地帮助了我追踪并确定造成此问题的原因。当尝试在两个叶节点之间进行跨越存储时,就会出现此漏洞,其中右叶节点是共享父节点的最右边的子节点,并且存储完全消耗了右模式节点。这种情况下,mas_wr_spanning_store()会错误地复制范围内的新和现有条目到最大枢轴点,从而导致maple树损坏。修复补丁通过检测这种情况并禁止错误的重复复制来纠正这一点。补丁提交信息详细说明了这是如何发生的。此外,此系列还包括一个可靠地重现问题的测试,并断言修复是正确的。Bert已经测试了修复并确认解决了他的问题。Mikhail Gavrilov也报告了一个似乎与此完全相同的bug,此修复也应该能解决它。关于这个补丁的详细内容如下:从maple树的实现一开始,就存在一个微妙的bug。这源于如何进行存储操作的方式。当发生存储时,它会覆盖重叠的范围并根据需要调整树的结构来适应这一点。一个范围可能始终跨越两个叶节点。在这种情况下,我们遍历这两个叶节点,确定哪些元素在范围的开始和结束左侧和右侧没有被覆盖,然后重新平衡树以包含这些条目和刚刚插入的条目。这种存储被称为“跨越存储”,由mas_wr_spanning_store()实现。为了到达这个阶段,mas_store_gfp()依次调用mas_wr_preallocate(),mas_wr_store_type()和mas_wr_walk(),遍历树并更新对象(mas),以到达应执行写操作的位置,并确定其存储类型。当需要跨越存储时,该函数返回false并停止在包含目标范围的父节点上,mas_wr_store_type()将mas->store_type标记为wr_spanning_store来表示这一情况。当我们准备执行存储操作时,在mas_wr_spanning_store()中,我们首先确定我们希望存储的范围之后的元素(即要插入的条目之后的位置),这是通过走到树中的下一个枢轴点(即r_mas.last + 1)开始的,从刚刚确定的包含我们打算写入的范围的节点开始。然后我们将注意力转向要插入的条目左侧的条目,其状态由l_mas表示,并将它们复制到一个“大节点”中。“大节点”是一个包含足够槽位以包含两个叶节点数据的特殊节点。然后我们复制我们要存储的条目紧接着这个“大节点”,通过mas_store_b_node()来完成复制和插入新条目的操作。之后如果尚未超过节点的长度(即r_mas.offset <= r_mas.end),我们将复制范围之外的元素到右边。问题就出在这里——在某些特定情况下,这个逻辑可能会出错并损坏maple树。考虑以下树的情况:高度 0 根节点 / \ pivot = 0xffff / \ pivot = ULONG_MAX / 在此情况下发生了树损坏的漏洞。解决建议
"将组件 Linux 升级至 6.1 及以上版本"受影响软件情况
# | 类型 | 厂商 | 产品 | 版本 | 影响面 | ||||
1 | |||||||||
---|---|---|---|---|---|---|---|---|---|
运行在以下环境 | |||||||||
系统 | debian_11 | linux | * | Up to (excluding) 5.10.226-1 | |||||
运行在以下环境 | |||||||||
系统 | debian_12 | linux | * | Up to (excluding) 6.1.115-1 |
- 攻击路径 N/A
- 攻击复杂度 N/A
- 权限要求 N/A
- 影响范围 N/A
- 用户交互 N/A
- 可用性 N/A
- 保密性 N/A
- 完整性 N/A
CWE-ID | 漏洞类型 |
Exp相关链接

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