baph00met/CVE-2026-41651

GitHub: baph00met/CVE-2026-41651

针对 PackageKit TOCTOU 本地提权漏洞(CVE-2026-41651)的完整利用证明,包含 PoC 脚本、技术分析和检测规则。

Stars: 0 | Forks: 0

# CVE-2026-41651 — PackageKit TOCTOU 本地提权漏洞 ## 漏洞利用证明 ![漏洞利用证明](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/3b1be7ece4193532.png) ## 目录 1. [漏洞概述](#vulnerability-overview) 2. [技术分析](#technical-analysis) 3. [测试脚本说明](#test-script-description) 4. [入侵指标](#indicators-of-compromise) - [文件系统](#file-system) - [进程与执行](#process--execution) - [D-Bus 活动](#d-bus-activity) - [审计日志模式](#audit-log-patterns) - [包管理器痕迹](#package-manager-artifacts) - [提权痕迹](#privilege-escalation-artifacts) 5. [检测逻辑](#detection-logic) 6. [受影响的系统与版本](#affected-systems--versions) 7. [修复措施](#remediation) 8. [参考链接](#references) ## 漏洞概述 | 字段 | 值 | |--------------------|-----------------------------------------------------------------------| | **CVE ID** | CVE-2026-41651 | | **CWE** | CWE-367 — 检查时间到使用时间 (TOCTOU) 竞争条件 | | **组件** | PackageKit (`packagekitd`, D-Bus 服务) | | **受影响版本** | PackageKit ≤ 1.3.4 | | **修复版本** | PackageKit 1.3.5 | | **影响** | 本地提权 → root | | **攻击向量** | 本地 / D-Bus (非特权用户会话) | | **披露日期** | 2026-04-22 (Deutsche Telekom Red Team) | | **安全通报** | GHSA-f55j-vvr9-69xv | | **修复提交** | `76cfb675fb31acc3ad5595d4380bfff56d2a8697` | PackageKit 是一个用于系统包管理的 D-Bus 抽象层,在 Debian、Ubuntu、Fedora、RHEL、SUSE 和 Arch Linux 上基于 GNOME 的桌面环境中默认存在。由于它代表非特权用户协调特权包操作,其授权流程中的缺陷会带来系统范围内的 root 级影响。 ## 技术分析 ### 根本原因 `pk-transaction.c` (1.3.5 之前版本) 未对操作方法的重入强制执行状态守卫。D-Bus 客户端可以在同一事务对象已经脱离 `PK_TRANSACTION_STATE_NEW` 状态后,**多次调用** `InstallFiles` (或其他操作方法)。 ### 攻击链 ``` Attacker (unprivileged) │ ├─① CreateTransaction() → PackageKit returns transaction object path (tid) │ ├─② InstallFiles(tid, FLAG_SIMULATE=4, [dummy.pkg]) │ PackageKit queues a polkit authorization check for dummy.pkg. │ No installation occurs yet — SIMULATE means dry-run only. │ ├─③ InstallFiles(tid, FLAG_NONE=0, [payload.pkg]) ← TOCTOU window │ Re-invokes on the same tid before auth resolves. │ Vulnerable versions overwrite the queued parameters with payload.pkg. │ └─④ polkit grants authorization (user approved or auto-authorized) packagekitd installs payload.pkg as root. payload postinst/post script: install -m 4755 /bin/bash /tmp/.suid_bash Attacker executes /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 遥测数据 - 测试修补前后的检测覆盖率 ### 行为 | 阶段 | 操作 | |---------------|---------------------------------------------------------------------------------| | **Setup** | 检测 RPM (RHEL/Fedora/SUSE) 或 DEB (Debian/Ubuntu),并在 `/tmp` 中构建一个虚拟包和一个有效载荷包 | | **Exploit** | 打开系统 D-Bus 连接,创建一个 PackageKit 事务,发起两次调用的竞争 | | **Payload** | 包安装后脚本将 `/bin/bash` 复制到 `/tmp/.suid_bash`,权限模式为 `04755`,所有者为 `root` | | **Escalation**| 轮询 SUID 二进制文件 (90 秒超时),然后带 `-p` 参数执行 `execl` 以获取 root shell | | **Cleanup** | 退出时 (无论成功还是失败) 删除临时的 `.deb`/`.rpm` 文件 | ### 兼容性 | 发行版系列 | 包工具 | 已测试 | |---------------------|----------------|--------| | Debian / Ubuntu | `dpkg-deb` | ✓ | | RHEL / Fedora | `rpmbuild` | ✓ | | SUSE / openSUSE | `rpmbuild` | ✓ | ## 入侵指标 ### 文件系统 | IOC | 路径 / 模式 | 备注 | |-----|---------------|-------| | 全局可写目录中的 SUID 二进制文件 | `/tmp/*`,权限模式为 `04755` 且 `uid=0` | 典型的有效载荷投放位置;`/tmp`、`/var/tmp`、`/dev/shm` 中的任何 SUID root 文件都是高可信指标 | | `/tmp` 中的临时包文件 | `/tmp/*.deb`, `/tmp/*.rpm` | 由非特权用户构建;合法的包操作使用 `/var/cache` 或下载路径 | | dpkg 构建树 | `/tmp/pkbuild_*`, `/tmp/build_*` | `dpkg-deb -b` 的暂存目录 | | `/tmp` 中的 rpmbuild 树 | `/tmp/rpmbuild_*` | 在 `~/rpmbuild` 之外调用 `rpmbuild` 的暂存目录 | | `/tmp` 中的 postinst / %post 脚本 | `/tmp/*/DEBIAN/postinst`, `/tmp/*/SPECS/*.spec` | 复制或更改系统二进制文件权限的脚本属于高置信度指标 | ### 进程与执行 | IOC | 详情 | |-----|--------| | 由非 root、非 apt 进程生成的 `dpkg-deb` | 父进程是用户的 Python/shell 进程,而不是 `apt`、`dpkg` 或 `unattended-upgrades` | | 由非特权用户生成的 `rpmbuild` | 如果没有与打包相关的父进程 (`mock`、`koji`、CI runner),这是异常情况 | | `packagekitd` 从 `/tmp` 路径生成 `/bin/sh` 或 `/bin/bash` | `packagekitd` 运行 postinst 脚本;`/tmp` 中的源路径是异常点 | | `UID ≠ EUID` 的 `bash` 进程 | SUID 执行;`EUID=0`,`UID=<攻击者>` | | `bash -p` 调用 | `-p` 标志在设置 SUID 时启用特权模式 —— 正常情况下极少使用 | | 短暂存在的 `.suid_bash` 进程链 | 祖父进程是 `packagekitd`,父进程是攻击者的 shell | ### D-Bus 活动 | IOC | 详情 | |-----|--------| | 在同一对象路径上被调用两次的 `org.freedesktop.PackageKit.Transaction.InstallFiles` | 两次调用在毫秒内到达;合法客户端每个事务只调用一次 | | 在同一个 `tid` 上紧随 `FLAG_SIMULATE (4)` 之后的 `FLAG_NONE (0)` | 此序列没有合法的用例 | | `CreateTransaction` → 快速双次 `InstallFiles` 模式 | 可通过 D-Bus 监视器 (`dbus-monitor --system`) 或审计 `dbus` 规则检测到 | | 文件路径位于 `/tmp` 下的 `InstallFiles` | 合法的 GUI 包安装器 (GNOME Software, Discover) 使用 `$HOME` 或 `/var/cache` 中的路径 | ### 审计日志模式 ``` # 在 world-writable 目录中检测 SUID 文件创建 -a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F a2&04000 -F dir=/tmp -k suid_in_tmp -a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F a2&04000 -F dir=/var/tmp -k suid_in_tmp # 检测非 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 # 检测从 /tmp 执行带有 SUID 的 bash -a always,exit -F arch=b64 -S execve -F exe=/tmp/.suid_bash -k suid_bash_exec -a always,exit -F arch=b64 -S execve -F dir=/tmp -F uid!=0 -F euid=0 -k priv_esc_tmp ``` ### 包管理器痕迹 | IOC | 详情 | |-----|--------| | dpkg/rpm 历史记录中名为 `pk-dummy-*` 或 `pk-payload-*` 的包 | 特定于此脚本,但变种会使用不同的名称 | | 从本地文件 (`/tmp/*.deb` 或 `/tmp/*.rpm`) 安装的包 | `dpkg -l` 或 `rpm -qa --last` —— 查找没有仓库来源的包 | | 安装时无 changelog 或描述为空的包 | 手工构造的包使用最少的元数据;`dpkg -s ` 或 `rpm -qi ` | | 包在安装后立即被删除或从未出现在包数据库中 | 失败的漏洞利用尝试可能会留下部分状态 | | `packagekit` 事务日志中关于本地文件安装的记录 | `/var/log/PackageKit/transactions.db` 或 journald 中 `packagekitd` 的条目 | ### 提权痕迹 | IOC | 详情 | |-----|--------| | `/tmp/.suid_bash` 存在于磁盘上 | 主要有效载荷;文件名因攻击者而异,但 `/tmp/.*` (隐藏在 tmp 中) 很常见 | | `/tmp` 中属于 `root` 且设置了 SUID 位的任何文件 | `find /tmp -uid 0 -perm -4000` —— 在干净的系统上应始终返回空 | | `euid=0` 且没有 PAM / sudo / su 祖先进程的 `bash` 进程树 | 表明是 SUID 执行路径,而非合法的权限转换 | | 为非管理员用户授予了 `org.freedesktop.packagekit.package-install` 的 polkit 授权 | 如果用户不在 `sudo` / `wheel` 组中,则属于异常情况 | ## 检测逻辑 ### 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/%" 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 or arg matches /tmp) └─ install / cp / chmod (target has SUID + owner root) ``` 标记整个链条。任何单独的步骤本身可能是无害的;通过 `packagekitd` 到源自 `/tmp` 的设置 SUID 命令的父子关系是高可信指标。 ## 受影响的系统与版本 | 发行版 | 默认 PackageKit | 是否受影响 | 已有补丁版本 | |--------------------------|--------------------|------------|---------------------------| | Ubuntu 24.04 LTS | 1.3.x | 是 | 通过 `apt upgrade` 获取 | | Ubuntu 22.04 LTS | 1.2.x | 是 | 回移补丁移植中 | | Debian 12 (Bookworm) | 1.2.x | 是 | 安全追踪器待定 | | Fedora 41 | 1.3.x | 是 | `dnf upgrade packagekit` | | RHEL 9 / CentOS Stream 9 | 1.2.x | 是 | RHSA 待定 | | SUSE Linux Enterprise 15 | 1.1.x | 很可能 | SUSE 公告待定 | | Arch Linux | 1.3.x | 是 | AUR / pacman 已更新 | ## 修复措施 **主要方案:** 将 PackageKit 升级到 1.3.5 或应用特定供应商的向后移植补丁。 ``` # Debian / Ubuntu apt update && apt install --only-upgrade packagekit # Fedora / RHEL dnf upgrade packagekit # SUSE zypper update packagekit ``` **缓解措施 (如果无法立即打补丁):** | 缓解措施 | 命令 / 配置 | 注意事项 | |------------|-----------------|--------| | 禁用 PackageKit 服务 | `systemctl disable --now packagekitd` | 会破坏 GNOME Software / Discover GUI 更新 | | 限制 D-Bus 访问 | 在 `/etc/dbus-1/system.d/org.freedesktop.PackageKit.conf` 中为非特权用户添加 `deny` 规则 | 可能会破坏合法的用户端包工具 | | Polkit 加固 | 将 `org.freedesktop.packagekit.package-install` 设为 `auth_admin` (始终要求输入管理员密码) | 降低便利性但缩小了攻击面 | | 审计监控 | 部署来自 [审计日志模式](#audit-log-patterns) 章节的审计规则 | 仅用于检测,不能预防 | ## 参考链接 | 资源 | 链接 | |----------|------| | OSS-Security 披露 | https://www.openwall.com/lists/oss-security/2026/04/22/6 | | GitHub 安全通报 | GHSA-f55j-vvr9-69xv | | 修复提交 | https://github.com/PackageKit/PackageKit/commit/76cfb675fb31acc3ad5595d4380bfff56d2a8697 | | PackageKit 1.3.5 版本发布 | https://github.com/PackageKit/PackageKit/releases/tag/v1.3.5 | | CWE367 | https://cwe.mitre.org/data/definitions/367.html | | polkit 文档 | https://www.freedesktop.org/software/polkit/docs/latest/ | *生成时间: 2026-04-24 | 紫队评估 | 仅供内部使用*
标签:CVE-2026-41651, CWE-367, D-Bus, exploitation, LPE, PackageKit, PoC, Race Condition, Red Team, TOCTOU, Web报告查看器, 协议分析, 提权漏洞, 暴力破解, 本地提权, 权限提升, 漏洞分析, 系统漏洞, 网络安全, 路径探测, 隐私保护