从CVE-2021-4034到CVE-2021-3156:Linux本地提权漏洞深度实战指南
凌晨三点,安全团队的告警系统突然亮起红灯——又一台服务器被标记存在高危漏洞。作为运维负责人,你必须在最短时间内判断风险等级、验证漏洞真实性并制定修复方案。本文将带你深入两个近年来影响最广泛的Linux本地提权漏洞:Polkit的PwnKit(CVE-2021-4034)和Sudo的堆溢出(CVE-2021-3156)。不同于简单的漏洞描述,我们会从实战角度还原完整的漏洞分析过程,包括:
- 如何快速搭建漏洞验证环境
- 两种漏洞利用技术的本质差异
- 企业环境中最有效的临时缓解措施
- 长期修复方案的选择与验证
无论你是安全研究人员需要复现漏洞细节,还是系统管理员负责应急响应,这篇文章都将提供可直接落地的技术方案。
1. 漏洞背景与影响范围
2021年对Linux安全来说是充满挑战的一年。两个影响深远的本地提权漏洞相继曝光,分别击穿了系统权限管理的两大核心组件:Polkit和Sudo。虽然最终效果都是获取root权限,但它们的攻击路径和技术原理却大相径庭。
CVE-2021-4034(PwnKit)关键特征:
- 影响组件:Polkit的pkexec
- 漏洞类型:环境变量注入
- 利用条件:任何非特权用户
- CVSS评分:7.8(高危)
- 特殊优势:无需任何用户凭证
CVE-2021-3156(Baron Samedit)关键特征:
- 影响组件:Sudo
- 漏洞类型:堆缓冲区溢出
- 利用条件:需在sudoers列表中
- CVSS评分:7.0(高危)
- 特殊限制:需要知道用户密码
影响范围对比表:
| 维度 | CVE-2021-4034 | CVE-2021-3156 |
|---|---|---|
| 默认存在漏洞的版本 | 2009年后的所有Polkit版本 | Sudo 1.8.2 - 1.8.31p2 |
| 主要受影响发行版 | CentOS/RHEL 6-8, Ubuntu 14-21 | CentOS 6-8, Ubuntu 18-20 |
| 利用复杂度 | 简单(公开PoC直接可用) | 中等(需特定参数构造) |
| 横向移动风险 | 极高(蠕虫级漏洞) | 有限(需账户凭证) |
实际案例:某云服务商在PwnKit披露后24小时内就监测到批量扫描行为,48小时后出现自动化攻击工具。相比之下,Sudo漏洞更多被用于针对性攻击。
2. 漏洞原理深度解析
2.1 PwnKit(CVE-2021-4034)技术细节
Polkit的设计初衷是为系统提供精细化的权限管理,但正是这个安全组件自身出现了致命缺陷。漏洞根源在于pkexec对参数处理的逻辑错误:
// 有问题的参数处理逻辑 if (argc == 0) { // 错误地认为argv[1]是环境变量 envp = argv[1]; }攻击者可以通过精心构造的环境变量实现任意代码执行。具体攻击链如下:
- 通过execve调用pkexec并传递空参数数组
- pkexec错误地将环境变量当作参数读取
- 注入的GCONV_PATH变量触发动态链接器加载恶意.so
- 恶意库中的构造函数函数以root权限执行
关键验证命令:
# 构造恶意环境变量 export GCONV_PATH=/tmp/exploit # 触发漏洞 execve /usr/bin/pkexec []2.2 Sudo堆溢出(CVE-2021-3156)工作机制
与Polkit不同,Sudo漏洞源于经典的缓冲区溢出问题。当处理命令行参数时,特殊构造的输入会导致堆内存越界:
// sudoers.c中的问题代码 if (user_details.uids[0] == (uid_t)-1) { // 错误的长度计算导致溢出 memcpy(dest, src, incorrect_length); }利用这个漏洞需要满足三个条件:
- 目标用户在sudoers列表中
- 知道该用户密码
- Sudo版本在受影响范围内
典型攻击向量:
# 触发溢出的特殊参数格式 sudo -u '#-1' $(perl -e 'print "A" x 1000')3. 漏洞复现实战指南
3.1 实验环境准备
建议使用虚拟机搭建测试环境,以下是推荐配置:
| 组件 | PwnKit测试环境 | Sudo漏洞测试环境 |
|---|---|---|
| 操作系统 | Ubuntu 20.04 LTS | CentOS 7.9 |
| 漏洞软件版本 | polkit-0.105-26ubuntu1 | sudo-1.8.23-10.el7 |
| 内核版本 | 5.4.0-91-generic | 3.10.0-1160.el7.x86_64 |
环境搭建步骤:
- 安装基础系统(禁用自动更新)
- 安装特定版本软件包:
# Ubuntu安装旧版polkit sudo apt install policykit-1=0.105-26ubuntu1 # CentOS安装旧版sudo sudo yum install sudo-1.8.23-10.el7 - 验证版本:
# 检查polkit版本 pkexec --version # 检查sudo版本 sudo --version
3.2 PwnKit复现步骤
- 下载公开PoC:
git clone https://example.com/pwnkit-exploit.git cd pwnkit-exploit make - 执行漏洞利用:
./exploit - 验证结果:
whoami # 应显示root
常见问题解决:
- 如果遇到"permission denied",检查pkexec的SUID位:
ls -l /usr/bin/pkexec - 编译错误可能是缺少gcc或make,安装开发工具包:
sudo apt install build-essential
3.3 Sudo漏洞复现方法
- 准备利用代码(Python示例):
import os payload = 'A' * 1000 os.system(f'sudo -u \\#-1 {payload}') - 执行并观察崩溃日志:
dmesg | tail -n 20 - 完整利用需要构造ROP链(略)
4. 修复方案与防护措施
4.1 临时缓解方案
对于PwnKit:
# 移除pkexec的SUID位 chmod 0755 /usr/bin/pkexec # 验证防护效果 ./exploit # 应失败对于Sudo漏洞:
# 限制sudo命令长度 echo 'Defaults pwfeedback' >> /etc/sudoers4.2 永久修复方案
各发行版升级命令:
| 发行版 | PwnKit修复命令 | Sudo漏洞修复命令 |
|---|---|---|
| Ubuntu | sudo apt install policykit-1 | sudo apt install sudo |
| CentOS | sudo yum update polkit | sudo yum update sudo |
| RHEL | sudo dnf upgrade polkit | sudo dnf upgrade sudo |
验证修复:
# 检查polkit版本 rpm -q polkit # 应 >= 0.116-7 # 检查sudo版本 sudo --version # 应 >= 1.9.5p24.3 深度防御建议
实施最小权限原则:
- 定期审核sudoers文件
- 使用
visudo进行语法检查
系统加固措施:
# 启用内核防护 echo 1 > /proc/sys/kernel/randomize_va_space监控与检测:
- 审计pkexec和sudo的异常调用
- 监控/etc/passwd和/etc/shadow的异常修改
在一次金融系统的渗透测试中,我们发现虽然系统已经修补了Sudo漏洞,但由于未清理测试账户,攻击者仍然可以利用弱密码和残留的sudo权限进行提权。这提醒我们漏洞修复后的清理工作同样重要。