CVE-2021-4034 Pkexec LPE漏洞复现与原理分析

简介: 国外Qualys安全团队在CVE平台披露了Linux系统Polkit中的pkexec组件存在的本地权限提升漏洞(CVE-2021-4034)。Polkit默认安装在各个主要的 Linux 发行版本上(诸如Ubuntu、Debian、Fedora等知名Linux发型版本),pkexec程序对传入参数未过滤,攻击者可以将环境变量bash作为命令执行,从而诱导 pkexec 执行任意代码,利用成功可导致非特权用户获得管理员root权限。

关键字:安全漏洞;网络安全;信息安全;漏洞挖掘;操作系统

1.引言:

国外Qualys安全团队披露了Linux系统Polkit中的pkexec组件存在的本地权限提升漏洞(CVE-2021-4034)。Polkit(原名PolicyKit)是一个用于在类Unix操作系统中控制系统范围权限的组件。它为非特权进程与特权进程通信提供了一种有组织的方式。还可以使用polkit以提升的权限执行命令,先使用命令pkexec,然后是要执行的命令(前提是具有root权限)。Polkit默认安装在各个主要的 Linux 发行版本上(诸如Ubuntu、Debian、Fedora等知名Linux发型版本),pkexec程序对传入参数未过滤,攻击者可以将环境变量bash作为命令执行,从而诱导 pkexec 执行任意代码,利用成功可导致非特权用户获得管理员root权限。

2.漏洞复现

我们首先利用Github开源POC完成了Linux操作系统的本地提权限攻击(LPE)。
漏洞复现环境是Kali-Linux-2021.2-vmware-amd64,pkexec版本为0.105,通过普通⽤户zhicrsec进⾏复现,获取到root权限,如图2所示。
下载EXP并且编译源代码:
image.png
image.png

3.漏洞分析

3.1 漏洞分析基础环境
实验使用的操作系统是Kali-Linux-2021.2-vmware-amd64 ,polkit源码版本:polkit-0.105,设置GDB汇编风格为Intel,set disassembly-flavor intel,设置gdb的SUID位,避免调试pkexec时执⾏到geteuid函数失败,报错“pkexec must be setuid root”,使用命令sudo chmod 4755 /usr/bin/gdb为GDB提高执行权限.

3.2 漏洞原理

3.2.1 argv中存在的漏洞
我们通过C程序中argc传参程序进行分析,通过GCC命令编译程序。
argc表示参数的个数,argv存放着具体的参数,argv[0]指向程序本身,
argv[1]指向第⼀个参数,argv[2]指向第⼆个参数,...,argv[argc]存放0 表示结束。
image.png
image.png
当我们在命令⾏中执⾏程序时,必须向argc传参,argc的取值⾄少为1,如果不传参数,argv[0]也要指向程序路径本身。而execve函数原型定义如下:

include<unistd.h>

int execve(const char pathname, char const argv[],char *const envp[]);
在特殊情况下,如使⽤execve来调⽤程序,并给 argv传值 NULL,则argc为0。
image.png
image.png
为了验证execve传参问题,即要验证argv与envp在内存分布是连续的。由此更改execve.c与test.c程序,并且通过gcc -g -O0 -o test test.c与gcc -g -O0 -o execve execve.c重新编译程序。
image.png
image.png
image.png
image.png
如图10所示,程序设定argc指为4,加上NULL,argc值为5,这里程序直接输出了10个值,显然是存在缓冲区溢出漏洞。通过此实验证明到argv与envp在内存上布局是连续的,envp内存空间紧跟argv内存空间后面。
3.2.2复现pwnkit.c与argv漏洞的利用
main
image.png
image.png
编译程序时提示, warning: implicit declaration of function ‘g_printerr’,因为g_printer函数是隐式函数,所以需要包含一个.h头文件,func.h内容为void g_printer(void);
image.png
image.png
如图14所示,此时成功运行新生成的test程序,运行run.sh,此时设定两个系统环境变量
image.png
运行run.sh程序,成功在本地获取一个新的普通用户权限。
image.png
在本实验中,当环境变量设置了CHARSET,且不为UTF-8时, g_printerr会进⾏编码转换,⽽转换的⽅法就是根据GCONV_PATH⾥的配置⽂gconv-modules的说明,调⽤ pwnkit.so,从⽽得到shell。此处的pwnkit.sh文件是由cve-2021-4034.sh文件联合cve-2021-4034.c与pwnkit.c编译得到。
image.png
image.png
image.png

3.2.3通过IDA对pwnkit.so层逆向分析

image.png
IDA打开pwnkit.so文件后,我们观察到以上两个程序使用了execve,_setgid,_exit,_setuid等几个关键函数。got段中定义的execve原型:

aPathUsrLocalSb db 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

执行shellcode汇编代码:

var_28          = qword ptr -28h
envp            = qword ptr -20h
var_18          = qword ptr -18h
path            = qword ptr -10h
var_8           = qword ptr -8
; __unwind {
push ebp;开辟新的栈桢
mov rbp,rsp
sub rsp,30h
mov [rbp+var_20],rdi;
lea  rax,aBinsh ;准备写入’/bin/sh’
mov     [rbp+path], rax
mov     [rbp+var_8], 0
lea     rax, aPathUsrLocalSb ; "PATH=/usr/local/sbin:/usr/local
mov     [rbp+envp], rax
mov     [rbp+var_18], 0
mov     edi, 0          ; uid uid=0 设置uid权限
call    _setuid
mov     edi, 0          ; gid gid=0 设置gid权限
call    _setgid
mov     rax, [rbp+path]
lea     rdx, [rbp+envp] ; envp
lea     rcx, [rbp+path]
mov     rsi, rcx        ; argv
mov     rdi, rax        ; path
call    _execve
mov     edi, 0          ; status
call    _exit
; } // starts at 113C

