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报告查看器, 无后门, 本地提权, 竞态条件, 逆向工具