Android Binder漏洞挖掘技术与案例分享

标签: android binder 技术 | 发表时间:2017-09-14 16:01 | 作者:美团点评技术团队
出处:https://tech.meituan.com/

本文由作者根据其在KCon 2016黑客大会上的演讲内容整理而成。演讲稿链接: Binder fuzzing based on drozer

文章开始,先来看几个我在工作生活中发现的Android漏洞。其中包括Android系统锁屏密码绕过(影响了所有安全补丁在2016年10月份以前的Android 6.0、6.0.1、7.0系统)、三星手机关机窃听、三星手机越权修改主题、系统拒绝服务漏洞。然后我们再来解释相关的技术知识和实践。

Android漏洞案例

Android系统锁屏密码绕过

先来看下漏洞视频演示:
https://v.qq.com/x/page/u0543o9s9fk.html

这个漏洞当时影响 6.0、6.0.1、7.0的所有最新Android系统。运行exp(exp可以是一个没有申请任何权限的APK,也可以是一个二进制的bin文件),就可以清除Android系统的锁屏密码,这里的密码包括指纹密码、手势密码、pin码和password类的所有密码类型,然后就可以成功重置密码。

该漏洞前后有两个CVE(Common Vulnerabilities and Exposures,国际通用的漏洞编号)编号:CVE-2016-3749和CVE-2016-3908。

我在2016年5月份提交给Google,6月1号收到回复:Google内部安全研究员,在4月13号已经发现了该漏洞,漏洞状态置为duplicate。

继续深入分析发现:使用另一个Android 6.0.1分支版本进行测试,发现另一个函数也存在安全漏洞,这个漏洞函数对应的数字和之前的漏洞相同,Android系统漏洞众多的一个很大原因就是碎片化问题。发现这个问题之后,出于一些考虑,并没有马上提交给Google,等Google发布漏洞patch。

Google于7月份发布了该漏洞公告,CVE编号CVE-2016-3749,而patch代码只是修复了我第一次提交的漏洞位置setLockPassword()和setLockPattern()。


于是在漏洞公告发布当天,我又提交了另一份漏洞报告给Google。

Google于2016年7月20号确认该漏洞为高危漏洞,于8月31号分配了CVE-2016-3908,于10月份发布了漏洞公告并致谢。


三星手机关机窃听

漏洞视频演示:
https://v.qq.com/x/page/o0543t0uwkw.html

漏洞细节:
CVE-2016-9567

漏洞原理:
通过未授权访问setmDNIeScreenCurtain()函数,可以控制手机的屏幕,从而造成关机的假象,实现关机窃听。

三星手机越权修改手机主题

三星居然将其与关机窃听这个漏洞合并了!

漏洞视频演示:
https://v.qq.com/x/page/y0543skh3t7.html

系统拒绝服务漏洞

漏洞视频演示:
https://v.qq.com/x/page/a0543ilaytw.html

这样的漏洞很多,上面视频演示中,通过一个NFC tag来实现漏洞利用。

读者如果想了解具体的实现方式,可以参考作者之前写的文章《 Android漏洞利用方式之NFC浅析》。

上面这些好玩的漏洞都与Android Binder有关,接下来我们就带你一起来体验Android Binder相关的漏洞利用技术和工具。

Android Binder简介

"In the Android platform, the binder is used for nearly everything that happens across processes in the core platform."

–Dianne Hackborn,Google

https://lkml.org/lkml/2009/6/25/3

Android Binder是知名女程序员Dianne Hackborn基于自己开发的OpenBinder重新实现的Android IPC机制,是Android里最核心的机制。不同于Linux下的管道、共享内存、消息队列、socket等,它是一套传输效率高、可操作性好、安全性高的Client-Server通信机制。Android Binder通过/dev/binder驱动实现底层的进程间通信,通过共享内存实现高性能,它的安全通过Binder Token来保证。

