前言
今天突然发现服务器存在漏洞,由于服务器不支持自动修复(主要是没钱),故决定手动对漏洞进行修复,尝试进行复现
分析
Polkit 中的 pkexec 组件存在的本地权限提升漏洞(CVE-2021-4034)
该漏洞是由于 pkexec 在处理传入参数的逻辑出现问题,导致环境变量被污染,最终交由 pkexec 代码逻辑执行实现客户机权限提升。有普通权限用户的攻击者通过执行漏洞文件,触发越界读写,从而在目标系统上造成权限提升。
一个具有注脚的文本。
pkexec为suid程序
当argc(命令行参数个数变量)为0时,pkexec会读取argv[1]变量,而由于Linux进程的内存布局中环境变量是紧接着命令行参数的,因此实际上会读取到第一个环境变量。
读取到argv[1]之后,若其不是以/开头的(即不是绝对路径),则pkexec会将其理解为相对路径,继而会在环境变量中查找PATH变量,将其转换为实际路径。
若PATH环境变量包含一个攻击者可控的路径,则pkexec转换后的实际路径将会是这个攻击者可控的路径下的一个子目录,则显然此实际路径也是攻击者可控的。
pkexec会对argv[1]赋值,将其修改为上述得到的实际路径,但是我们知道argv[1]此时实际上指向的是pkexec的第一个环境变量,也就是说,pkexec将自己的第一个环境变量修改为这个实际路径了。
pkexec会在程序运行过程中调用g_printerr函数,这个函数会在运行的时候按需载入GCONV_PATH环境变量指向的路径下的gconv-modules文件中写明的外部动态链接库(so),并运行其中的初始化函数gconv_init。