Qualys研究团队在polkit的pkexec中发现了一个内存损坏漏洞,这是一个SUID根程序,默认情况下安装在每个主要的Linux发行版上。此漏洞很容易被利用,任何非特权用户都可以通过在其默认配置中利用此漏洞来获得易受攻击主机的完全 root 权限。
关于 Polkit pkexec for Linux
Polkit(以前称为 PolicyKit)是用于在类 Unix 操作系统中控制系统范围权限的组件。它为非特权进程提供了一种有组织的方式来与特权进程进行通信。也可以使用 polkit 以提升的权限执行命令,使用命令 pkexec 后跟要执行的命令(具有 root 权限)。
PwnKit 漏洞的潜在影响
成功利用此漏洞,任何非特权用户都可以在易受攻击的主机上获得 root 用户权限。Qualys安全研究人员已经能够独立验证漏洞,开发漏洞,并获得Ubuntu,Debian,Fedora和CentOS默认安装的完全root权限。其他 Linux 发行版可能易受攻击,也可能被利用。此漏洞已经隐藏在众目睽睽之下 12 年以上,并且自 2009 年 5 月 pkexec 的第一个版本(提交 c8c3d83,"添加 pkexec(1) 命令")以来,它影响了所有版本的 pkexec。
一旦我们的研究团队确认了该漏洞,Qualys就参与了负责任的漏洞披露,并与供应商和开源发行版协调以宣布该漏洞。
漏洞披露时间表
- 2021-11-18:已向secalert@redhat发送通报。
- 2022-01-11:已向distros@openwall发送通报和修补程序。
- 2022-01-25:协调发布日期(UTC 时间下午 5:00)。
以下是对 PwnKit 漏洞工作原理的解释。
pkexec 的 main() 函数的开头处理命令行参数(第 534-568 行),并在 PATH 环境变量(第 610-640 行)的目录中搜索要执行的程序(如果其路径不是绝对的):
------------------------------------------------------------------------
435 main (int argc, char *argv[])
436 {
...
534 for (n = 1; n < (guint) argc; n++)
535 {
...
568 }
...
610 path = g_strdup (argv[n]);
...
629 if (path[0] != '/')
630 {
...
632 s = g_find_program_in_path (path);
...
639 argv[n] = path = s;
640 }
------------------------------------------------------------------------
不幸的是,如果命令行参数 argc 的数量为 0 – 这意味着如果我们传递给 execve() 的参数列表 argv 为空,即 {NULL} – 则 argv[0] 为 NULL。这是参数列表的终止符。因此:
- 在第 534 行,整数 n 永久设置为 1;
- 在第 610 行,指针路径从 argv[1] 中越界读取;
- 在第 639 行,指针 s 被越界写入 argv[1]。
但是,究竟从这个越界的argv[1]中读取和写入了什么呢?
要回答这个问题,我们必须简要地离题。当我们execeve()一个新程序时,内核将我们的参数,环境字符串和指针(argv和envp)复制到新程序堆栈的末尾;例如:
|---------+---------+-----+------------|---------+---------+-----+------------|
| argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] |
|----|----+----|----+-----+-----|------|----|----+----|----+-----+-----|------|
V V V V V V
"program" "-option" NULL "value" "PATH=name" NULL
显然,由于 argv 和 envp 指针在内存中是连续的,如果 argc 为 0,则越界参数 argv[1] 实际上是 envp[0],即指向我们的第一个环境变量"value"的指针。因此:
- 在第610行,要执行的程序的路径从argv[1](即envp[0])中越界读取,并指向"值";
- 在第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() 函数之前,通常会从 SUID 程序的环境中删除这些"不安全"变量(通过 ld.so)。我们将在下一节中利用这个强大的原语。
最后一点注意:polkit还支持非Linux操作系统,如Solaris和*BSD,但我们尚未调查它们的可利用性。但是,我们注意到 OpenBSD 是不可利用的,因为如果 argc 为 0,它的内核会拒绝执行() 程序。
解决方案:如何修补 PwnKit 漏洞
鉴于此漏洞在 Linux 和非 Linux 操作系统中的攻击面范围很广,Qualys 建议用户立即应用此漏洞的修补程序。
当前的 Qualys 客户可以在漏洞知识库中搜索 CVE-2021-4034,以识别受此漏洞攻击的所有 QID 和资产。
其他感兴趣的各方可以开始免费的Qualys VMDR试用版,以获得对CVE-2021-4034的QID(检测)的完全访问权限,其中可以识别所有易受攻击的资产。
Qualys研究团队在polkit的pkexec中发现了一个内存损坏漏洞,这是一个SUID根程序,默认情况下安装在每个主要的Linux发行版上。此漏洞很容易被利用,任何非特权用户都可以通过在其默认配置中利用此漏洞来获得易受攻击主机的完全 root 权限。
通过免费试用Qualys修复PwnKit漏洞
Qualys 将在下表中发布 QID,因为它们从 vulnsigs 版本 VULNSIGS-2.5.387-2 和 Linux Cloud Agent 清单版本 lx_manifest-2.5.387.2-1 开始可用。
启迪 | 标题 | VulnSigs Version |
376287 | Polkit pkexec 本地权限提升漏洞 (PwnKit) | VULNSIGS-2.5.387-2 / lx_manifest- VULNSIGS-2.5.387.2-1 |
使用 Qualys VMDR 发现易受攻击的 Linux 服务器
识别运行 Linux 内核的资产
下面指导当前 Qualys 客户如何在其环境中检测 PwnKit。
管理此关键漏洞和降低风险的第一步是识别运行 Linux 操作系统的所有资产。Qualys VMDR使识别此类资产变得容易。
查询: 操作系统.类别 1:'Linux'
一旦主机被识别出来,它们就可以用一个"动态标签"组合在一起,比如说:"Linux服务器"。这有助于自动将具有上述漏洞的现有主机以及环境中启动的任何新 Linux 资产分组。标记使这些分组资产可用于整个Qualys 云平台的查询、报告和管理。
基于 RTI 的优先级
使用 Qualys VMDR,可以使用以下实时威胁指示器 (RTI) 确定 PwnKit 漏洞的优先级:
- Predicted_High_Risk
- Privilege_Escalation
- Easy_Exploit
- High_Lateral_Movement
使用 Qualys VMDR 进行修补
我们预计供应商将在短期内发布针对此漏洞的补丁。Qualys补丁管理可用于将这些补丁部署到易受攻击的资产(如果可用)。
使用与上述相同的基于 RTI 方法的优先级,客户可以使用漏洞右侧的"立即修补"按钮将 PwnKit 添加到修补程序作业。补丁发布后,Qualys 将找到此漏洞的相关补丁,并自动将这些补丁添加到补丁作业中。这将允许客户将这些补丁部署到易受攻击的设备,所有这些都来自Qualys Cloud Platform。
使用威胁防护检测受影响的资产
VMDR 还使您能够使用威胁防护自动映射易受 PwnKit 漏洞攻击的资产。
使用 VMDR 仪表板跟踪漏洞
利用 Qualys XDR 识别漏洞利用尝试
Qualys XDR 客户可以使用标题为"T1068 – Linux: Polkit pkexec 检测到本地权限提升漏洞 (CVE-2021-4034)"的规则名称来检测受影响系统上的漏洞利用后活动。启用后,客户还可以使用以下 QQL 查询搜索易受攻击的系统:
事件名称:"在 /etc/shell 文件中找不到 SHELL 变量的值"或"包含可疑内容"
客户将能够看到类似于以下屏幕截图的输出:
常见问题
哪些版本容易受到攻击?
从 2009 年起的所有 Polkit 版本都容易受到攻击。
Qualys 研究团队是否会发布此漏洞的漏洞利用代码?
不。但是,鉴于利用此漏洞的容易程度,我们预计公共漏洞将在本博客发布日期后的几天内可用。
此漏洞是否有任何缓解措施?
如果您的操作系统没有可用的补丁,您可以从pkexec中删除SUID位作为临时缓解措施;例如:
# chmod 0755 /usr/bin/pkexec
此漏洞是否可被远程利用?
不。但是,如果攻击者可以以任何非特权用户身份登录,则可以快速利用此漏洞获得 root 权限。
是否可以检查利用的证据?
是的,此利用技术会在日志中留下痕迹("在 /etc/shells 文件中找不到 SHELL 变量的值"或"环境变量的值 [...]包含可疑内容")。但是,请注意,此漏洞也是可利用的,而不会在日志中留下任何痕迹。
为什么该漏洞被命名为"PwnKit"?
这是一个双关语,旨在说明易受攻击的应用程序 Polkit 的名称。