CVE-2023-53618CVE-2023-53618是Linux内核btrfs文件系统中存在的一个安全漏洞。该漏洞源于btrfs在处理重定位树(reloc tree)根键时缺乏有效的验证机制。当内核遇到损坏的磁盘数据时,可能触发prepare_to_merge()函数中的ASSERT()断言,导致系统崩溃。
具体而言,btrfs文件系统使用重定位树来处理子卷的写时复制(COW)操作,但重定位树只能为子卷(subvolume)创建,因为只有子卷树才能与其他树共享树块(具有BTRFS_ROOT_SHAREABLE标志)。对于非子卷树,内核直接对涉及的树块进行COW操作,无需创建重定位树。然而,当磁盘上的元数据损坏时,可能导致内核为非子卷树(如quota tree)错误地创建重定位树根键,从而触发断言失败。
该漏洞由syzbot模糊测试工具发现。当内核检测到重定位树不匹配时(例如出现错误信息"reloc tree mismatch, root 8 has no reloc root"),系统会触发栈转储(stack dump)并崩溃。该漏洞的CVSS评分为5.5,属于中等严重等级,攻击者需要本地低权限访问即可触发,但不需要用户交互,主要影响系统的可用性。
从技术层面分析,该漏洞涉及btrfs文件系统的重定位树管理机制。在btrfs中,当进行写时复制操作时,如果涉及子卷的共享树块,内核会创建重定位树来跟踪这些块的移动。然而,重定位树机制仅适用于子卷树,因为只有子卷才具有BTRFS_ROOT_SHAREABLE标志。
漏洞的根本原因是tree-checker未对根键(root key)进行充分的验证。当磁盘上的元数据损坏时,内核可能接收到无效的重定位树根键,例如对象ID为TREE_RELOC_OBJECTID但类型为ROOT_ITEM且目标对象为QUOTA_TREE_OBJECTID的键。这种键表示为配额树创建了重定位树,但实际上配额树不是子卷,不应该拥有重定位树。
在prepare_to_merge()函数中,存在一个ASSERT()断言,用于确保重定位树被其子卷树正确指向。当遇到上述无效的重定位树时,该断言会被触发,导致内核崩溃并输出栈转储信息。
修复方案包括两个层面:首先,在tree-checker中添加对根键的验证,确保重定位树只能为子卷创建;其次,在prepare_to_merge()函数中进行优雅的退出处理,而不是直接触发断言失败。这种双重防御策略可以有效防止因磁盘数据损坏导致的系统崩溃。