CVE-2026-41651 — PackageKit TOCTOU 本地权限提升
分类: 紫队评估工件
仅限授权使用。 本文档及随附的测试脚本仅用于在已获得书面授权的系统上进行内部安全验证。
利用证明

目录
- 漏洞概述
- 技术分析
- 测试脚本说明
- 入侵指标
- 检测逻辑
- 受影响系统与版本
- 修复方案
- 参考资料
漏洞概述
PackageKit 是系统包管理的 D-Bus 抽象层,在基于 GNOME 的桌面环境中默认存在,覆盖 Debian、Ubuntu、Fedora、RHEL、SUSE 和 Arch Linux。由于它代表非特权用户执行特权包操作,其授权流程中的缺陷会对整个系统产生 root 级影响。
技术分析
根本原因
pk-transaction.c(1.3.5 之前版本)未对操作方法重复调用实施状态保护。D-Bus 客户端可以在事务对象已从 PK_TRANSACTION_STATE_NEW 状态转换后,多次调用同一事务对象上的 InstallFiles(或其他操作方法)。
攻击链
攻击者(非特权)
│
├─① CreateTransaction() → PackageKit 返回事务对象路径 (tid)
│
├─② InstallFiles(tid, FLAG_SIMULATE=4, [dummy.pkg])
│ PackageKit 为 dummy.pkg 排队 polkit 授权检查。
│ 此时不会发生安装 — SIMULATE 仅表示试运行。
│
├─③ InstallFiles(tid, FLAG_NONE=0, [payload.pkg]) ← TOCTOU 窗口
│ 在授权解析之前对同一 tid 重新调用。
│ 存在漏洞的版本会用 payload.pkg 覆盖排队的参数。
│
└─④ polkit 授予授权(用户批准或自动授权)
packagekitd 以 root 身份安装 payload.pkg。
payload 的 postinst/post 脚本:install -m 4755 /bin/bash /tmp/.suid_bash
攻击者执行 /tmp/.suid_bash -p → root shell。
竞态为何能成功
步骤②和③作为非阻塞异步 D-Bus 调用在同一连接上发送,并在一次写入中刷新。两条消息在 packagekitd 处理②并推进状态机之前到达,从而留下 TOCTOU 窗口。1.3.5 中的修复添加了显式状态检查,在 PK_TRANSACTION_STATE_NEW 之后的任何重复调用都会返回 PK_TRANSACTION_ERROR_INVALID_STATE。
测试脚本说明
文件: cve-2026-41651-purpleteam.py
语言: Python 3
依赖: python3-gi(GObject 内省 / GLib/Gio 绑定)
目的
在准备好的测试系统上演示 CVE-2026-41651 的可利用性,目的如下:
- 验证已安装的 PackageKit 版本是否存在漏洞
- 为 SIEM/EDR 调优生成真实的 IOC 遥测数据
- 在打补丁前后测试检测覆盖率
行为
加固环境支持
默认加固的系统可以在两个独立点阻止该利用。脚本会自动处理这两种情况。
1. 限制性 umask(027 / 077)
进程继承的 umask 为 027 或 077 会导致 mkdir() 生成 750 或 700 权限的目录。dpkg-deb 和 rpmbuild 都必须遍历完整的构建树 — 如果任何目录不可读,构建将静默失败。
已应用的修复: 在创建任何文件或目录之前,启动时调用 os.umask(0o022)。此外,构建树中的每个目录和文件在创建后立即接收显式 chmod(目录和脚本为 0o755,数据文件为 0o644),因此无论继承的 umask 如何,都能保证正确的权限。
2. /tmp 上的 nosuid / noexec 挂载标志
| 标志 | 对利用的影响 |
|---|
nosuid | 内核静默剥离存储在该文件系统上任何文件的 SUID 位 — 复制的 bash 永远不会成为 root |
noexec | SUID 二进制文件根本无法执行 |
已应用的修复: 启动时,_find_suid_dir() 读取 /proc/mounts 并按优先级顺序测试候选目录,直到找到文件系统上两个标志均未设置的目录。解析后的路径随后被写入 payload 的安装后脚本,并用于轮询和执行。
如果所有候选目录都被阻止,脚本会以明确的错误退出,而不是静默失败。
兼容性
| 发行版系列 | 包工具 | 已测试 |
|---|
| Debian / Ubuntu | dpkg-deb | ✓ |
| RHEL / Fedora | rpmbuild |
入侵指标
IOC 按从通用/基础设施级别到脚本特定痕迹的顺序列出。基于通用指标构建的检测将捕获此 CVE,无论使用哪种 PoC 变体。
文件系统
进程与执行
D-Bus 活动
审计日志模式
启用方式:auditctl -a always,exit -F arch=b64 -S all -F path=/usr/bin/packagekitd
或在 /etc/audit/rules.d/ 中使用以下规则:
# 检测所有候选投放目录中的 SUID 文件创建
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F a2&04000 -F dir=/tmp -k suid_drop
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F a2&04000 -F dir=/var/tmp -k suid_drop
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F a2&04000 -F dir=/dev/shm -k suid_drop
# 检测非 root 用户执行 dpkg-deb / rpmbuild
-w /usr/bin/dpkg-deb -p x -k pkg_build_nonroot
-w /usr/bin/rpmbuild -p x -k pkg_build_nonroot
# 检测从任何候选投放目录执行 SUID bash
-a always,exit -F arch=b64 -S execve -F dir=/tmp -F uid!=0 -F euid=0 -k priv_esc_drop
-a always,exit -F arch=b64 -S execve -F dir=/var/tmp -F uid!=0 -F euid=0 -k priv_esc_drop
-a always,exit -F arch=b64 -S execve -F dir=/dev/shm -F uid!=0 -F euid=0 -k priv_esc_drop
包管理器痕迹
权限提升痕迹
检测逻辑
SIEM 伪规则(通用 — 覆盖所有 CVE-2026-41651 变体)
(
event.category == "process"
AND process.name IN ("dpkg-deb", "rpmbuild")
AND process.user.id != "0"
AND NOT process.parent.name IN ("apt", "apt-get", "dpkg", "rpm", "dnf", "yum", "zypper", "mock", "koji")
)
OR
(
event.category == "file"
AND file.path LIKE "/tmp/%" OR file.path LIKE "/var/tmp/%" OR file.path LIKE "/dev/shm/%"
AND file.owner == "root"
AND (file.mode LIKE "04%")
)
OR
(
event.category == "process"
AND process.name == "bash"
AND process.real_user.id != "0"
AND process.effective_user.id == "0"
AND NOT process.parent.name IN ("sudo", "su", "sshd", "login", "pam")
)
EDR 行为链
packagekitd
└─ sh / bash (cwd 或参数匹配 /tmp、/var/tmp、/dev/shm 或 $HOME)
└─ install / cp / chmod (目标具有 SUID 且属主为 root)
标记完整链。单独任何一步可能都是良性的;通过 packagekitd 到设置 SUID 命令的父子关系是高保真指标,无论选择了哪个投放目录。扩大基于路径的规则以覆盖全部四个候选目录。
受影响系统与版本
检查已安装版本:pkcon backend-details 或 packagekit --version
如果报告的版本为 ≤ 1.3.4,则存在漏洞。
修复方案
主要方案: 将 PackageKit 升级到 1.3.5 或应用供应商特定的反向移植。
# Debian / Ubuntu
apt update && apt install --only-upgrade packagekit
# Fedora / RHEL
dnf upgrade packagekit
# SUSE
zypper update packagekit
缓解措施(如果无法立即打补丁):
参考资料
生成日期:2026-04-24 | 更新日期:2026-04-25 | 紫队评估 | 仅供内部使用