Linux Polkit本地权限提升漏洞处理(CVE-2021- 4034)

2023-11-22 11:40

本文主要是介绍Linux Polkit本地权限提升漏洞处理(CVE-2021- 4034),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、背景

  安全部门近期发出安全预警,提示:常见发现版本的 CentOS、Ubuntu及Debian Linux系统中默认安装的Polkit工具集存在本地权限提升的漏洞CVE-2021- 4034),目前漏洞利用代码已在互联网公开;

在这里插入图片描述

   Linux Polkit工具集是Linux系统在安装过程中自带的系统工具集,其中包括大量运维常用工具,主用于在类 Unix操作系统中控制系统范围权限,通过定义和审核权限规则,实现不同优先级进程间的通讯。polkit存在本地权限提升漏洞,该工具集中的pkexec在特定情况下无法正确处理调用参数计数,因此会尝试将环境变量作为命令执行。攻击者可以通过控制环境变量, 利用该漏洞通过精心设计环境变量诱导pkexec执行任意代码,具有低权限的攻击者可以利用此漏洞绕过pkexec自带的安全保护措施,获取目标机器的ROOT权限,对主机安全造成严重威胁。

本地环境:centos 7.8 2003 BCLinux8.6
cvss评分:7
cvss详情AV:L/AC:L/Au:N/C:C/I:C/A:C
公布时间:2022-01-25 00:00:00
漏洞利用链接:https://www.exploit-db.com/exploits/50689
CNVD-2022-07226

二、受影响版本

目前主流Linux版本均受影响。以下polkit版本为对应操作系统的修复版本:

1)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

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

3)BClinux 8.x

BClinux 8.6:policykit-0.115-13.an8.2.x86_64

三、检测方法

当前该漏洞利用脚本已被上传至Github,地址如下:https://github.com/zhzyker/CVE-2021-4034,说明:https://github.com/zhzyker/CVE-2021-4034/blob/main/readme.md

可使用该脚本检测本机是否存在漏洞,或检查漏洞是否修复完成。

git clone https://github.com/zhzyker/CVE-2021-4034.git
cd cve-2021-4034
或
wget https://github.com/zhzyker/CVE-2021-4034/blob/main/cve-2021-4034.c
gcc cve-2021-4034.c -o cve #普通用户下执行
./cve 'whoami'  #如果出现提升到root,则需要修复
./cve 'whoami&& uname -a'   #现场执行,未复现
rpm -qa|grep polkit #检查当前的版本
pkexec --version  //输出
pkexec version 0.115
rpm -qa|grep polkit  //输出
polkit-libs-0.115-13.an8.2.x86_64
polkit-pkla-compat-0.1-12.el8.x86_64
polkit-0.115-13.an8.2.x86_64

在这里插入图片描述
复现如下:
在这里插入图片描述

四、处理

目前各Linux发行版官方均已给出安全补丁,建议尽快升级至安全版本,如生产实际受限,我们可以采用官方提供的缓解措施来处理。如下:

https://ubuntu.com/security/CVE-2021-4034
https://access.redhat.com/security/cve/CVE-2021-4034
https://security-tracker.debian.org/tracker/CVE-2021-4034

1)Redhat/Centos:

