CVE-2021-3560 是 Polkit(前身为 PolicyKit)中的一个本地权限提升漏洞,Polkit 是 Linux 桌面环境使用的授权框架。本地非特权攻击者可以利用 accounts-daemon D-Bus 接口中的竞态条件创建特权用户、设置其密码,并最终获得 root 访问权限。
accounts-daemon(org.freedesktop.Accounts)是一个系统 D-Bus 服务,负责管理用户帐户(创建、删除、密码更改等)。它暴露了以下方法:
| 方法 | 操作 |
|---|---|
CreateUser | 创建一个新系统用户 |
SetPassword | 设置用户密码 |
DeleteUser | 删除用户 |
这些操作需要授权。当 D-Bus 调用到达时,Polkit 位于调用方与 accounts-daemon 之间:
调用方 → D-Bus → Polkit(授权检查) → accounts-daemon(执行操作)
Polkit 决定调用方是否有权限,如果有,则将请求转发给 accounts-daemon 执行。
该漏洞是一个 TOCTOU(检查时与使用时) 竞态。关键在于:
accounts-daemon 发送一个 D-Bus 方法调用(例如 CreateUser)。accounts-daemon 完成处理之前——用户创建过程会绕过正确认证而通过,但用户记录最终不完整(例如没有密码、没有主目录)。SetPassword,或者不完整状态本身就会授予提升的权限。简言之:在正确的时间终止请求,即可绕过认证。
这个 exploit.sh 脚本自动化了完整的攻击链:
# Clone the repository
git clone https://github.com/Jeanback1/CVE-2021-3560.git
cd CVE-2021-3560
# Make the exploit executable
chmod +x exploit.sh
# Run it
./exploit.sh
一旦漏洞利用完成,你将拥有一个 root shell:
whoami
# root

| 组件 | 受影响版本 |
|---|---|
| polkit | ≤ 0.119(未修补) |
| accounts-daemon(accountsservice) | 所有使用受影响 polkit 的版本 |
该漏洞在 polkit 0.120 及更高版本中已修补。
已修补的发行版(非完整列表):
本仓库仅用于教育和授权的安全研究。请勿在你不拥有或未获得明确测试许可的系统上使用此漏洞利用工具。作者对滥用行为不承担任何责任。
| 步骤 | 操作 |
|---|
| 1. 时间校准 | 使用一次虚拟的 CreateUser("nobody") 调用来测量 D-Bus 往返时间,计算出“终止窗口” |
| 2. 创建用户 | 为选定的用户名发送 CreateUser 调用,在后台启动它,休眠计算出的窗口,然后终止它——利用竞态创建一个未授权用户 |
| 3. 设置密码 | 一旦用户存在(处于不完整状态),使用相同的竞态技术发送 SetPassword 调用,分配一个已知密码 |
| 4. 权限提升 | 使用 su 切换到新用户,运行 sudo(由于用户是通过绕过授权的路径创建的,所以可以正常工作),将 /bin/bash 复制到 /var/tmp/bash 并设置 SUID root,然后生成一个 root shell |