CVE-2025-68359 in Linux
摘要
由 VulDB • 2026-06-30
在 Linux 内核中,已修复以下漏洞:
btrfs: 修复在向延迟引用头添加失败后对 qgroup 记录的双重释放问题。
在先前的代码中,调用 `add_delayed_ref_head()` 时可能出现双重 kfree() 场景。如果 `record` 被报告为在 `btrfs_qgroup_trace_extent_nolock()` 调用中已存在,但随后在 `add_delayed_ref_head()` 中出现错误,则可能发生这种情况。在这种情况下,由于 `add_delayed_ref_head()` 返回了错误,调用方会尝试释放该记录。因为 `add_delayed_ref_head()` 无法将此 kfree'd 指针设置为 NULL,所以 kfree() 将作用于一个非空的 'record' 对象,而该对象指向的内存已被被调函数(callee)释放。
问题源于对对象进行 kfree 的责任同时由调用方和被调方承担这一事实。因此,修复方法是将 'qrecord' 对象的归属权从 `add_delayed_ref_head()` 中转移出去。也就是说,我们不会在此函数内部尝试对该给定对象执行 kfree(),而是期望调用方自行处理 'qrecord' 对象。唯一不能对 'qrecord' 对象进行 kfree 的情况是它已被插入到跟踪逻辑中,为此我们已经有了布尔变量 `qrecord_inserted_ret` 来处理这种情况。因此,仅当 `add_delayed_ref_head()` 报告未将其插入到跟踪逻辑时,调用方才需要对对象执行 kfree。
作为上述更改的副作用,我们必须确保 'qrecord_inserted_ret' 在函数开始时正确初始化,而不是在结束时初始化,并在实际发生插入操作时设置该值。这样可以避免 'qrecord_inserted_ret' 在早期退出时具有无效值。
`add_delayed_ref_head()` 的文档也已更新,以反映 'qrecord' 对象的准确归属权。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.