深入剖析 CVE-2021-3560 与 CVE-2021-4034:原理、区别与联系
CVE-2021-3560 和 CVE-2021-4034 是 2021 年曝光的两个 Linux 本地权限提升漏洞,均涉及 Polkit 组件。由于它们影响广泛且利用门槛较低,迅速引起安全社区关注。本文将深入分析这两个漏洞的技术原理、影响范围、区别与联系,并结合实际案例,提供缓解措施及安全建议。
1. CVE-2021-3560:Polkit 认证绕过漏洞
1.1 漏洞原理
CVE-2021-3560 是一个 认证绕过漏洞,源于 Polkit 处理 DBus 消息时的逻辑缺陷。Polkit(PolicyKit)是 Linux 权限管理框架,通过 DBus 与客户端通信。当用户使用 pkexec
提权时,Polkit 需要验证其权限。
漏洞出现在 Polkit 处理 中断请求 时的逻辑错误:
- 用户发起特权请求(如
pkexec --user nobody
)。 - 在 Polkit 处理该请求的过程中,攻击者通过
SIGTERM
终止进程。 - Polkit 未能正确清理状态,导致后续请求被误认为已通过认证,从而赋予 root 权限。
1.2 技术细节
漏洞位于 polkitd
处理 DBus 消息的逻辑中,涉及 GLib 的 GMainLoop
事件处理机制。由于 PolkitSubject
对象在认证中断后未释放,导致状态混淆。
攻击者可使用以下 PoC(概念验证代码)来利用该漏洞:
for i in {1..100}; do (pkexec --user nobody bash &); sleep 0.01; killall -9 pkexec; done
此代码利用竞态条件,不断中断 pkexec
进程,使得认证状态失效,从而绕过权限检查。
1.3 影响范围
- 受影响版本:Polkit 0.113 至 0.118。
- 受影响系统:Ubuntu 20.04、Debian 10、Fedora 34 等主流发行版。
- CVSS 评分:7.8(高危)。
- 利用门槛:需要本地用户权限,但无需特殊权限。
- 修复方案:漏洞于 2021 年 6 月 3 日公开,0.119 版本修复了状态清理问题。
2. CVE-2021-4034:pkexec 本地提权漏洞
2.1 漏洞原理
CVE-2021-4034(“PwnKit”)是 pkexec
二进制文件中的 本地提权漏洞,源于参数处理错误。
当 pkexec
运行时:
- 若
argc == 1
(无参数),则pkexec
试图解析参数。 - 由于缺少边界检查,
pkexec
试图从环境变量加载动态库,如GCONV_PATH
。 - 攻击者可伪造共享库,使其以 root 权限执行任意代码。
2.2 技术细节
pkexec
源码中的 main()
函数对 argv
处理不当:
int main(int argc, char *argv[]) {if (argc < 2) {char *path = g_find_program_in_path(argv[0]);setlocale(LC_ALL, ""); // 触发 GCONV_PATH 加载}
}
攻击者可以这样利用:
export GCONV_PATH=./malicious_dir
gcc -shared -fPIC -o malicious.so exploit.c
pkexec
pkexec
会加载恶意库 malicious.so
,以 root 权限执行其中的代码。
2.3 影响范围
- 受影响版本:Polkit 0.105 及之后所有版本(漏洞自 2009 年引入)。
- 受影响系统:几乎所有 Linux 发行版(Ubuntu、Debian、CentOS、RHEL 等)。
- CVSS 评分:7.8(高危)。
- 利用门槛:本地用户可直接利用,无需竞态条件。
- 修复方案:2022 年 1 月 25 日披露,0.120 版本修复该问题。
3. CVE-2021-3560 与 CVE-2021-4034 的区别与联系
3.1 主要区别
漏洞编号 | 攻击目标 | 触发方式 | 技术要求 | 影响范围 |
---|---|---|---|---|
CVE-2021-3560 | Polkit DBus | 竞争条件 | 需要精准时序 | 影响 2019-2021 年的系统 |
CVE-2021-4034 | pkexec | 确定性利用 | 仅需环境变量 | 影响 2009 年以来所有系统 |
3.2 共同点
- 都涉及 Polkit 权限管理机制。
- 都可用于本地权限提升,从普通用户提权至 root。
- 都已被黑客利用,成为实际攻击场景中的重要漏洞。
- 都已通过软件更新修复,建议立即升级系统。
4. 防御与缓解措施
4.1 更新系统
- CVE-2021-3560:升级至 Polkit 0.119 或更高。
- CVE-2021-4034:升级至 Polkit 0.120 或更高。
4.2 临时缓解方案
- 移除 pkexec 的 setuid 权限:
chmod u-s /usr/bin/pkexec
- 禁用 Polkit 服务(适用于无 GUI 服务器):
systemctl stop polkit && systemctl disable polkit
4.3 监控与检测
- 检查
pkexec
的异常调用日志:journalctl -xe | grep pkexec
- 使用 SELinux 或 AppArmor 限制
pkexec
访问权限。
5. 结论
CVE-2021-3560 和 CVE-2021-4034 展示了 Linux 权限管理的两个关键问题:
- 认证绕过(CVE-2021-3560)
- 输入验证不足(CVE-2021-4034)
其中,CVE-2021-4034 影响所有主流 Linux 发行版,危害更大。建议 Linux 用户立即更新系统,实施必要的防御措施,以防止本地提权攻击。