3.2.4探索SUID权限

当⼀个程序被设置了SUID权限,则其他⽤户执⾏该程序时,可以临时切换到程序所有者的权限去执⾏⼀些功能。因为涉及到权限变更,所以在执⾏操作系统⾃带的此类程序时需要被授权。
image.png
授权之后可以使用root权限。
image.png
编写程序main.c与func.h,并且使用gcc -g -O0 test main.c编译,sudo chmod 4755提升test执行权限为root级别。继续编辑新的bash环境变量。
image.png
image.png
分别以root与zhicrsec用户执行bash run.sh|grep AAAAA,用来判断环境变量导入情况。
image.png
image.png
通过实验可以知道,当以普通⽤户身份去执⾏所有者为root且具有SUID权限的程序时,GCONV_PATH、LD_PRELOAD 等不安全的环境变量并不会被引⼊。

3.2.3利用原理进行漏洞分析:

下载源代码poltik-0.105,在Linux上安装编译环境后编译。
image.png

通过./configure&&sudo make编译得到
image.png
image.png
image.png
通过以上的探索,我们不难发现”./pkexec bash”是正常用法,pkexec会进行授权,接着使用root权限运行bash命令。但我们可以跳过授权认证,直接在本地运行root命令。此时我们修改cve-2021-4034.c源代码,进行GDB调试阶段。从源码层面分析授权认证是如何被绕过的?
image.png

3.2.4:继续探索pkexec的授权认证是如何被绕过的

image.png
用命令source set_trace.py,编写bplist GDB辅助调试程序。
image.png
image.png
gdb./pkexec -x bplist调试代码,GDB代码停在了705行,需要进行身份验证。
pkexec.c 705行验证身份程序如下:
result=polkit_authority_check_authorization_sync(authority,subject,action_id,details,POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION,NULL,&error);
image.png
通过GDB调试发现,我们向系统更改path,将path设置成”GCONV_PATH=./pwnkit.so:.”再将path传如argv[1]中,接下来构造错误调用g_printerr函数,触发漏洞利用,最后执行execve("/bin/sh", args, environ)。完成未经授权代码执行。
process 11852 is executing new program: /usr/bin/dash
Error in re-setting breakpoint 1: Function "main" not defined.
Error in re-setting breakpoint 2: No source file named /home/kali/software/release/polkit-
0.105/src/programs/pkexec.c.

whoami

root

3.3 漏洞复现与分析总结

本次实验通过从argc危险传参操作,再到系统变量分析与源代码调试,我们发现了当使⽤普通⽤户权限执⾏pkexec时,GCONV_PATH、LD_PRELOAD等不安全的环境变量会被删除,攻击者可以通过参数数组的越界读写漏洞,重新引⼊不安全的环境变量,进⽽构造利⽤链获取root权限。CVE-2021-4034漏洞是程序设计者未考虑到的参数问题,由于pkexec大部分代码开源,并且由C语言编写,
可以让攻击者通过源码调试的方式找到漏洞。LPE漏洞风险较低,但也需要我嫩引起重视,防止RCE的出现。

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
3月前
|
应用服务中间件 PHP nginx
CVE-2019-11043 复现
CVE-2019-11043 复现
79 5
|
3月前
|
安全 网络安全 Apache
CVE-2021-41773 复现
CVE-2021-41773 复现
214 1
|
5月前
|
Web App开发 安全 JavaScript
心得经验总结:漏洞复现CVE
心得经验总结:漏洞复现CVE
38 0
|
5月前
|
监控 安全 测试技术
CVE-2022-37434漏洞如何处理
【6月更文挑战第18天】CVE-2022-37434漏洞如何处理
580 0
|
安全 测试技术
漏洞复现--CVE-2020-0796getshell
漏洞复现--CVE-2020-0796getshell
漏洞复现--CVE-2020-0796getshell
|
开发框架 安全 PHP
Thinkphp5 5.0.22/5.1.29 远程代码执行漏洞 漏洞复现
Thinkphp5 5.0.22/5.1.29 远程代码执行漏洞 漏洞复现
600 0
|
开发框架 安全 PHP
ThinkPHP5 5.0.23 远程代码执行漏洞 漏洞复现
ThinkPHP5 5.0.23 远程代码执行漏洞 漏洞复现
972 0
|
资源调度 安全 Ubuntu
CVE-2021-3560漏洞复现及原理分析
CVE-2021-3560漏洞复现及原理分析
274 0
|
安全 Java 应用服务中间件
CVE-2023-21839漏洞本地简单复现
CVE-2023-21839漏洞本地简单复现
1079 0
|
安全 jenkins Java
CVE-2017-1000353 Jenkins漏洞复现系列(一)
Jenkins未授权远程代码执行漏洞, 允许攻击者将序列化的Java SignedObject对象传输给Jenkins CLI处理,反序列化ObjectInputStream作为Command对象,这将绕过基于黑名单的保护机制, 导致代码执行
805 0