Binder里用到了代理模式(Proxy Pattern)、中介者模式(Mediator Pattern)、桥接模式(Bridge Pattern)。熟悉这些设计模式有助于更好的理解Binder机制。需要了解以下概念:Binder、Binder Object、Binder Protocol、IBinder interface、Binder Token、AIDL(Android interface definition language)、ServiceManager等。下图大致描述了Binder从kernel层、中间件层到应用层中涉及的重要函数,本文漏洞利用部分会用到。

读者如果想深入了解Binder,推荐阅读: Android Binder Android Interprocess Communication

drozer的架构和高级用法

drozer是MWR实验室开发的一套针对Android安全审计和攻击利用的框架,类似于Metasploit。drozer由三部分组成:Console、Agent、Server。下图左边的部分为Agent界面,运行在手机端,右边的部分为Console界面,运行在PC端。

Agent是一个只申请了internet权限的非特权App,它会开启一个ServerSocket服务,默认监听31415端口。Console连上Server之后就可以控制Agent与Dalvik虚拟机、第三方App的IPC节点(intent)以及底层操作系统进行交互。为什么一个无特权的Agent应用可以无缝与Dalvik虚拟机进行交互呢?

drozer使用了反射和动态类加载的技术。下图右边的部分是官方提供的drozer模块的demo,可以看到这么一行,直接可以new一个Java类对象实例,这里内部实现就用到了Java反射机制。左边的部分是drozer源码的一个目录,可以看到有许多.java源文件和对应的APK文件,drozer使用了动态类加载机制,在运行相应模块时,会将这个APK文件上传到手机上Agent应用的缓存目录,使用动态类加载机制调用类里的Java函数。这个功能很实用,在本文第三部分还会涉及到这部分知识。

关键代码:

drozer有两种模式:直连模式和基础设施模式。Android应用安全审计用到最多的就是直连模式,手机端装上Agent应用,通过USB连接电脑,Console端通过端口转发后即可发送命令给Agent端的Embedded Server,来实现对Agent端的控制。

基础设施模式多用在远程攻击利用上:如下图你可以手动设置Server的host和port,以及是否需要开启密码保护和SSL。

也可以通过源码编译一个无launcher的恶意Agent,只需要下图中一条命令。

编译时可以指定Agent回连的server IP 、port,并且可以通过设置密码来做身份鉴权,只有通过认证的用户才可以与该Agent建立session,因此很适合做Android远控。可以在一台服务器上开启drozer Server,如下图所示命令。

当用户中招(可以通过社工、钓鱼等手段诱导用户下载安装),Agent连上来之后,你可在以任意一台电脑上通过Console连上Server来控制Agent。你可以远程下载安装相应的攻击插件,比如打电话、发短信、读取联系人、上传下载Sdcard文件等。开源的 drozer-modules比较好用的有curesec、metall0id。这些功能在Android 4.3以下很好用,在高系统版本由于各种安全机制的限制,导致许多攻击功能无法完成。

下图展示了用户中招后,通过远程下载安装drozer利用模块,实现读取用户联系人、打电话、中止来电的功能:

drozer是模块化的,可扩展。上文也提到了许多开源的drozer攻击模块。那么如何写一个自己的插件呢?

有两个要素:

1.图中显示的这些元数据是必须的,哪怕是空。
2.execute()函数是核心,在这里执行自己的逻辑。

基于drozer的自动化漏洞挖掘技术

fuzzing是安全人员用来自动化挖掘漏洞的一种技术,通过编写fuzzer工具向目标程序提供某种形式的输入并观察其响应来发现问题,这种输入可以是完全随机的或精心构造的,使用边界值附近的值对目标进行测试。为什么选择drozer来做fuzzing框架呢?可扩展、易用是最大的原因。下面简单介绍我如何使用drozer对Android Binder进行fuzzing测试。

介绍两种:fuzzing intent、fuzzing系统服务调用。

第一种fuzzing intent。这里我介绍一种通用的方式,不依赖数据类型。这里用到了15年初作者发现的通用型拒绝服务漏洞,可以参考发布在360博客上的技术文章 Android通用型拒绝服务漏洞分析报告。简单介绍下这个漏洞的原理:通过向应用导出组件传递一个序列化对象,而这个序列化对象在应用上下文中是不存在的,如果应用没有做异常处理将会导致应用拒绝服务crash。而对Android系统中的一些高权限组件实施这样的攻击,将会导致Android系统拒绝服务重启。 这个漏洞很暴力,可以让很多第三方手机厂商的系统拒绝服务,当然也包括Google原生系统。

