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
目录
相关文章
|
安全 网络安全 网络虚拟化
网络工程师必须搞清楚MPLS与专线的区别
基干MPLS的VPN解决方案可以方便地实施流量控制,保证OoS,同时具有很强的扩展性和管理性,且能够提供与传统ATM或帧中继V.PN相类似的安全保证,在企业VPN组网中具有明显优势。
1289 2
|
Prometheus 监控 安全
SpringBoot Actuator未授权访问漏洞的解决方法
SpringBoot Actuator未授权访问漏洞的解决方法Actuator 是 SpringBoot 提供的用来对应用系统进行自省和监控的功能模块,借助于 Actuator 开发者可以很方便地对应用系统某些监控指标进行查看、统计等。
33390 0
|
2月前
|
人工智能 缓存 API
Codex接入DeepSeek‑V4‑Flash实操指南:两套方案补齐识图能力完整保姆级教程
在AI编程Agent工具生态之中,Codex凭借强大的本地工程读写、代码修改、终端命令执行能力,成为开发者做项目调试、代码重构、问题定位的高频客户端。DeepSeek‑V4‑Flash作为一款高性价比文本大模型,拥有百万级超大上下文窗口,在Agent任务规划、代码生成、复杂逻辑推演场景表现突出,API调用成本低廉,非常适合作为Codex底层推理基座。但该模型属于纯文本推理模型,原生并不支持图像输入,当开发者把报错截图、UI界面截图、架构示意图、数据图表粘贴进会话,模型会直接提示无法解析图片内容,大量开发场景直接被阻断。
317 3
|
2月前
|
人工智能 缓存 API
阿里云百炼Night Plan全解析:夜间22:00-08:00错峰AI算力2折起深度指南
阿里云百炼Night Plan是百炼平台推出的**夜间错峰专属优惠计划**,核心价值是在夜间低峰时段为用户提供旗舰模型的超低折扣调用,帮助开发者、创作者与企业大幅降低AI算力成本。该计划覆盖Qwen3.7-Max、Qwen3.7-Plus等核心模型,在每晚22:00至次日08:00(北京时间)自动生效,无需手动切换配置,即可享受最高2折的专属价格,且服务质量、响应速度与白天完全一致。Night Plan深度适配Qoder CN、秒悟Meoo等百炼生态产品,与Token Plan、Coding Plan等订阅方案无缝兼容,是平衡AI算力成本与性能的最优选择。本文将从核心定位、适用范围、计费规则、
355 4
|
SQL Shell 网络安全
vulnhub靶机实战_DC-8
本文介绍DC-8靶机渗透全过程,涵盖环境搭建、信息扫描、SQL注入、密码爆破、反向Shell获取及提权。利用sqlmap与john工具破解用户凭据,通过Web表单执行命令并获取root权限,最终读取flag完成渗透测试。
1507 0
|
安全 Shell Linux
深入剖析Sudo提权:白帽子的防御视角与审计指南
本文深入解析Linux系统中`sudo`提权的常见手法,从白帽子视角出发,剖析攻击原理并提供实用防御与审计策略,助力加固系统权限安全。
877 1
|
存储 关系型数据库 MySQL
【赵渝强老师】使用select...into outfile语句备份MySQL
本文介绍了MySQL中使用`SELECT...INTO OUTFILE`语句将表数据导出为文本文件的方法。通过示例演示了如何备份员工表(emp)的数据,包括创建存储目录、设置权限、配置参数`secure_file_priv`以及解决相关错误的过程。字段分隔符和行终止符可自定义,确保数据格式符合需求。最后展示了备份文件的内容,验证操作成功。
826 36
|
Ubuntu Linux
查看Linux系统架构的命令,查看linux系统是哪种架构:AMD、ARM、x86、x86_64、pcc 或 查看Ubuntu的版本号
查看Linux系统架构的命令,查看linux系统是哪种架构:AMD、ARM、x86、x86_64、pcc 或 查看Ubuntu的版本号
9481 4
|
消息中间件 安全 Java
vulhub部分复现记录(后面大概都是原文档了,也比较难复现就不继续了)
本文介绍了多个软件的安全漏洞及其复现过程,涉及的软件包括Vulhub、Flask、ActiveMQ、Adminer、Airflow、Apache Druid、Apereo CAS、APISIX、AppWeb、Aria2、Bash、Cacti、Celery、CGI、ColdFusion和Confluence。每个部分详细描述了漏洞的背景、环境搭建步骤、漏洞复现的具体操作和验证方法。例如,Flask的SSTI漏洞通过构造特定的模板参数实现命令执行;ActiveMQ的反序列化漏洞利用特制的序列化对象触发;这些示例不仅展示了漏洞的危害性,还提供了实际的复现步骤,帮助读者深入理解这些安全问题。
4170 3
vulhub部分复现记录(后面大概都是原文档了,也比较难复现就不继续了)
|
安全 Ubuntu Linux
CVE-2021-4034 pkexec提权漏洞
Linux Polkit 的 pkexec程序中发现了一个本地权限提升漏洞。pkexec应用程序是一个 setuid 工具,旨在允许非特权用户根据预定义的策略以特权用户身份运行命令。
1195 1