gbuyssens/CVE-2026-41651
GitHub: gbuyssens/CVE-2026-41651
针对 PackageKit TOCTOU 竞争条件漏洞(CVE-2026-41651)的确定性本地权限提升 exploit,利用串联的三个逻辑缺陷绕过 polkit 认证以 root 身份安装任意软件包。
Stars: 0 | Forks: 0
# CVE-2026-41651
```
CVSS 3.x : 7.8 HIGH
CWE : CWE-367 (Time-of-Check Time-of-Use)
Fix : PackageKit 1.3.5+
Affects : PackageKit 1.0.2 – 1.3.4
```
PackageKit 的 D-Bus 事务处理程序中存在通过 TOCTOU 竞争条件导致的本地权限提升漏洞。
任何非特权本地用户都可以以 root 身份安装任意软件包——除了拥有本地会话之外,无需任何身份验证。
## 用法
```
python3 exploit.py
```
就是这样。它会释放 `/tmp/.suid_bash`,然后 `exec` 进入 root shell。
自定义 SUID 路径或超时时间:
```
SUID_BIN=/dev/shm/.sh TIMEOUT=90 python3 exploit.py
```
## 环境要求
```
apt install python3-gi dpkg-dev
```
该 exploit 会在运行时构建两个 `.deb` 软件包——无需编译器。
## 根本原因
`src/pk-transaction.c` 中的三个漏洞被链接在了一起:
### 漏洞 1 — 无条件标志覆盖
`InstallFiles()` 在覆盖 `cached_transaction_flags` 和 `cached_full_paths` 时**没有进行状态检查**。在同一事务上的第二次 D-Bus 调用会盲目地替换它们——即使该事务已经在运行中。
### 漏洞 2 — 静默状态机防护
`pk_transaction_set_state()` 会拒绝非法的向后状态转换(RUNNING→READY 等),但**不会**回滚因漏洞 1 而被覆盖的标志。已损坏的标志会持续存在。
### 漏洞 3 — 延迟标志读取
`pk_transaction_run()` 在调度时(GLib idle)读取 `cached_transaction_flags`,而不是在授权时。后端最终读取到的是攻击者设定的标志。
### 附加 — SIMULATE 绕过 polkit
设置 `PK_TRANSACTION_FLAG_SIMULATE` (0x4) 会完全跳过 polkit 授权检查。调用 1 在无需用户交互的情况下即可获得授权。
## 攻击链
```
Attacker packagekitd
│ │
│ CreateTransaction() │ state = NEW
│─────────────────────────────────►│
│ │
│ InstallFiles(SIMULATE, dummy) │ polkit skipped (SIMULATE)
│─────────────────────────────────►│ state = READY, idle queued
│ │
│ InstallFiles(NONE, payload) │ flags+paths overwritten
│─────────────────────────────────►│ set_state(WAITING_FOR_AUTH) rejected
│ │ state stays READY (BUG 2)
│ │
│ [idle fires]│
│ │ pk_transaction_run() reads NONE (BUG 3)
│ │ → dpkg installs payload as root
│ │ → postinst: chmod +s /tmp/.suid_bash
│ │
│ execv("/tmp/.suid_bash -p") │
│─────────────────────────────────►│ euid=0(root)
```
两次调用都在 GLib idle 触发之前到达——无需去赢取竞争,这是确定性的。
## 受影响的系统
Ubuntu Desktop 18.04–26.04、Debian Trixie、Fedora 43、RockyLinux 10.1,以及任何发布 PackageKit 1.0.2–1.3.4 且 daemon 处于活动状态的发行版。
## 修复方案
1. 升级至 **PackageKit 1.3.5+**
2. 如果无法升级,请 mask 该服务:`systemctl mask packagekit`
3. 修复程序添加了状态防护:`transaction->state != PK_TRANSACTION_STATE_NEW` → 拒绝请求
## 参考文献
- [NVD — CVE-2026-41651](https://nvd.nist.gov/vuln/detail/CVE-2026-41651)
- [GitHub 安全公告 — GHSA-f55j-vvr9-69xv](https://github.com/PackageKit/PackageKit/security/advisories/GHSA-f55j-vvr9-69xv)
- [修复提交](https://github.com/PackageKit/PackageKit/commit/76cfb675fb31acc3ad5595d4380bfff56d2a8697)
标签:D-Bus, Python, Web报告查看器, 无后门, 本地提权, 竞态条件, 逆向工具