第二种是fuzzing系统服务调用。我尽量用大家容易理解的方式来简单介绍这块。Android中有很多系统服务,可以通过adb shell service list这条shell命令列出来。如下图,我的Nexus 5X 7.12系统可以列出126个这样的系统服务。[ ]里是该服务对应的类接口。

这些接口里定义了系统服务用到的函数,下图列出的是lock_settings服务对应的接口类。接口里的每一个函数对应一个整型int值,我们可以对这些函数进行fuzzing,fuzzing其参数。

如下图,我们可以基于shell命令进行fuzzing。举例:adb shell service call lock_settings CODE i32 -1 ,其中CODE部分对应接口类中每一个函数对应的数字,i32是第一个参数的类型,代表32位的整型。

前面提到drozer利用动态加载技术可以加载一个apk文件执行,我们可以利用Java反射机制来确定系统服务中函数的参数个数和类型,然后传入相应类型的随机或畸形数据,这些数据可以通过Ramada生成。

上文也讲到了如何写一个drozer模块,我们只要在execute()函数中执行fuzzing逻辑即可。这里提一下,因为drozer的模块每次修改都需要重新通过module install MODULE_NAME命令进行安装,这里可以把核心功能写在drozer的Python模块里或者写在Java文件里,然后通过外部的Python脚本来自动化这个过程,控制fuzzing的逻辑,通过输出每个fuzzing数据的参数值以及logcat来定位引发漏洞的参数。要注意的是:不是只有Crash才是漏洞,有的漏洞就是正常的调用,并没有Crash异常。我接下来分享的lock_settings服务漏洞就属于这种类型。至此,你就可以写个自己的fuzzer进行自动化漏洞挖掘了。

最后,我们再介绍几种漏洞利用方法。

漏洞利用方法分享

结合AIDL利用

在Android开发中,可以使用Android SDK tools基于AIDL文件自动生成Java语言的接口文件。读者可自行了解更多关于AIDL相关知识。可以参考: 对安卓Bound Services的攻击

关键代码:

通过Java反射利用

和第一种利用方式类似,只是不需要根据AIDL文件生成Java接口文件,直接通过反射利用。

关键代码:

结合Android源码利用

需要将利用代码放在Android系统源码目录进行编译。参考 BinderDemo

关键代码:

通过Java调用shell脚本利用

关键代码:

  Runtime runtime = Runtime.getRuntime();    
Process proc = runtime.exec(command);

shell脚本内容举例:

  service call lock_settings 10 i32 0

作者简介

2017年加入美团点评金融服务平台。从事Android端应用安全和系统漏洞挖掘将近4年,积累了大量真实漏洞案例。后续拟分享Android应用安全系列技术文章,主要从漏洞利用场景、漏洞产生原理、漏洞案例、修复方案来展开,希望能帮助公司开发者提升安全意识,共同构建更加安全,更加健壮的应用软件。

美团点评金融服务平台-安全与合规中心致力于维护美团点评金融平台的安全,努力构建行业顶级安全架构,打造行业领先安全产品。欢迎各位行业同仁加入我们。
联系邮箱:isec#meituan.com

相关 [android binder 技术] 推荐:

Android Binder漏洞挖掘技术与案例分享

- - 美团点评技术团队
本文由作者根据其在KCon 2016黑客大会上的演讲内容整理而成. 演讲稿链接: Binder fuzzing based on drozer. 文章开始,先来看几个我在工作生活中发现的Android漏洞. 其中包括Android系统锁屏密码绕过(影响了所有安全补丁在2016年10月份以前的Android 6.0、6.0.1、7.0系统)、三星手机关机窃听、三星手机越权修改主题、系统拒绝服务漏洞.

Android换肤技术总结

