本文主要吐槽了360爆出的寄生兽漏洞,不得不说这个名字取得也真是不靠谱。

前言

昨天下午360安全播报把我吓了一跳,这个洞的描述简直碉堡:

6月29日,360手机安全研究团队 vulpecker team,向补天漏洞响应平台提交了其发现的安卓app新型通用安全漏洞“寄生兽”,这个漏洞影响市面上数以千万的APP,众多流行APP也包括在内,影响范围包括百度、腾讯、阿里等众多厂商的移动产品。

利用该漏洞的攻击者可以直接在用户手机中植入木马,盗取用户的短信照片等个人隐私,盗取银行、支付宝等账号密码等。目前补天已经将相关详情通知给各大安全应急响应中心,并敦请厂商收到详情及时自查,如果自家app存在相关安全问题,需及时修复。

再来看一下补天的漏洞描述:

360 vulpecker team发现了安卓app一种新型的通用安全漏洞,这个漏洞影响市面上众多流行APP的远程代码执行漏洞,影响范围包括百度、腾讯、阿里等众多厂商的移动产品,利用该漏洞的攻击者可以直接在用户手机中植入木马,盗取用户的短信照片等个人隐私,盗取银行、支付宝等账号密码等。

提取下关键信息,漏洞影响千万APP,包括百度、腾讯、阿里的产品,通用安全漏洞,远程代码执行漏洞。
果真如此的话,这个漏洞简直犀利。

细节

今天早上看到了部分细节:
http://www.aqniu.com/threat-alert/8371.html
以及下午360自己在乌云公布的详细分析:
http://drops.wooyun.org/papers/6910
简单描述一下漏洞细节,APP在调用DexClassLoader函数动态加载插件时,如果函数第二个参数指定的odex文件存在,则会再一个简单的弱校验通过后直接加载该odex。
然而该漏洞是否向360描述的那般强大呢?接下来我将通过360提出的4种攻击场景介绍漏洞的局限:
1)三星输入法远程命令执行漏洞
CVE-2014-2865漏洞描述:

在能够劫持你的网络前提下,攻击者能够利用三星自带输入法更新机制进行远程代码执行并且具有 system 权限。Swift输入法预装在三星手机中并且不能卸载和禁用.即使修改了默认输入法,这个漏洞也是可以利用的。

由于Swift输入法具有system权限,可以直接替换/data/dalvik-cache目录下任意app的缓存文件。然而这个漏洞利用有着较大的局限性:

  1. 设备为S4 Mini, S4, S5, S6在内的Samsung Galaxy S手机CVE
  2. 手机接入了一个不安全的网络环境中,使得攻击者进行中间人劫持

2)利用zip解压缩漏洞覆盖缓存代码
app对zip文件进行解压遍历文件时,会调用ZipEntry.getName()方法,这个方法在官方文档描述了一个安全警告:
链接:http://developer.android.com/reference/java/util/zip/ZipEntry.html#getName() Gets the name of this ZipEntry

Security note: Entry names can represent relative paths. foo/../bar or ../bar/baz ,
for example. If the entry name is being used to construct a filename or as a path
component, it must be validated or sanitized to ensure that files are not written outside
of the intended destination directory.

那么实际上,这是由于app开发者无视了这个安全警告,在调用ZipEntry.getName()方法后,没有对”../“跳转符做过滤,导致了目录遍历,使得app在解压恶意zip压缩包时以本app的权限覆盖了缓存文件。
局限性:

  1. app需要有解压zip压缩包的功能
  2. 不专业的app开发者
  3. 需要向被攻击者发送一个zip压缩包,并诱使被攻击者用该app解压或者手机接入了一个不安全的网络环境中,使得攻击者进行中间人劫持

3)利用adb backup覆盖缓存代码
通过adb连接手机,使用adb backup备份app私有数据,对odex进行篡改后,使用adb restore恢复数据完成odex的替换。
局限性:

  1. manifest文件里没有指定allowBackup=”false”

4)其他可能的APP数据读写
以root权限直接替换任意app的缓存文件。
局限性:

  1. 当攻击者拥有了root权限,还需要替换odex这种繁琐的植入方式???

真相

实际上大部分app都会将插件的缓存文件存放在私有目录下,由于Android的沙箱机制,攻击者要利用这个漏洞首先需要突破沙箱保护。可以看到,360提出的4种攻击场景全部利用了其他的漏洞或者app开发者的粗心大意,从而突破了沙箱保护。
另一方面,由于odex文件与VM版本相关,同一个odex无法在多个设备中正常运行,攻击者需要对识别不同的设备并适配不同的恶意odex,漏洞利用成本进一步加大。
总结一下漏洞利用成功的先决条件:

  1. Android版本低于5.0
  2. 利用了其他可突破沙箱保护的漏洞
  3. 适配设备的odex文件实例

通过上面的分析,“寄生兽”漏洞虽然具有一定的影响面,然而这个漏洞的利用需要另外一个漏洞的帮助(用来突破沙箱保护),远远没有达到360对其描述的危害性。
引用网上(知乎id:shotgun)对这个漏洞的评价:

这个漏洞的利用需要另外一个漏洞的帮助,不知道为什么我就想起了“太阳能电筒”。
1
简单来说,这个漏洞必须要有能访问到私有目录的权限才能运行,所以需要一个能提供类似权限的其他漏洞,比如之前的三星虚拟键盘漏洞。

“这是无需电池的太阳能电筒。”
“那没有光呢?”
“它绝对不会亮!”
“有没有可能没有光也亮呢?”
“你可以用另外一只电筒照着它!”
“哦……”

防范与修复

如何防范?
从用户角度来看:

  1. 升级Android版本到5.0以上
  2. 不要打开并解压来源不可信的zip压缩包
  3. 手机不要接入不安全的wifi无线热点
  4. 不要轻易root手机、已root手机管理好app的授权
  5. 不要通过adb连接到不可信的设备

如何修复?

  1. 每次调用DexClassLoader方法之前,清楚已经存在的odex
  2. DexClassLoader方法的第二个参数(即odex的存放路径)不要指定在sdcard上
  3. 在调用zipEntry.getName()的时候,过滤返回值中的”../“跳转符
  4. 没有必要的情况下,请在manifest文件里显示指定allowBackup=”false”

其他

这里提供一个修改odex文件crc和modWhen的代码:
https://github.com/ele7enxxh/FakeOdex
可用来生成一个恶意的odex,绕过弱检测。
PS:本人水平有限,上面的理解如果有错误,还请海涵。