研究人员利用Ubuntu桌面版USBCreator D-Bus漏洞进行权限提升。
研究人员发现USBCreator D-Bus接口漏洞,攻击者利用该漏洞可以绕过sudo的密码安全策略以sudoer组用户权限访问。漏洞允许攻击者以root权限用任意内容覆写任意文件,而且无需提供密码。比如,覆写shadow文件或为root文件设置密码就可以进行权限提升。
Ubuntu桌面版利用D-Bus作为进程间通信(inter-process communications, IPC)的中介。在ubuntu中,有多个消息总线可以同时运行:system总线和session总线。system总线是特权服务用来提供系统范围内相关的服务,每个登陆的用户都有一个session总线,只对特定用户提供相关的服务。因为要进行权限替身,因此本文主要关注如何以更高的权限来运行session总线服务。
注:D-Bus架构对每个session总线都使用一个router,会将客户端消息重定向到尝试交互的服务。客户端需要指定需要发送消息的服务的地址。
每个服务在对象和服务中有定义。可以把对象看作标准OOP语言的类的实例。每个唯一的实例在对象路径中都可以唯一识别,对象路径看起来像一个唯一识别每个服务暴露的对象的文件系统路径的字符串。标准接口org.freedesktop.DBus.Introspectable
有助于本研究。该接口含有一个简单的方法Introspect
,可以返回对象支持的方法、信号和特征的XML表示,本文主要关注其中的方法。
研究人员使用2个工具来与D-Bus接口进行通信:CLI工具gdbus和D-Feet。Gdbus可以很容易地调用脚本中方法暴露的D-Bus;D-Feet是一个基于GUI工具的python脚本,可以在每个总线上枚举可用的服务,并查看每个服务含有哪些对象。
图1. D-Feet 主窗口
图2. D-Feet接口界面
图1中可以看到用D-Bus daemon系统总线注册的不同服务。研究人员选择org.debin.apt
服务,D-Feet就可以自动查询所有可用对象的服务。一旦选择特定的对象,所有的接口集、对应的方法特征和信号都会列出来,如图2所示。
可以看到每个进程的pid以及命令行。这是非常有用的特征,因为可以验证正在检查的目标服务器是部署以更高的权限在运行。系统总线上的一些服务并不是以root权限运行的。
D-Feet允许用户调用不同的方法。在输入屏的方法中,可以执行python表达式的列表,用逗号分开,会被翻译为调用函数的参数如图3所示。Python类型会被理解为D-Bus类型并传递给服务。
图3. 通过D-Feet调用D-Bus方法
一些方法在调用前需要认证。研究人员没有使用这些方法,因为研究的目标是在不提供凭证的情况下进行权限提升。
图4. 需要认证的方法
一些服务器会查询另一个D-bus服务org.freedeskto.PolicyKit1
用户是否允许来执行特定的动作。
在搜索不同的D-bus服务时,研究人员发现了一个以非特权服务存在的特权服务,该服务不需要认证,而且用户控制的输入会影响其操作。在对用户输入不做适当的处理和验证的情况下,调用程序或文件I/O操作都可能会导致系统被黑。
有漏洞的特定服务是com.ubuntu.USBCreator
。在/com/ubuntu/USBCreator
对象下有一个Image方法,是由Ubuntu的USB Creator工具使用的。
图5. com.ubuntu.USBCreator服务
图6. /com/ubuntu/USBCreator的Image方法
研究人员分析该服务,发现它属于特权服务
图7. 服务是特权服务
因为该服务是python实现的,因此可以简单检查相关的源代码。首先,研究人员注意到与该方法进行交互要求的权限是com.ubuntu.usbcreator.image
。可以从源代码中看到会查询polkit来确定请求的用户是否被授权该请求,第172行。
图8. USBCreator源码
通过检查polkit的配置文件,如图9所示,研究人员发现Unix组sudo有这个功能。相关的文件位于/var/lib/polkit-1/localauthority
,研究人员检查的文件是/var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla
。
图9. 从26行开始表明哪个组允许访问com.ubuntu.usbcreator.image
通过检查该服务的源代码,研究人员发现其中含有一个Unix工具dd
的python实现。该工具可以用来在不同位置之间复制文件。方法_builtin_dd
的输入可以直接从用户输入中获取。而且在源或目标路径上都不会进行路径处理检查,也不会使用密码同时,这就允许用户以root权限来覆写文件系统上的任意文件,如图10所示。
图10. 以root权限在无需密码的情况下创建文件
目前还没有发现该漏洞的任何在野利用。6月18日,Ubuntu已经发布了补丁要求在启动USBCreator实际提供密码认证。
https://unit42.paloaltonetworks.com/usbcreator-d-bus-privilege-escalation-in-ubuntu-desktop/