#1、根据提示,安装所需的 systemtap 包和依赖项
yum install systemtap systemtap-runtime -yInstalled:systemtap.x86_64 0:4.0-13.el7                                  systemtap-runtime.x86_64 0:4.0-13.el7                                 Dependency Installed:boost-date-time.x86_64 0:1.53.0-28.el7                 dyninst.x86_64 0:9.3.1-3.el7              efivar-libs.x86_64 0:36-12.el7      kernel-debug-devel.x86_64 0:3.10.0-1160.53.1.el7       libdwarf.x86_64 0:20130207-4.el7          mokutil.x86_64 0:15-8.el7           systemtap-client.x86_64 0:4.0-13.el7                   systemtap-devel.x86_64 0:4.0-13.el7      Complete!#2、安装内核信息包:如果连外网直接运行stap-prep安装,否则请手动安装:kernel-debuginfo-内核版本号、kernel-debuginfo-common-内核版本号、kernel-devel--内核版本号;下载对应的三个rpm 包,地址http://rpm.pbone.net或http://debuginfo.centos.org/。注意不要直接yum install kernel-debuginfo kernel-debuginfo-common kernel-devel, 即使能找到相应的包,也是安装的最新版本,不会自动匹配当前版本。所以我们下载RPM包,再用rpm命令依次安装。
uname -r
3.10.0-693.11.6.el7.x86_64wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-3.10.0-693.11.6.el7.x86_64.rpmwget ftp://ftp.pbone.net/mirror/ftp.scientificlinux.org/linux/scientific/7.1/x86_64/updates/security/kernel-devel-3.10.0-693.11.6.el7.x86_64.rpmwget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-common-x86_64-3.10.0-693.11.6.el7.x86_64.rpmrpm -qa | grep kernel-debuginfo #centos7上如果安装或者升级到了最新的kernel-debuginfo包,会导致类似SystemTap这样需要内核头文件和调试符号的工具执行出错,先检查下
stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}' #没安装会提示
Checking "/lib/modules/3.10.0-693.11.6.el7.x86_64/build/.config" failed with error: No such file or directory
Incorrect version or missing kernel-devel package, use: yum install kernel-devel-3.10.0-693.11.6.el7.x86_64 rpm -ivh kernel-debuginfo-common-x86_64-3.10.0-693.11.6.el7.x86_64.rpm
rpm -ivh kernel-debuginfo-3.10.0-693.11.6.el7.x86_64.rpmPreparing...                          ################################# [100%]installing package kernel-debuginfo-3.10.0-693.11.6.el7.x86_64 needs 212MB on the / filesystem #如果根下空间不够,会安装失败,但不会提示rpm -ivh kernel-devel-3.10.0-693.11.6.el7.x86_64验证:
rpm -qa|grep kernel
kernel-debug-devel-3.10.0-1160.53.1.el7.x86_64
kernel-headers-3.10.0-862.el7.x86_64
kernel-debuginfo-common-x86_64-3.10.0-693.11.6.el7.x86_64
kernel-lt-5.4.148-1.el7.elrepo.x86_64
kernel-debuginfo-3.10.0-693.11.6.el7.x86_64
kernel-devel-3.10.0-693.el7.x86_64 #这个安装错了,应该是kernel-devel-3.10.0-693.11.6.el7.x86_64
kernel-3.10.0-693.11.6.el7.x86_64stap -e 'probe begin{printf("Hello, World"); exit();}'
Checking "/lib/modules/3.10.0-693.11.6.el7.x86_64/build/.config" failed with error: No such file or directory
Incorrect version or missing kernel-devel package, use: yum install kernel-devel-3.10.0-693.11.6.el7.x86_64 
#/lib/modules/3.10.0-693.11.6.el7.x86_64/build/下没有测试文件,这是因为kernel-devel安装错误造成的,重新安装,再次执行:ERROR: module version mismatch (#1 SMP Wed Jan 3 18:09:42 CST 2018 vs #1 SMP Fri Jan 5 00:19:49 CST 2018), release 3.10.0-693.11.6.el7.x86_64
WARNING: /usr/bin/staprun exited with status: 1
Pass 5: run failed.  [man error::pass5]修改/usr/src/kernels/3.10.0-693.11.6.el7.x86_64/include/generated/compile.h的#define UTS_VERSION "#1 SMP Wed Jan 3 18:09:42 CST 2018"
修改时间与上述一致。更改为:Fri Jan 5 00:19:49 CST 2018因为中间生成的C文件和ko模块都是用的cache (蓝色标注的部分),我们把上面的cache文件删除,再重新运行,这次可以成功了。rm /root/.systemtap/cache/ab/stap_ab5e5aad682b3e1a2bbda0079814bf06_1016.c
rm /root/.systemtap/cache/ab/stap_ab5e5aad682b3e1a2bbda0079814bf06_1016.ko#再次执行:
stap -e 'probe begin{printf("Hello, World"); exit();}' #输出如下Hello, Worldll /lib/modules/3.10.0-693.11.6.el7.x86_64/lrwxrwxrwx  1 root root     43 Jan 23  2018 build -> /usr/src/kernels/3.10.0-693.11.6.el7.x86_64#3、安装polkit 调试 info:
debuginfo-install polkitInstalled:expat-debuginfo.x86_64 0:2.1.0-8.el7                       glib2-debuginfo.x86_64 0:2.54.2-2.el7                                      glibc-debuginfo.x86_64 0:2.17-222.el7                      mozjs17-debuginfo.x86_64 0:17.0.0-10.el7                                   pam-debuginfo.x86_64 0:1.1.8-23.el7                        polkit-debuginfo.x86_64 0:0.112-5.el7                                      systemd-debuginfo.x86_64 0:219-30.el7_3.6                  yum-plugin-auto-update-debug-info.noarch 0:1.1.31-54.el7_8                 Dependency Installed:glibc-debuginfo-common.x86_64 0:2.17-222.el7                                                                                          Complete!
#4、创建以下 systemtap 脚本,并将其命名为 pkexec-block.stp:
cat >pkexec-block.stp << EOF 
probe process("/usr/bin/pkexec").function("main")  {if (cmdline_arg(1) == "")raise(9);}
EOF
#5、将 systemtap 模块加载到正在运行的内核中:
stap -g -F -m stap_pkexec_block ./pkexec-block.stp
#6、验证模块加载是否成功
lsmod | grep -i stap_pkexec_block  //输出如下
stap_pkexec_block     257978  0 #6、如果此后将 polkit 包更新到包含修复程序的版本后,可以通过运行以下命令删除 systemtap 生成的内核模块:
rmmod stap_pkexec_block

