CVE-2025-71159CVE-2025-71159是Linux内核btrfs文件系统中的一个高危内存安全漏洞,CVSS评分达到7.8分。该漏洞存在于btrfs_get_or_create_delayed_node()函数中,由于内存屏障处理不当导致use-after-free条件。漏洞的根本原因在于btrfs_get_or_create_delayed_node()函数中refcount_set操作的重新排列。原始实现中,refcount_set操作在获取root->delayed_nodes锁之前执行,而后续的提交e8513c012de7将refcount_set移至临界区内。这一变更破坏了原有的内存顺序保证,导致node->refs和btrfs_inode->delayed_node的存储操作可能乱序可见。本地低权限攻击者可通过触发特定竞态条件,读取尚未设置的delayed_node指针并尝试增加尚未初始化的引用计数,从而触发引用计数错误和use-after-free警告。该漏洞影响Linux内核的btrfs文件系统组件,攻击复杂度低,无需用户交互即可触发。
该漏洞的技术核心在于内存屏障缺失导致的指令重排问题。在btrfs_get_or_create_delayed_node()函数中,commit e8513c012de7将refcount_set操作从锁外移至锁内,但这一变更引入了严重的内存顺序问题。原始设计中,锁获取操作提供了隐式的内存屏障,确保refcount_set和btrfs_inode->delayed_node赋值操作的顺序性。修改后,这两个关键存储操作之间缺乏同步原语保护。当一个线程正在初始化delayed_node时,另一个线程可能通过btrfs_inode->delayed_node读取到部分初始化的对象指针,并尝试对其执行refcount_inc操作。由于此时引用计数尚未设置,refcount_inc将操作一个未初始化的atomic_t变量,导致引用计数损坏。攻击者可通过创建两个执行路径:一个线程持续调用btrfs_get_or_create_delayed_node()创建新节点,另一个线程尝试访问这些节点,触发use-after-free条件。修复方案是将refcount_set操作恢复至锁获取之前,利用锁的隐式内存屏障保证内存顺序,同时将分配模式从GFP_ATOMIC改为GFP_NOFS以优化性能。