CVE-2022-50534CVE-2022-50534是Linux内核device-mapper thin provisioning(dm thin)子系统中的一个高危拒绝服务漏洞。该漏洞源于dm thin池在事务提交失败时未正确处理元数据根节点(pmd->root),导致在只读模式下查找数据块时可能陷入无限循环,造成系统软锁死(softlockup)。具体而言,当事务提交过程中部分节点写入磁盘成功而部分失败时,pmd->root可能指向一个混合了新旧节点的损坏B树结构。在后续的dm_btree_lookup查找过程中,由于B树中存在指向陈旧节点的引用,查找操作可能陷入死循环,导致内核工作队列挂起,最终触发看门狗超时并引发内核崩溃。该漏洞影响所有使用dm thin池的Linux系统,可被低权限本地用户触发,造成系统完全不可用。由于该漏洞需要本地访问权限且需要低权限认证,因此CVSS评分为5.5,评定为中危等级。该漏洞已在2025年10月披露,并已在多个稳定内核版本中修复。
该漏洞的技术原理涉及dm thin池的B树元数据管理机制。在dm thin的正常操作中,当数据块需要从外部设备复制(copy-up)时,会创建新的B树节点路径并更新pmd->root指针。具体场景如下:
1. **事务1阶段**:pmd->root最初指向路径A->B->C,随后在copy-up过程中更新为新路径X->Y->Z。
2. **事务2阶段**:节点X和Z成功写入磁盘,但节点Y写入失败,导致commit操作失败,dm thin进入read-only模式。
3. **查找阶段**:在只读模式下处理读请求时,dm_thin_find_block调用dm_btree_lookup从pmd->root开始查找数据块。由于pmd->root指向的B树包含陈旧节点Y(可能指向任意块,如X),导致查找操作在X和Y之间无限循环。
**根本原因**:当commit失败时,内核没有回滚pmd->root到上一个成功提交的事务的根节点,而是保留了损坏的B树结构。
**修复方案**:通过在__open_metadata()中正确设置pmd->root,确保在commit失败的情况下dm thin使用上一个成功事务的pmd->root,从而避免使用损坏的B树结构。
**触发条件**:需要本地低权限用户能够触发dm thin池的copy-up操作并使其commit失败,例如通过底层存储设备的I/O错误模拟。