注:此缓解措施不适用于启用安全启动的系统,因为 SystemTap 需要外部编译服务器才能对生成的内核模块进行签名,将密钥注册到内核的密钥环中。

2)或直接升级polkit

yum update polkit -y

升级完成后为:polkit.x86_64 0:0.112-26.el7_9.1, 而对CentOS 7:polkit-0.112-26.el7_9.1 已满足要求。

pkexec --version //pkexec version 0.112

验证:
在这里插入图片描述
3)Ubuntu:

环境:Ubuntu 16.04.6 LTS //lsb_release -a

检查:dpkg -l|grep policykit
在这里插入图片描述
更新:apt-get install --only-upgrade policykit-1 -y
在这里插入图片描述

五、附录

查看切换我们的进程的 stap 脚本:

在这里插入图片描述
在这里插入图片描述
其中:vmstate结果里:in: The number of interrupts per second, including the clock. 每秒钟中断次数,包括时钟中断.

cs: The number of context switches per second.每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好.上下文切换会影响CPU的利用率.

dstat结果:cpu:hiq、siq分别为硬中断和软中断次数。
system:int、csw分别为系统的中断次数(interrupt)和上下文切换(context switch)。

注:如果测试的话,可借助压测工具,sysbench,sysbench是一款压力测试工具,可以测试系统的硬件性能,也可以用来对数据库进行基准测试;wget https://github.com/akopytov/sysbench/archive/1.0.zip -O “sysbench-1.0.zip”。

但是这2个命令看不出事谁导致的上下文频繁切换,这里借助如下脚本,它会每隔设定的时间打印出TOP 20切换最多的进程和他的pid:

#! /usr/bin/env stap
#name:cswmon.stp
#global csw_count
global idle_countprobe scheduler.cpu_off {csw_count[task_prev, task_next]++idle_count+=idle
}function fmt_task(task_prev, task_next)
{return sprintf("%s(%d)->%s(%d)",task_execname(task_prev),task_pid(task_prev),task_execname(task_next),task_pid(task_next))
}function print_cswtop () {printf ("%45s %10s\n", "Context switch", "COUNT")foreach ([task_prev, task_next] in csw_count- limit 20) {printf("%45s %10d\n", fmt_task(task_prev, task_next), csw_count[task_prev, task_next])}printf("%45s %10d\n", "idle", idle_count)delete csw_countdelete idle_count
}probe timer.s($1) {print_cswtop ()printf("--------------------------------------------------------------\n")
}

