CVE-2019-14040/14041:高通芯片漏洞影响安卓设备
2020-04-18 11:20:00 Author: www.4hou.com(查看原文) 阅读量:346 收藏

Multiple Kernel Vulnerabilities Affecting All Qualcomm Devices

8个月前,Zimperium (zLabs)安全研究人员向高通报告了2个kernel漏洞,影响含有高通芯片集的安卓设备。漏洞CVE编号为CVE-2019-14040和CVE-2019-14041,攻击者利用这些漏洞和CVE-2017-13253、 CVE-2018-9411、CVE-2018-9539漏洞组合起来可以让恶意app实现完成root权限。提权后,app可以:

· 读取设备上存储的所有隐私数据,比如照片、视频、文本消息、邮件附件等。

· 获取设备上其他app的登陆凭证。

· 在用户不知情的情况下通过摄像头和麦克风录制视频或音频。

漏洞分析

漏洞存在于QSEECOM(QTI Secure Execution Environment Communicator,QTI安全执行环境通信器)驱动文件中。该驱动文件允许正常用户空间简称与安全环境(Secure World)TrustZone进行通信。驱动暴露的API包含对/dev/qseecom的调用。而正常情况下只有一小部分有特权的安卓服务集才可以访问/dev/qseecom。

CVE-2019-14041

该漏洞是有个竞争条件漏洞,可以造成内存破坏。该竞争条件来源于函数——__qseecom_update_cmd_buf。该函数的目标是更新要发送给TrustZone缓存,其中含有TrustZone可以理解的指针。

为了避免代码复制,该函数的目的是处理缓存需要被修改的2种不同情况。因此,该函数可以从两个完全不同的ioctls来访问。根据ioctl被调用的位置不同,该函数有时候的行为也是不同的。为此,该函数要检查data->type:

从上面的代码中可以看出,第一种情况data->type 是QSEECOM_CLIENT_APP。在其他情况下,data->type 是QSEECOM_LISTENER_SERVICE。

但该数据其实是一个指向qseecom_dev_handle struct的指针。如何在__qseecom_update_cmd_buf运行时修改data->type呢?

运行ioctl QSEECOM_IOCTL_APP_LOADED_QUERY_REQ就会ui马上修改data->type。即使有一些机制来限制ioctls的并行运行。但只有在data->type修改后才生效。同时运行ioctl会造成__qseecom_update_cmd_buf产生竞争条件。

该函数是从一个匹配QSEECOM_LISTENER_SERVICE的data->type开始的,然后继续匹配QSEECOM_CLIENT_APP的data->type。

这就会引发不同类型的内存破坏,具体要根据当时的竞争条件来判断。虽然大多数竞争条件是Null Dereference(空指针异常)这样无害的,但是有些竞争条件会引发缓冲区移除这样危险的漏洞利用行为。

CVE-2019-14040

CVE-2019-14040是一个kernel内存映射UAF漏洞。

为了让正常的用户空间进程与TrustZone通信,使用了ION机制。ION机制允许用户空间进程与正常内存不同的行为异常的特殊堆内存。然后,用户空间进程可以与自己的内存空间进行映射,进行读写等操作。

ION与QSEECOM的工作原理是打开/dev/qseecom文件会引用分配的ION缓存。然后,kernel就知道如何缓存与TrustZone进行下一步通信了。虽然主要是用于用户空间进程从ION缓存中进行读写,但kernel有时候可以自己通过__qseecom_update_cmd_buf来修改。

上面的代码是处理一个来自用户空间引用分配的ION缓存的请求。从上面可以看出,与ION缓存相关的多个参数都保存了,比如handle和kernel空间的映射。

QSEECOM中的缓存使用

当释放ION缓存后,kernel会将其设置为NULL。

ION缓存释放后的QSEECOM数据

NULL会在尝试从kernel使用ION缓存时被使用。Handle也会进行验证是否为空。

下面是从打开/dev/qseecom文件引用ION缓存的代码:

很明显,代码不允许在没有检查的情况下从用户空间请求。函数中有多个检查来完整验证来自用户空间的请求。比如,如果请求的长度小于ION缓存的长度,那么请求就是无效的。

漏洞就存在这个检查中。如果请求中的长度太长了会怎么样呢?如果打开引用ION缓存的/dev/qseecom 文件还没有被释放会怎么样?

ION缓存被释放后,接收长度太长的请求后的QSEECOM数据

在该场景中,handle不在为NULL,但是其余参数也不会被修改,所以会指向之前引用的ION缓存。比如,sb_virt指向的是已经释放的映射内存。当尝试从kernel使用引用的ION缓存时,handle不再为空,就会引发UAF漏洞。

总结

攻击者利用这些漏洞可以实现设备的root和kernel权限提升。理论上讲,攻击者利用这些漏洞加上之前发现的漏洞来实现完全root权限。

PoC

完整PoC代码参见GitHub:

https://github.com/tamirzb/CVE-2019-14040

https://github.com/tamirzb/CVE-2019-14041

本文翻译自:https://blog.zimperium.com/multiple-kernel-vulnerabilities-affecting-all-qualcomm-devices/如若转载,请注明原文地址:


文章来源: https://www.4hou.com/posts/Xkmm
如有侵权请联系:admin#unsafe.sh