CVE-2021-4034 pkexec提权漏洞学习笔记 2022-01-29 05:57:51 Steven Xeldax # CVE-2021-4034 pkexec提权漏洞 [TOC] ## 漏洞概述 2022年01月26日,Linux发布了pkexec的风险通告,漏洞编号为CVE-2021-4034,漏洞等级:高危,漏洞评分:7.8。目前该漏洞的poc已公开。 pkexec 应用程序是一个 setuid 工具,旨在允许非特权用户根据预定义的策略以特权用户身份运行命令。 polkit 的 pkexec 实用程序中存在一个本地权限提升漏洞。当前版本的 pkexec 无法正确处理调用参数计数,并最终尝试将环境变量作为命令执行。攻击者可以通过控制环境变量来利用这一点,从而诱导 pkexec 执行任意代码。利用成功后,会导致本地特权升级,非特权用户获得管理员权限。 ## 漏洞版本 由于为系统预装工具,目前主流Linux版本均受影响。 **安全版本** 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 20.04 LTS:policykit-1 - 0.105-26ubuntu1.2 Ubuntu 18.04 LTS:policykit-1 - 0.105-20ubuntu0.18.04.6 Ubuntu 16.04 ESM:policykit-1 - 0.105-14.1ubuntu0.5+esm1 Ubuntu 14.04 ESM:policykit-1 - 0.105-4ubuntu3.14.04.6+esm1 ## 漏洞复现 使用的POC ``` https://github.com/arthepsy/CVE-2021-4034/blob/main/cve-2021-4034-poc.c ``` 复现环境:windows 10 下的WSL ![](/download/bc9b4291-1fd2-41d8-aa78-fcbe24a31fcc.png) 复现环境:ubuntu 20.04 ![](/download/441f0e83-8eca-4a82-83ea-abf76e9f2365.png) ## 原理学习 这个漏洞的原理已经有文章说的非常好了 https://saucer-man.com/information_security/876.html#cl-4 ![](/download/d68729ad-8bf0-4525-8da0-f231950d93bf.png) 详细的说明可以看上面的文章,这边自己总结一下,优先这个漏洞的原因在于如下代码中https://gitlab.freedesktop.org/polkit/polkit/-/blob/0.120/src/programs/pkexec.c ![](/download/66119f7a-c534-4e72-8ce8-a22781dc3e0b.png) argv当传入为NUll时候,由于缺乏检测导致后续代码继续执行引起内存读取越界,由于argv 参数在内存空间紧接着env环境变量导致后续在读取argv[1]时候把env环境变量给赋值进了path中。 ``` g_assert (argv[argc] == NULL); path = g_strdup (argv[n]); ``` 接着由于调用了g_find_program_in_path,argv[1]和path会被加上环境变量中PATH的绝对路径 ``` } if (path[0] != '/') { /* g_find_program_in_path() is not suspectible to attacks via the environment */ s = g_find_program_in_path (path); if (s == NULL) { g_printerr ("Cannot run program %s: %s\n", path, strerror (ENOENT)); goto out; } g_free (path); argv[n] = path = s; } ``` 随后调用validate_environment_variable 检查环境变量 ![](/download/8dc2a7fe-8752-4f05-ab6c-1e082ccbd8be.png) 之后就继续执行代码 那么漏洞如何利用呢? 这边就要引入gconv这个trick技巧,由于在转换的字符编码的时候我们能够巧妙的控制环境变量因此可以通过构造特定的PATH,然后利用g_find_program_in_path自己会拼接上环境变量中PATH的这个作用,构造出GCONV_PATH这个环境变量,然后利用SHELL=XXX触发环境变量校验的错误代码逻辑触发g_printerr,最后执行我们在GCONV_PATH执行的so库。 这边摘抄下上述文章中的参考 ``` 首先一个gconv-modules配置文件,放置在./xxx目录下,其内容指向一个准备好的恶意so文件。 创建可执行文件xxx,放置在./GCONV_PATH=.目录下,注意目录名称为GCONV_PATH=. 然后调用pkexec,argc=0,envp={"xxx","PATH=GCONV_PATH=.","LC_MESSAGES=en_US.UTF-8","XAUTHORITY=../LOL", NULL} pkexec执行到610行,path=xxx pkexec执行到632行,找到xxx的具体位置,因为我们制定了环境变量PATH=GCONV_PATH=.,所以会找到xxx的具体位置为GCONV_PATH=./xxx pkexec执行到636行,envp[0] = argv[1] = path= GCONV_PATH=./xxx,此时envp为{"GCONV_PATH=./xxx","PATH=GCONV_PATH=.","LC_MESSAGES=en_US.UTF-8"} pkexec执行到670行,调用validate_environment_variable函数,因为XAUTHORITY环境变量不合法,触发g_printerr函数,从而调用iconv_open()函数,找到gconv-modules配置文件:./xxx/gconv-modules,然后找到so文件,最终执行so文件。 ``` ## 参考资料 - https://github.com/arthepsy/CVE-2021-4034 - https://github.com/berdav/CVE-2021-4034 - https://cert.360.cn/warning/detail?id=25d7a6ec96c91ca4e4238fd10da2c778 - https://blog.qualys.com/vulnerabilities-threat-research/2022/01/25/pwnkit-local-privilege-escalation-vulnerability-discovered-in-polkits-pkexec-cve-2021-4034 - https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html - https://www.freedesktop.org/software/polkit/docs/latest/pkexec.1.html - https://www.cnblogs.com/wayneliu007/p/10321542.html - https://www.qualys.com/2022/01/25/cve-2021-4034/pwnkit.txt