Linux 权限提升:PwnKit (CVE 2021-4034)

原文链接:https://www.hackingarticles.in/linux-privilege-escalation-pwnkit-cve-2021-4034/

介绍

Team Qualys在PolicyKit的(polkit)setuid工具pkexec中发现了一个本地权限提升漏洞,该漏洞允许低级用户以特权用户身份运行命令。根据Qualys的说法,该漏洞存在于pkexec.c代码中,该代码无法正确处理调用参数计数,并最终尝试将环境变量作为命令执行。因此,攻击者可以构造环境变量,从而诱使 pkexec 执行任意代码。我们在这个演示中使用了较旧的易受攻击的Ubuntu 20.04,可以从Ubuntu的旧版本页面下载。较新的版本已经附带了一个补丁的polkit框架。Mitre帖子可以在这里找到。

Polkit 和 pkexec

Polkit 和 pkexec: PolicyKit在Linux系统中也被称为polkit。它是程序使用的授权 API,用于将其权限提升为提升用户的权限,并以提升的用户身份运行进程(通常是 root)。如果未指定用户,它将尝试以 root 用户身份运行该命令。Sudo在允许用户以root身份运行命令方面做了同样的事情,但是,使用pkexec,管理员可以通过为其定义策略来精细控制特定程序的执行。Sudo没有限制,用户可以作为提升的用户运行任何命令,他知道密码。Pkexec在设置上也需要付出一些努力,但Debian变体,包括流行的Ubuntu,都预装了polkit和pkexec。这些第三方软件包的授权规则在保存在 /usr/share/polkit-1/rules.d/ 目录中的 JavaScript 文件中定义。

您可以在此处阅读有关 polkit 和基础知识的更多信息。

关于 PwnKit 的详细信息

Pkexec的代码可以在github上查看 这里.在 main 函数中,您可以看到传递了两个参数,argc 和 argv[]。

如果我们不向此函数传递任何参数,则 argc =0 和 argv = NULL。在 for 循环中,n 现在设置为 1,并且循环不会执行,因为条件失败。

执行程序时,参数、环境变量和指针连续放置在堆栈中。路径变量设置为 NULL。这使得 argv[argc] 等于 Null,最后,argv[n] 变为 argv[1](因为 n=11),后者成为 envp[] 或环境变量。作者称之为“价值”。(您可以参考原始帖子以深入了解)

由于路径为 NULL,因此它不以“/”(表示绝对路径)开头,因此,该函数g_find_program_in_path环境变量中搜索值。

变量 s 最终设置为该环境变量“值”

攻击媒介: 攻击者可以创建一个环境变量,并使用此内存损坏技术来运行他自己的名为“value”的可执行文件。因此,攻击者可以使用预先存在的环境变量权限提升方法来利用此漏洞。

示范

此漏洞的概念证明已上传到github上,可以在此处找到。要运行攻击,我们只需要克隆存储库,制作可执行文件并运行它。如上所述,该程序将利用此内存损坏弱点。

仅仅通过两个命令,我们就利用了pkexec的漏洞,并将自己升级到root!

缓解

  • 该漏洞已由相应的供应商修补。在 Ubuntu 20.04 policykit-1 – 0.105-26ubuntu1.2 版本中缓解了这个弱点。
  • 如果没有适用于您的操作系统的修补程序,则可以从 pkexec 中删除 SUID 位作为临时缓解措施。
    chmod 07555 /usr/bin/pkexec

结论

所有未更新的旧版本的 Debian 口味和红帽口味都容易受到这种攻击,这对组织来说是一个严重的风险。这种攻击的易受利用性使其更加危险。强烈建议系统管理员立即更新其已安装的 polkit 软件包。感谢您的阅读。

作者:Harshit Rajpal是InfoSec研究员,也是左右脑思想家。 在这里联系

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部