baph00met/CVE-2026-41651
GitHub: baph00met/CVE-2026-41651
针对 PackageKit TOCTOU 本地提权漏洞(CVE-2026-41651)的完整利用证明,包含 PoC 脚本、技术分析和检测规则。
Stars: 0 | Forks: 0
# CVE-2026-41651 — PackageKit TOCTOU 本地提权漏洞
## 漏洞利用证明

## 目录
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报告查看器, 协议分析, 提权漏洞, 暴力破解, 本地提权, 权限提升, 漏洞分析, 系统漏洞, 网络安全, 路径探测, 隐私保护