执行脚本:stap cswmon.stp 5
在这里插入图片描述
从上图结果,就可以看到进程从哪里切换到哪里,并且发生了多少次, 最后一行,打印出来idle的次数,也就是说这时候系统没啥事情做,就切换到idle(0)这个进程去休息去了。

当运行一个 SystemTap 脚本的时候,SystemTap 会在脚本外构建一个内核模块,SystemTap 然后把这个内核模块加载进内核,允许它直接从内核提取指定的数据。

正常情况下,SystemTap 仅仅会运行在部署了 SystemTap 的系统上。这意味着,如果你想在 10 个系统上运行 SystemTap,你必须把 SystemTap 部署到所有的系统上。有时候,这可能既不可行也不理想。比如,公司政策禁止管理员在指定的机器上安装 RPM 包来提供编译和 debug 信息,从而防止 SystemTap 的部署。为了解决这一问题,SystemTap 允许你使用 Cross-instrumentation。Cross-instrumentation 是一个从一台计算机上的 SystemTap 脚本生成 SystemTap 测量模块并在另一台计算机上使用的过程。

eg:为 2.6.18-92.1.10.el5 (x86_64 架构) 的目标内核从一个名称为 simple.stp 的 SystemTap 脚本创建一个测量模块 simple.ko,使用以下命令:

#语法:stap -r kernel_version script -m module_name;kernel_version 涉及到目标内核的版本(在目标系统上通过 uname -r 命令输出),script 涉及到转换成测量模块的脚本,module_name 涉及测量模块要求的名称。
stap -r 2.6.18-92.1.10.el5 -e 'probe vfs.read {exit()}' -m simple
#上述命令会创建一个名为 simple.ko 的模块,为了使用这个测量模块,拷贝它到目标系统,然后在目标系统运行以下命令,加载模块:
staprun simple.ko  //主机系统必须与目标系统是相同的架构以及相同的 Linux 发行版

这篇关于Linux Polkit本地权限提升漏洞处理(CVE-2021- 4034)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/409890

相关文章

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

mysql外键创建不成功/失效如何处理

《mysql外键创建不成功/失效如何处理》文章介绍了在MySQL5.5.40版本中,创建带有外键约束的`stu`和`grade`表时遇到的问题,发现`grade`表的`id`字段没有随着`studen... 当前mysql版本:SELECT VERSION();结果为:5.5.40。在复习mysql外键约

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

SQL注入漏洞扫描之sqlmap详解

《SQL注入漏洞扫描之sqlmap详解》SQLMap是一款自动执行SQL注入的审计工具,支持多种SQL注入技术,包括布尔型盲注、时间型盲注、报错型注入、联合查询注入和堆叠查询注入... 目录what支持类型how---less-1为例1.检测网站是否存在sql注入漏洞的注入点2.列举可用数据库3.列举数据库

Linux之软件包管理器yum详解

《Linux之软件包管理器yum详解》文章介绍了现代类Unix操作系统中软件包管理和包存储库的工作原理,以及如何使用包管理器如yum来安装、更新和卸载软件,文章还介绍了如何配置yum源,更新系统软件包... 目录软件包yumyum语法yum常用命令yum源配置文件介绍更新yum源查看已经安装软件的方法总结软

linux报错INFO:task xxxxxx:634 blocked for more than 120 seconds.三种解决方式

《linux报错INFO:taskxxxxxx:634blockedformorethan120seconds.三种解决方式》文章描述了一个Linux最小系统运行时出现的“hung_ta... 目录1.问题描述2.解决办法2.1 缩小文件系统缓存大小2.2 修改系统IO调度策略2.3 取消120秒时间限制3

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Linux:alias如何设置永久生效

《Linux:alias如何设置永久生效》在Linux中设置别名永久生效的步骤包括:在/root/.bashrc文件中配置别名,保存并退出,然后使用source命令(或点命令)使配置立即生效,这样,别... 目录linux:alias设置永久生效步骤保存退出后功能总结Linux:alias设置永久生效步骤

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例: