关于Polkit pkexec for Linux
Polkit(以前是PolicyKit)是一个用于控制类unix操作系统中的系统权限的组件。它为非权限进程提供了一种有组织的方式来与权限进程进行通信。还可以使用polkit来执行具有更高权限的命令,使用命令pkexec,后面跟着要执行的命令(具有根权限)。
PwnKit漏洞的潜在影响
如果有人成功利用该漏洞,任何非权限用户都可以获得该漏洞主机上的root权限。Qualys的安全研究人员已经能够独立验证该漏洞,并利用该漏洞,进而获得Ubuntu、Debian、Fedora和CentOS默认安装的全部root权限。其他 Linux 发行版可能容易受到攻击并且可能被利用。这个漏洞已经隐藏了 12 年多,并影响自 2009 年 5 月第一个版本以来的所有 pkexec 版本(commit c8c3d83, “Add a pkexec(1) command”)。
在我们的研究团队确认该漏洞后,Qualys负责漏洞的披露,并与供应商和开源发行方协调,公布了该漏洞。
潜在漏洞利用路径的视频可以点此查看。(https://player.vimeo.com/video/669715589)
另外可以查看本视频(https://player.vimeo.com/video/670582239),了解如何使用Qualys VMDR查看PwnKit漏洞。
PwnKit漏洞的技术细节介绍
pkexec的main()函数的开头处理命令行参数(第534-568行),如果它的路径不是绝对的,则在path环境变量的目录中搜索要执行的程序(第610-640行):
不幸的是,如果命令行参数argc的数量是0,这意味着如果我们传递给execve()的参数列表argv是空的,即{NULL},那么argv[0]就是NULL。这是参数列表的终止符。所以:
在第534行,整数n被永久地设置为1;
在第610行,从argv[1]越界读取指针路径;
在第639行,指针s被越界写入argv[1];
但是,这个越界的argv[1]到底要读写什么呢?
要回答这个问题,我们必须稍微离题一下。当execve()一个新程序时,内核将我们的参数、环境字符串和指针(argv和envp)复制到新程序堆栈的末尾,例如:
显然,因为argv和envp指针在内存中是连续的,如果argc是0,那么越界的argv[1]实际上是envp[0],指向我们的第一个环境变量value的指针。结果:
在第 610 行,要执行的程序的路径从 argv[1](即 envp[0])越界读取,并指向“value”;
在第 632 行,这个路径“value”被传递给 g_find_program_in_path()(因为“value”在第629行不是以斜杠开头的);
然后,g_find_program_in_path() 在我们的 PATH 环境变量的目录中搜索一个名为“value”的可执行文件;
如果找到这样的可执行文件,则将其完整路径返回给 pkexec 的 main() 函数(在第 632 行);
最后,在第 639 行,这个完整路径被越界写入 argv[1](即 envp[0]),从而覆盖了我们的第一个环境变量。
所以,更准确地说:
如果我们的PATH环境变量是" PATH=name ",并且目录" name "存在(在当前工作目录中)并且包含一个名为" value "的可执行文件,那么一个指向字符串" name/value "的指针将被写入envp[0]。
如果我们的 PATH 是“PATH=name=.”,并且目录是“name=.”存在并包含一个名为“value”的可执行文件,然后将指向字符串“name=./value”的指针越界写入 envp[0]。
换句话说,这种越界写入允许我们将“不安全的”环境变量(例如,LD_PRELOAD)重新引入到pkexec的环境中。在调用main()函数之前,这些“不安全的”变量通常会(通过ld.so)从SUID程序的环境中删除。我们将在下一节中使用这个强大的原语。
不过要注意的是,polkit也支持非linux操作系统,如Solaris和*BSD,但我们尚未调查它们的可利用性。然而,我们注意到OpenBSD是不可利用的,因为如果argc为0,它的内核拒绝execve()一个程序。
如何修复PwnKit漏洞
考虑到该漏洞在Linux和非Linux操作系统中的攻击范围,Qualys建议用户立即更新此应用。
目前Qualys客户可以搜索CVE-2021-4034的相关新闻,以识别该漏洞的所有QID 和设备。
现在可以开始免费的 Qualys VMDR 试用,以获得对 CVE-2021-4034 的 QID(检测)的完全访问权限,其中可以识别所有易受攻击的设备。
Qualys研究团队在polkit的pkexec中发现了一个内存破坏漏洞,pkexec是一个SUID-root程序,默认安装在每个主要的Linux发行版上。这个容易被利用的漏洞允许任何没有权限的用户通过利用默认配置中的这个漏洞获得脆弱主机上的完全根权限。
关于Linux的Polkit pkexec
Qualys QID 覆盖范围
Qualys 将发布下表中的 QID,因为它们从 vulnsigs 版本 VULNSIGS-2.5.387-2 和 Linux 云代理清单版本 lx_manifest-2.5.387.2-1 开始可用。
使用 Qualys VMDR 发现易受攻击的 Linux 服务器
识别运行 Linux 内核的设备
接下来会介绍当前 Qualys 客户如何在他们的环境中检测 PwnKit。
管理这一关键漏洞和降低风险的第一步是识别运行Linux操作系统的所有设备。Qualys VMDR使得识别此类设备变得很容易。
Query: operatingSystem.category1:`Linux`
一旦主机被识别出来,就可以将它们与“动态标签”组合在一起,比如说:“Linux 服务器”。这有助于自动对具有上述漏洞的现有主机以及在你的环境中启动的任何新 Linux 设备进行分组。标签使得这些分组设备可以在整个Qualys云平台上进行查询、报告和管理。
基于 RTI 的优先级
使用 Qualys VMDR,可以使用以下实时威胁指标 (RTI) 确定 PwnKit 漏洞的优先级:
- Predicted_High_Risk
- Privilege_Escalation
- Easy_Exploit
- High_Lateral_Movement
使用Qualys VMDR修复
我们预计供应商将在短期内发布针对该漏洞的修复。当修复可用时,Qualys Patch Management可用于将这些修复部署到易受攻击的设备中。
使用基于上述 RTI 方法的相同优先级,客户可以使用漏洞右侧的“立即修复”按钮将 PwnKit 添加到修复作业中。一旦修复发布,Qualys将找到该漏洞的相关修复,并自动将这些修复添加到修复作业中。这将允许客户将这些修复部署到易受攻击的设备上,所有这些修复都来自Qualys云平台。
使用威胁防护检测受影响的设备
VMDR还允许你使用威胁保护自动映射易受PwnKit漏洞攻击的设备。
使用 VMDR 仪表板跟踪漏洞
使用 VMDR 仪表板,你可以实时跟踪此漏洞、受影响的主机、状态和整体管理。为仪表板小部件启用趋势分析后,你可以使用“PwnKit”仪表板跟踪环境中的这些漏洞发展趋势。
利用 Qualys XDR 识别漏洞利用尝试
Qualys XDR 客户可以使用为“T1068 – Linux:检测到 Polkit pkexec 本地特权升级漏洞 (CVE-2021-4034)”的规则名称来检测受影响系统上的利用后活动。启用后,客户还可以使用以下 QQL 查询搜索易受攻击的系统:
- eventName:” The value for the SHELL variable was not found the /etc/shells file“ or “contains suspicious content“
客户将能够看到类似以下截图的输出:
常见问题
哪些版本易受攻击?
从2009年开始的所有Polkit版本都很脆弱。
Qualys研究团队是否会发布此漏洞的利用代码?
不会。但鉴于利用该漏洞非常容易,我们预计在本博客发布日期后的几天内,公开的漏洞利用将变得可用。
是否有缓解措施?
如果你的操作系统没有可用的补丁,你可以从 pkexec 中删除 SUID 位作为临时缓解措施;例如:
# chmod 0755 /usr/bin/pkexec
这个漏洞可以远程利用吗?
不可以,但是如果攻击者可以以任何非特权用户身份登录,则可以快速利用该漏洞来获得 root 特权。
能不能查到被攻击的证据?
是的,这种利用技术会在日志中留下痕迹,比如“在/etc/ SHELL文件中找不到SHELL变量的值”或者“环境变量的值[……]包含可疑内容”。但是,请注意,这个漏洞也可以被利用,不会在日志中留下任何痕迹。
本文翻译自:https://blog.qualys.com/vulnerabilities-threat-research/2022/01/25/pwnkit-local-privilege-escalation-vulnerability-discovered-in-polkits-pkexec-cve-2021-4034