• 1/ 漏洞简述
Polkit是一个在各类Linux及Unix 操作系统中被广泛用于控制系统范围权限的组件。它为非特权进程与特权进程通信提供了一种有组织的方式,用户可以使用 polkit 以root用户权限执行命令,只要在需要执行的命令前面附加上:pkexec。成功利用CVE-2021-4034,也即Polkit本地提权漏洞允许任何非特权用户在未经漏洞修补的主机上获得 root 权限。
  • 2/ 影响面简述
⭕️ 漏洞在多套环境下都得到验证,任何具备普通权限的用户均能够经简单的工具利用该漏洞,获取完整的root权限。
⭕️ 该漏洞在以默认参数安装的 Ubuntu、Debian、Fedora、CentOS等常见Linux发行版上存在,能够经简单的工具利用获得完整的 root 权限。
⭕️ 其他 Linux 发行版同样可能容易受到攻击(例如:Solaris,FreeBSD等,但OpenBSD已被明确证明不可利用),攻击者可以经简单的工具利用该漏洞。
⭕️ 此漏洞已经在代码中存在并隐藏了 12 年多,影响自 2009 年 5 月第一个版本以来的所有 pkexec 版本(commit c8c3d83)。
⭕️ 该漏洞POC(利用代码)已经由Github等平台公开传播数日,攻击者利用成本极低
  • 3/复现截图
未修复之前
gcc xxxxx -o exp
修复之后
  • 4/ 原理简述
pkexec 的 main() 函数在开头(源码 534-568 行)处理命令行参数,并在 PATH 环境变量的目录中搜索要执行的程序(如果其路径不是绝对路径)。此时,如果命令行参数 argc 的数量为 0,则传递给 execve() 的参数列表 argv 为{NULL},也即 argv[0] 为 NULL,将会导致:
在第 534 行,整数 n 永久设置为 1;
在第 610 行,从 argv[1] 越界读取指针路径;
在第 639 行,指针 s 被越界写入 argv[1]。
这种越界写入允许我们将一个“不安全”的环境变量(例如,LD_PRELOAD)重新引入 pkexec 的环境。这些“不安全”变量通常在调用 main() 函数之前从 SUID 程序的环境中删除(通过 ld.so)。
  • 5/ 修复建议
⭕️ 若操作系统厂商/或 社区提供了漏洞修复补丁,则优先通过版本升级应用这些补丁。
⭕️ 若未发布相关补丁/或 情形不容许版本升级操作,则使用命令:chmod 0755 /usr/bin/pkexec 修改polkit可执行文件的权限(删除SUID位)。
⭕️ 做好信息资产漏洞评估与管理工作,避免攻击者通过其他漏洞间接利用PWNKIT漏洞提升权限,造成不必要的损失。
其他:
arthepsy/CVE-2021-4034: PoC for PwnKit: Local Privilege Escalation Vulnerability in polkit’s pkexec (CVE-2021-4034) (github.com)