CVE-2021-4034 PwnKit PolKit pkexec 本地提权漏洞

CVE-2021-4034 PwnKit PolKit pkexec Local Privilege Escalation Vulnerability

CVE-2021-4034 是 Qualys Research Team 发现的位于 PolKit pkexec 中的本地提权漏洞,漏洞取名 PwnKit,原始报告可以参考 pwnkit: Local Privilege Escalation in polkit’s pkexec (CVE-2021-4034) / Wayback Machine

该漏洞获得了 Pwnie Awards / Epic Achievement 提名:

  • THAT VIASAT THINGIE
  • Yuki Chen’s Windows Server-Side RCE Bugs
  • pwnkit: Local Privilege Escalation in polkit’s pkexec (CVE-2021-4034)

这个漏洞的利用非常巧妙,有兴趣可以看下 先知社区 - CVE-2021-4034 深入分析及漏洞复现 / Wayback Machine,这篇文章介绍的比较全面(包括漏洞原理、ld.so 处理 SUID-root 程序的危险环境变量、Exploit 实现细节上需要注意的问题等)。

漏洞利用流程

  1. execve 执行 PolKit pkexec 时,让 argv 为空数组(长度为 0
  2. PolKit pkexec argv[1] 越界访问(Out-of-Bounds Read 到 envp[0]
  3. 相对路径扩展(通过 execve 控制 PATH 环境变量,对 envp[0] 实施路径扩展)
  4. argv[1] 越界写入(Out-of-Bounds Write),实现改写 envp[0],达到注入任意环境变量的目的
  5. 利用上一步注入 GCONV_PATH 环境变量,配合 glib 的 g_printerr,在进行字符集转换时实现加载自定义 so 动态库
  6. 完成提权操作

漏洞利用注意事项setenv 可能会导致环境变量数组 envp 发生位置迁移

漏洞修复:除了对 pkexec 本身进行修复外,操作系统层面可能不再支持 execve(path, {NULL}, envp) 这种操作,或者说,至少会对这种特殊的 argv 进行处理,比如转换成 {"", NULL}argc 仍然为 0),这样即使存在类似 pkexec 这样的漏洞,也无法进行利用了。

请作者喝杯咖啡☕