- - SegmentFault 最新的文章
纵观现在各种Android app,其换肤需求可以归为. 白天/黑夜主题切换(或者别的名字,通常2套),如同花顺/自选股/天天动听等,UI表现为一个switcher. 多种主题切换,通常为会员特权,如QQ/QQ空间. 对于第一种来说,目测应该是直接通过本地theme来做的,即所有图片/颜色的资源都在apk里面打包了.

Android开发常用技术建议

- - CSDN博客推荐文章
1.Android应用主线程(UI线程)中,将网络请求、数据库操作等耗时的操作从主线程移动到一个单独的线程中. 使用AsyncTask或者IntentService来创建后台操作. 使用IntentService时需要注意以下几点限制:这个类不要给UI传递信息,使用其他Activity来向UI传数据;每次只能处理一个请求请求过程不能中断;.

Android程序反破解技术

- - CSDN博客推荐文章
    对抗反编译可以大概分为以下几点:.     1、对抗反编译工具,例如apktool、dex2jar等.     2、对抗静态编译,分为代码混淆技术、NDK保护、apk加壳保护.     3、对抗动态调试,分为检测调试器、检测模拟器.     4、防止重编译,分为检查签名,校验保护.     更多相关内容请参考《Android软件安全与逆向分析》.

Android电子市场在华无法访问系技术问题

- bill - cnBeta.COM
昨天,Google旗下Android.com在中国无法访问,引起业界猜测. 今天Google新闻发言人塔基・米多斯(Taj Meadows)告诉CNET:“我们确认,在软件升级过程中出现了技术问题,现在已经修复了.

初探B2G平台:采用部分Android技术 可塑性大

- - 互联网的那点事...
北京时间2月17日消息,科技博客网站Ars Technica日前发表莱恩•保罗(Ryan Paul),对Mozilla正在开发的B2G移动平台做了较为深入的介绍,称这款完全基于浏览器的平台可以实现丰富的用户体验,有望打破现有移动浏览器竞争格局. Mozilla快马加鞭,平台渐具雏形. Mozilla去年启动了一个名为“Boot2Gecko”(简称B2G)的新项目,目标是开发移动操作系统.

基于Android平台的NFC技术的应用实现

- - ITeye博客
      近距离无线通信(NFC)是一种简单的,非触控式的互联技术,可以让消费者简单直观的交换信息,访问内容和服务,在电子消费领域有着广泛的应用. NFC整合非接触式读卡器、非接触式智能卡和点对点(Peer-to-Peer)通信功能,为消费者开创全新便捷生活方式.      NFC终端有三种工作模式:.

Android 动态加载技术三个关键问题详解

- - 移动开发 - ITeye博客
关注微信号:javalearns   随时随地学Java. 动态加载技术(也叫插件化技术)在技术驱动型的公司中扮演着相当重要的角色,当项目越来越庞大的时候,需要通过插件化来减轻应用的内存和CPU占用,还可以实现热插拔,即在不发布新版本的情况下更新某些模块. 动态加载是一项很复杂的技术,这里主要介绍动态加载技术中的三个基础性问题,至于完整的动态加载技术的实现请参考笔者发起的开源插件化框架DL:.

Android 开发有哪些新技术出现?

- - ITeye资讯频道
作为一个程序员,应该养成持续学习的能力,随时关注新技术,有时候做起事来会让你事半功倍的效果. 之前在知乎上看到下面这个问题,觉得很受用,所有就总结了大牛们的回答,也跟着大牛们的脚步,看看有哪些新技术,也跟着学习学习,涨涨见识. 本文参考 @Android 笔记在知乎的回答:. Android 开发有哪些新技术出现.

Google 推出「Android Beam」基于 NFC 技术的手机分享应用(影片)

- austin - Engadget 中国版
其实 Google 早就已经做好在行动装置平台拥抱 NFC 的准备,由电子货币包开始现在来到了手机间的分享技术. 在 Samsung 于香港的发表会上,这个在 Ice Cream Sandwich 系统中称为「Android Beam」的全新功能,其实与 HP 的 Touch-to-share 功能十分相似.