一、漏洞背景
- Google在2020-03的Android安全公告中,指出了一个联发科芯片手机中的严重安全漏洞,成功利用此漏洞的攻击者可以取得设备的root权限。由于取得了极高的权限,所以攻击者可以进一步实施其它的恶意行为,并且用户毫不知情。漏洞被命名为MediaTek-SU,并以CVE-2020-0069来跟踪。
- 值得注意的是,XDA-Developers在其报告中写到,早在2019年4月,他们就已经知晓了此事。
二、漏洞细节
- 在搭载联发科芯片的智能手机上存在命令队列驱动程序
/dev/cmdq
,该驱动程序具备读写任意内存的功能,代码位于/drivers/misc/mediatek/cmdq/hv1/cmdq_driver.c
的cmdq_ioctl
函数中:
static long cmdq_ioctl(struct file *pFile, unsigned int code, unsigned long param) {
// ...
switch(code) {
// ...
case CMDQ_IOCTL_ALLOC_WRITE_ADDRESS:
do {
struct cmdqWriteAddressStruct addrReq;
dma_addr_t paStart = 0;
CMDQ_LOG("CMDQ_IOCTL_ALLOC_WRITE_ADDRESS\n");
if (copy_from_user(&addrReq, (void *)param, sizeof(addrReq))) {
CMDQ_ERR("CMDQ_IOCTL_ALLOC_WRITE_ADDRESS copy_from_user failed\n");
return -IOCTL_RET_COPY_ALLOC_WRITE_ADDR_FROM_USER_FAIL;
}
status = cmdqCoreAllocWriteAddress(addrReq.count, &paStart);
if (0 != status) {
CMDQ_ERR("CMDQ_IOCTL_ALLOC_WRITE_ADDRESS cmdqCoreAllocWriteAddress() failed\n");
return -IOCTL_RET_ALLOC_WRITE_ADDR_FAIL;
}
addrReq.startPA = (uint32_t) paStart;
CMDQ_LOG("CMDQ_IOCTL_ALLOC_WRITE_ADDRESS get 0x%08x\n", addrReq.startPA);
if (copy_to_user((void *)param, &addrReq, sizeof(addrReq))) {
CMDQ_ERR("CMDQ_IOCTL_ALLOC_WRITE_ADDRESS copy_to_user failed\n");
return -IOCTL_RET_COPY_ALLOC_WRITE_ADDR_TO_USER_FAIL;
}
status = 0;
} while (0);
break;
case CMDQ_IOCTL_READ_ADDRESS_VALUE:
do {
struct cmdqReadAddressStruct readReq;
CMDQ_LOG("CMDQ_IOCTL_READ_ADDRESS_VALUE\n");
if (copy_from_user(&readReq, (void *)param, sizeof(readReq))) {
CMDQ_ERR("CMDQ_IOCTL_READ_ADDRESS_VALUE copy_from_user failed\n");
return -IOCTL_RET_COPY_READ_ADDR_FROM_USER_FAIL;
}
/* this will copy result to readReq->values buffer*/
cmdq_driver_process_read_address_request(&readReq);
status = 0;
} while (0);
break;
// ...
}
// ...
}
- 由于该驱动程序结点的权限配置错误,导致任意应用都可以通过
ioctl
系统调用访问该驱动程序,并且读写任意内存,从而获得root权限。 - 在实际测试过程中发现,联发科将
/dev/cmdq
的SELinux标签配置为了mtk_cmdq_device
,又将该标签的open
、read
和ioctl
系统调用操作权限赋予给了appdomain
域。由于所有Android应用程序都位于appdomain
域中,所以就导致任意应用程序可利用该驱动程序提升自身权限到root。
三、漏洞验证
- 在XDA-Developers论坛上,已经给出了PoC,直接在adb shell中执行即可获得root权限,其源代码并未公开,不过基本的利用原理就是通过
ioctl
系统调用访问/dev/cmdq
来读写内存。 - 该漏洞影响的内核版本:Linux Kernel 3.18, 4.4, 4.9, 4.14
- 该漏洞影响的联发科芯片型号:MT6580, MT6595, MT6735, MT6737, MT6738, MT6739, MT6750, MT6753, MT6755, MT6757, MT6758, MT6761, MT6762, MT6763, MT6765, MT6771, MT6779, MT6795, MT6797, MT6799, MT8163, MT8167, MT8173, MT8176, MT8183
四、漏洞影响
- 任意第三方应用程序都可以利用此漏洞获得root权限,甚至可以关闭SELinux,从而完全控制整个手机。
五、漏洞补丁
- Google已经在2020-03的Android安全公告中已经修复了该漏洞,其Android安全补丁级别为2020-03-05,关于补丁的细节暂未发布。