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 实现细节上需要注意的问题等)。
漏洞利用流程:
execve
执行 PolKit pkexec 时,让argv
为空数组(长度为0
)- PolKit pkexec
argv[1]
越界访问(Out-of-Bounds Read 到envp[0]
) - 相对路径扩展(通过
execve
控制PATH
环境变量,对envp[0]
实施路径扩展) argv[1]
越界写入(Out-of-Bounds Write),实现改写envp[0]
,达到注入任意环境变量的目的- 利用上一步注入
GCONV_PATH
环境变量,配合 glib 的g_printerr
,在进行字符集转换时实现加载自定义 so 动态库 - 完成提权操作
漏洞利用注意事项:setenv
可能会导致环境变量数组 envp
发生位置迁移
漏洞修复:除了对 pkexec 本身进行修复外,操作系统层面可能不再支持 execve(path, {NULL}, envp)
这种操作,或者说,至少会对这种特殊的 argv
进行处理,比如转换成 {"", NULL}
(argc
仍然为 0
),这样即使存在类似 pkexec 这样的漏洞,也无法进行利用了。