CVE-2023-53538CVE-2023-53538是Linux内核BTRFS文件系统中存在的一个竞争条件漏洞,存在于树修改日志(tree mod log)回退(rewind)机制中。该漏洞位于push_node_left函数中,由于缺少对MOVE操作的树修改日志插入,当逻辑inode解析获取一个树修改日志序列号后,在回溯引用(backref walking)过程中遇到繁忙节点的回退操作时,可能触发内核空指针解引用,导致内核崩溃(kernel panic)。具体表现为BTRFS critical错误(unable to find logical 0 length 4096)后出现NULL pointer dereference,调用栈涉及__btrfs_map_block、btrfs_map_bio、btrfs_submit_metadata_bio等关键I/O路径函数。该漏洞的影响范围仅限于本地攻击者,需要低权限即可触发,无需用户交互。虽然机密性和完整性不受影响,但会导致系统可用性完全丧失(内核panic),属于典型的本地拒绝服务(DoS)漏洞。该漏洞已在Linux内核稳定分支中通过提交11f14402fe3437852cb44945b3b9f1bdb4032956和5cead5422a0e3d13b0bcee986c0f5c4ebb94100b进行修复,CVSS评分为5.5分,严重等级为MEDIUM。
该漏洞的根本原因是BTRFS的push_node_left函数在执行节点移动操作时,没有正确地在树修改日志中记录MOVE操作。树修改日志用于在COW(Copy-on-Write)操作期间跟踪对B树节点的所有修改,以便在需要时进行回退。当发生以下特定序列的操作时会产生问题:首先执行一系列REMOVE_WHILE_FREEING操作清空节点,然后执行REMOVE和ADD操作重建节点内容,最后执行MOVE操作将数据从源slot移动到目标slot。当btrfs_tree_mod_log_rewind尝试回退这些操作时,它会分配一个新的回退extent buffer(rewind eb),先插入533个元素的正确键信息,然后用后续的ADD操作覆盖前456个元素,再通过memmove执行MOVE回退(456:988->0:532)。由于从未写入超过532位置的数据,而MOVE回退尝试从未初始化的内存区域读取数据,导致读取到无效的内存内容,最终触发NULL指针解引用。攻击者需要具有本地低权限访问权限,通过触发特定的BTRFS文件系统操作(如btrfs_ioctl_logical_to_ino)即可触发该竞争条件,导致系统崩溃。