as-user 欺骗 → 授权绕过 → 根上下文挂载 → LPECVE-2026-7867 是 udisks2 中的一个本地权限提升漏洞,涉及 Filesystem.Mount D-Bus 方法、as-user 选项、fstab 管理的挂载流程以及存在缺陷的授权处理。
此私有仓库包含在受控实验室环境中验证该问题所使用的技术研究笔记和 PoC 脚本。
该漏洞由以下人员发现并报告:
| Azizcan Daştan | azqzazq1 |
| Özlem Ozan | oz7oz7 |
该问题已被分配编号:
CVE-2026-7867
该漏洞源于真实 D-Bus 调用者 UID 与由 as-user 挂载选项计算得出的有效 UID 之间存在有缺陷的信任关系。
在易受攻击的流程中,无特权的本地用户可影响挂载执行路径,从而在未触发预期 PolicyKit 授权行为的情况下,以特权/根上下文执行文件系统挂载。
该核心漏洞并不仅仅是“用户可控的挂载选项”。
真正的问题在于:
udisks2在 fstab 挂载授权和执行期间,无法始终如一地区分原始调用者身份与计算得出的as-user身份。
易受攻击的逻辑与 udisks2 内部的 fstab 挂载处理路径相关,尤其是当挂载请求涉及以下内容时:
Filesystem.Mount
as-user
x-udisks-auth
user
users
相关的安全敏感区域包括:
D-Bus caller identity
↓
as-user option handling
↓
fstab authorization logic
↓
PolicyKit decision flow
↓
root-context mount execution
┌─────────────────────────────┐
│ Unprivileged Local User │
└──────────────┬──────────────┘
│
│ Filesystem.Mount
│ with as-user influence
▼
┌─────────────────────────────┐
│ udisks2 / udisksd │
│ privileged system daemon │
└──────────────┬──────────────┘
│
│ fstab logic evaluates
│ user/auth options
▼
┌─────────────────────────────┐
│ Authorization Gap │
│ mount_other_user not │
│ enforced in skipped path │
└──────────────┬──────────────┘
│
│ root-context branch reached
▼
┌─────────────────────────────┐
│ Filesystem Mounted │
│ without expected auth flow │
└──────────────┬──────────────┘
│
│ impact depends on mount flags
▼
┌─────────────────────────────┐
│ Local Privilege Escalation │
│ controlled lab validation │
└─────────────────────────────┘
易受攻击的行为源于一个身份混淆缺陷。
系统存在多个身份概念:
real D-Bus caller UID
computed as-user UID
effective mount UID
udisksd daemon privilege context
易受攻击的流程未能一致地强制执行这些身份。
具体而言:
as-user,mount_other_user 可能变为 truex-udisks-auth、user 或 users 等 fstab 选项可能影响授权路径mount_other_user 检查无法得到可靠执行结果是本地权限边界被绕过。
x-udisks-auth 问题x-udisks-auth 选项本应强制实施管理性 PolicyKit 授权流程。
预期行为:
mount request
↓
attempt mount as caller
↓
permission/auth failure
↓
PolicyKit filesystem-fstab check
↓
admin approval
↓
mount as authorized privileged action
易受攻击的行为:
mount request with as-user influence
↓
computed identity affects execution
↓
mount succeeds too early
↓
PolicyKit auth path is not reached as expected
↓
privileged mount state is achieved
这使得易受攻击路径中围绕 x-udisks-auth 的安全模型变得不可靠。
预期模型:
Unprivileged user
↓
D-Bus mount request
↓
PolicyKit / fstab authorization
↓
restricted mount behavior
被破坏的模型:
Unprivileged user
↓
D-Bus mount request with as-user spoofing
↓
authorization logic mismatch
↓
root-context mount execution
该漏洞尤其严重,因为受影响的进程以提升的特权运行。
成功利用可能允许本地无特权用户通过 udisks2 在根上下文执行路径中挂载文件系统,而无需预期的授权提示。
根据文件系统和挂载标志的不同,影响可能包括:
这是一个本地漏洞。
相关条件包括:
.
├── README.md
├── disk2root.sh ← main exploit (self-contained LPE)
└── poc/
├── setup_lpe_env.sh ← lab environment setup
├── f2_mount_as_user_bypass.sh
├── f2_check_nosuid.sh
├── f2_suid_test.sh
├── f2_final.sh
└── cleanup_lpe_env.sh
disk2root.sh自包含的武器化利用脚本。构建自己的 SUID root 载荷,创建预制磁盘镜像,通过 as-user=root polkit 绕过进行挂载,并进入 root shell。
选项 1 — 以 root 身份运行(在任何环境下均有效,包括 SSH):
./disk2root.sh
该脚本会自动:
debugfs 以 uid=0 mode=4755 注入该二进制文件x-udisks-auth 的 fstab 条目su 切换到无特权用户as-user=root 调用 Filesystem.Mount(polkit 绕过)如需指定从哪个用户进行提权:
./disk2root.sh testuser
如果未指定用户,脚本会选择系统上第一个常规用户,或创建一个临时用户。
选项 2 — 以无特权用户身份运行(桌面 / 活动会话):
./disk2root.sh
在具有活动 polkit 会话的系统上(桌面登录、GNOME/KDE),该脚本完全自包含——它通过 udisksctl 或 D-Bus LoopSetup 创建自己的 loop 设备,通过 as-user=root 挂载,无需任何预先设置即可提权。
选项 3 — 以无特权用户身份运行(SSH,完成设置后):
如果环境已经准备就绪(例如通过以 root 身份运行 poc/setup_lpe_env.sh,或之前以 root 身份运行过 ./disk2root.sh),任何无特权用户都可以再次利用:
./disk2root.sh
该脚本会自动检测存在漏洞的 fstab 条目并使用它们。
./disk2root.sh --cleanup
移除所有产物:fstab 条目、loop 设备、挂载点、临时用户。
当以无特权身份运行时,脚本会按顺序尝试多种路径:
[A] Self-contained
build payload → create ext4 image → debugfs inject SUID binary
→ loop-setup (python3 GIO / udisksctl) → mount as-user=root
✓ works on desktop sessions
[B] Fstab fallback
scan /etc/fstab for x-udisks-auth / user / users entries
→ mount as-user=root → find SUID binary on mounted fs
✓ works on SSH when environment is prepared
╔═════════════════════════════════════════════════════╗
║ CVE-2026-7867 — disk2root ║
║ udisks2 as-user polkit bypass → LPE root shell ║
╚═════════════════════════════════════════════════════════╝
[*] uid=1002 (testuser) — exploiting...
fstab: /dev/loop5 → /mnt/disk2root (x-udisks-auth)
mounted: /mnt/disk2root
nosuid: not set
suid: pwn (4755 root:root)
╔═════════════════════════════════════════════════════╗
║ dropping into root shell — type 'exit' to return ║
╚═════════════════════════════════════════════════════════╝
[+] root shell — uid=0 euid=0
root@target:/tmp#
poc/)研究期间使用的独立验证脚本。这些是最终形成 disk2root.sh 的基础组件。
1. Run poc/setup_lpe_env.sh as root
2. su - testuser
3. Run poc/f2_mount_as_user_bypass.sh
4. Run poc/f2_final.sh for full validation
5. Run poc/cleanup_lpe_env.sh as root
或者直接使用集成了上述所有功能的 disk2root.sh。
本研究所演示的原语是:
as-user option spoofing inside privileged mount orchestration
关键转换过程是:
unprivileged D-Bus caller
↓
spoofed/computed mount identity
↓
authorization path confusion
↓
root-context mount execution
这就是该问题被归类为本地权限提升漏洞的原因。
udisks2 通常被视为可信的特权存储管理守护进程。
该层中的漏洞影响巨大,因为它位于以下组件之间:
desktop/session users
D-Bus method calls
PolicyKit authorization
filesystem mount operations
root daemon privileges
此处身份处理中的缺陷会直接影响本地权限边界。
防御者可以监控涉及 as-user 的可疑 udisks2 挂载活动。
有用的遥测数据源:
udisksd logs
D-Bus method calls
PolicyKit logs
mount table changes
/proc/mounts
/etc/fstab
journalctl
有用的命令:
findmnt
mount
cat /proc/mounts
journalctl -u udisks2
journalctl | grep -i udisks
journalctl | grep -i polkit
可疑模式:
non-root user triggering Filesystem.Mount
as-user=root usage
unexpected mount without PolicyKit prompt
mounts lacking nosuid/noexec/nodev
setuid execution from recently mounted filesystems
unexpected loop device mounts
udisks2补丁可用后,请应用厂商提供的修复。
计划修复版本:
udisks 2.11.2
审计使用以下选项的条目:
x-udisks-auth
user
users
尤其要审查可能包含可执行或 setuid 内容的文件系统。
由于这是一个本地漏洞,减少不受信任的本地访问可降低暴露风险。
通过以下方式监控意外的挂载操作:
udisksd
尤其是由非 root 用户触发的挂载操作。
在适用情况下,使用:
nosuid
noexec
nodev
这些标志可能会降低挂载后的影响。
审查与 udisks 挂载操作相关的 PolicyKit 规则。
确保无特权用户未经明确授权无法触发敏感的挂载路径。
一个稳健的修复应确保:
as-user UID 不会在授权时替代调用者身份mount_other_user 始终触发正确的 PolicyKit 检查x-udisks-auth 始终如一地强制实施身份验证在保密期结束后,此仓库可转换为公开研究仓库,包含:
docs/
├── technical-analysis.md
├── root-cause.md
├── lab-setup.md
├── exploit-flow.md
├── detection.md
└── mitigation.md
建议公开的内容:
此仓库仅用于经授权的安全研究、厂商协调和防御性验证。
PoC 脚本仅用于隔离的测试环境。
请勿在您不拥有或未经明确许可测试的系统上运行这些脚本。
作者不对本研究被滥用负责。
CVE-2026-7867
udisks2 本地权限提升研究
| 字段 | 值 |
|---|
| CVE | CVE-2026-7867 |
| 产品 | udisks2 |
| 组件 | Filesystem.Mount |
| 攻击类型 | 本地权限提升 |
| 原语 | as-user 欺骗 |
| 安全边界 | D-Bus 调用者身份 → 特权挂载执行 |
| 授权层 | PolicyKit / fstab 挂载授权 |
| 厂商 | Red Hat / udisks 上游 |
| 状态 | 补丁开发中 / 协同披露 |
| 计划修复版本 | udisks 2.11.2 |
| 条件 | 是否必需 |
|---|
| 本地用户访问 | 是 |
存在漏洞的 udisks2 版本 | 是 |
存在 as-user 功能 | 是 |
| 合适的 fstab 管理挂载目标 | 是 |
| 存在漏洞的授权路径 | 是 |
| 远程访问 | 否 |
| 工具 | 用途 | 是否必需 |
|---|
busctl | D-Bus 挂载调用 | 是 |
gcc | 编译 SUID 载荷 | 是(回退到 bash 复制) |
mke2fs | 创建 ext4 镜像 | 是(自包含模式) |
debugfs | 以 uid=0 注入二进制文件 | 是(自包含模式) |
python3-gi | 带 fd 传递的 D-Bus LoopSetup | 可选(桌面模式) |
udisksctl | loop 设备设置 | 可选(桌面模式) |
| 脚本 | 用途 |
|---|
setup_lpe_env.sh | 准备实验室环境(loop 设备、fstab、测试用户) |
f2_mount_as_user_bypass.sh | 验证使用 as-user=root 的 Filesystem.Mount 绕过 |
f2_check_nosuid.sh | 验证绕过挂载上的 nosuid/noexec/nodev 标志 |
f2_suid_test.sh | 测试已挂载文件系统上的 SUID 二进制执行 |
f2_final.sh | 端到端 PoC:设置 → 绕过 → 验证 euid=0 |
cleanup_lpe_env.sh | 恢复测试环境 |
| 日期 | 事件 |
|---|
2026-04-21 | 向 Red Hat 产品安全团队提交报告 |
2026-04-21 | Red Hat 确认收到 |
2026-04-28 | 厂商确认存在缺陷的逻辑 |
2026-04-28 | 厂商请求提供 PoC 脚本 |
2026-04-30 | 厂商请求分配 CVE |
2026-04-30 | PoC 脚本已发送给厂商 |
2026-05-03 | 共享厂商初始补丁 |
2026-05-05 | 共享更新后的厂商补丁 |
2026-05-05 | CVE-2026-7867 已预留 |
2026-05-05 | 工单标记为已解决 |
2026-05-07 | 厂商表示计划在 udisks 2.11.2 中修复 |
| 研究人员 | GitHub | 角色 |
|---|---|---|
| Azizcan Daştan | azqzazq1 | 发现、分析、PoC 开发、厂商协调 |
| Özlem Ozan | oz7oz7 | 研究协作与披露贡献 |