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

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

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

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相关的漏洞利用技术和工具。

“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是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函数。这个功能很实用,在本文第三部分还会涉及到这部分知识。

![](https://awps-assets.meituan.net/mit-x/blog-images-bundle-2017/1ba6b9d7.png)![](https://awps-assets.meituan.net/mit-x/blog-images-bundle-2017/187cc38a.png)

关键代码:

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()函数是核心,在这里执行自己的逻辑。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/478498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Transformer太深不行?NUS字节发现注意力坍缩,提出重注意机制!

文 | 陈萍、杜伟源 | 机器之心CNN 通过堆叠更多的卷积层来提高性能,而 transformer 在层次更深时会很快进入饱和。基于此,来自新加坡国立大学和字节跳动 AI Lab 的研究者引入了 Re-attention 机制,以很小的计算代价重新生成注意力图以增强各层…

LeetCode 212. 单词搜索 II(Trie树+DFS)

1. 题目 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的…

研究综述 | 多关系知识图谱表示学习综述

作者 | CHEONG转载自公众号 | 机器学习与自然语言处理本文分享一篇多关系知识图谱表示学习汇报ppt,介绍近几年及2020新出的共七篇处理异质图的模型。先列出该汇报ppt中将要介绍的七篇论文:Motivation异质知识图谱研究的对象便是如何处理多关系知识图谱&a…

PaddleHub教程合集

原文链接:https://aistudio.baidu.com/aistudio/projectdetail/2168053 PaddleHub教程合集 PaddleHub是基于PaddlePaddle生态下的预训练模型管理和迁移学习工具,可以结合预训练模型更便捷地开展迁移学习工作。通过PaddleHub,您可以&#xff1…

人物志 | KDD Cup 2017双料冠军燕鹏

2017年数据挖掘领域最有影响力的赛事KDD Cup近日揭晓,Convolution队从全球70个国家的3582支队伍里脱颖而出,包揽两项任务的冠军。这支双料冠军队成员名单里,有一个我们熟悉的名字——美团点评高级技术专家燕鹏。 说燕鹏可能大家并不一定知道&…

论文浅尝 - IJCAI2020 | KGNN:基于知识图谱的图神经网络预测药物与药物相互作用...

转载公众号 | AI TIME 论道药物间相互作用(DDI)预测是药理学和临床应用中一个具有挑战性的问题,在临床试验期间,有效识别潜在的DDI对患者和社会至关重要。现有的大多数方法采用基于AI的计算模型,通常倾向于集成多个数…

LeetCode 79. 单词搜索(回溯DFS)

1. 题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 示例: board [[…

中文BERT上分新技巧,多粒度信息来帮忙

文 | ????????????????自然语言处理实在是太难啦!中文尤其难!相比于英文,中文是以词作为语义的基本单位的,因此传统的中文 NLP 都需要先进行分词。分词这步就劝退了很多人,比如“研究生活很充实”&…

监控平台前端SDK开发实践

监控是提高故障处理能力和保障服务质量必需的一环,它需要负责的内容包括:及时上报错误、收集有效信息、提供故障排查依据。 及时上报错误:发生线上问题后,经由运营或者产品反馈到开发人员,其中流转过程可能是几分钟甚至…

论文浅尝 - WWW2020 | 通过对抗学习从用户—项目交互数据中挖掘隐含的实体偏好来用于知识图谱补全任务...

笔记整理 | 陈湘楠,浙江大学在读硕士。现有的知识图谱补全方法都在试图设计全新的学习算法,来使用已知的事实信息去推理知识图谱中的潜在语义。但随着知识图谱的广泛使用,知识图谱中的许多实体对应着应用程序系统的在线项目。但知识图谱和应用…

LeetCode 24. 两两交换链表中的节点(递归+循环)

1. 题目 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3.2. 解题 2.1 递归 class Solut…

美团数据平台融合实践

本文根据作者在2017年ArchSummit的分享记录整理而成。 互联网格局复杂多变,大规模的企业合并重组不时发生。原来完全独立甚至相互竞争的两家公司,有着独立的技术体系、平台和团队,如何整合,技术和管理上的难度都很大。2015年10月&…

CMU MILA 谷歌 | 三家巨头发布史上最干文本增强总结

文 | Sherry一直以来,数据都是推动深度神经网络这个人工智能引擎不可或缺的燃料;然而人工收集足量而优质的数据从来不是一件“便宜”的事,数据增强便是一座富有价值的矿山。在CV中,翻转,裁剪,加噪声等方法被…

论文浅尝 - AAAI2021 | 从历史中学习:利用时间感知拷贝生成网络建模时态知识图谱...

笔记整理 | 朱珈徵,天津大学硕士链接:https://arxiv.org/pdf/2012.08492.pdf动机大型知识图通常会增长以存储时态事实,这些时间事实对实体沿时间线的动态关系或交互进行建模。因为这样的时态知识图经常遭受不完全性的困扰,所以开发…

LeetCode 96. 不同的二叉搜索树(DP)

1. 题目 给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种? 示例:输入: 3 输出: 5 解释: 给定 n 3, 一共有 5 种不同结构的二叉搜索树:1 3 3 2 1\ / / / \ \3 2 1 1 3 2/ …

Android漏洞扫描工具Code Arbiter

目前Android应用代码漏洞扫描工具种类繁多,效果良莠不齐,这些工具有一个共同的特点,都是在应用打包完成后对应用进行解包扫描。这种扫描有非常明显的缺点,扫描周期较长,不能向开发者实时反馈代码中存在的安全问题&…

领域应用 | OMAHA联盟发布“疾病临床表现”、“中毒”知识图谱及OMAHA知识库

转载公众号 | OMAHA联盟资源发布OMAHA已建立“七巧板”医学术语集、“汇知”医学知识图谱、元数据等资源,将于每月发布其中一项。具体各项发布时间为:“七巧板”术语集于每季度第一个月20日发布, “汇知”图谱于每季度第二个月20日发布&#…

聊聊推荐系统中的偏差

文 | 成指导源 | 知乎背景推荐系统中大量使用用户行为数据,作为系统学习的标签或者说信号。但用户行为数据天生存在各式各样的偏差(bias),如果直接作为信号的话,学习出的模型参数不能准确表征用户在推荐系统中的真实行…

云端的SRE发展与实践

本文根据作者在美团点评第21期技术沙龙的分享记录整理而成。 SRE(Site Reliability Engineering)是Google于2003年提出的概念,将软件研发引入运维工作。现在渐渐已经成为各大互联网公司技术团队的标配。 美团点评作为综合性多业务的互联网生活…