Android系统服务Fuzz测试
两年前写的东西,现在发一下。写了个最简单的fuzz脚本:基于adb的fuzzer,仅供学习,请勿作不良用途。
一、背景知识
二、Fuzz原理
Android为用户提供的很多功能是通过系统服务实现的。截至Android 6.0,系统服务数量已经达到60多个。系统服务的底层是system_server(以下简称ss),我们知道,Android存在watchdog程序,当系统服务长时间不响应时,watchdog会杀死ss进程,从而导致Android系统的软重启。Android提供的系统服务底层是通过binder进程间通信机制实现的,binder的数据传递过程这不在详解。从Java层传递的数据,最终会在C/C++代码中被使用。不管是java还是c/c++,如果传递了一个null指针引用。将会导致程序的崩溃,Android系统因此也受此影响。本Fuzz测试旨在发现Android系统服务的代码实现中,由于没有null指针做好处理导致的系统奔溃。
Android对外提供的系统服务,根据提供的功能,实现了不同的函数,以供开发者调用。例如,开发者在上层调用发送短信的API,其底层同样是通过binder调用了短信的系统服务。这些可以通过binder调用的方法一般定义在.aidl文件,一些系统服务定义了多达数百个可调用的方法。这样,可通过binder调用测试的方法多大几千个。所以,通过Fuzz测试这些方法不失为一种好的测试手段。
在Android Binder机制实现进程间数据交换(不使用aidl实现)中,已经说明了如何利用binder调用系统服务实现发送短信的功能。除了编写本地App通过binder来调用系统服务之外。其实,Android已经给我们留下了“测试后门”。在shell中,通过service指令可以直接对系统服务进行测试,并支持对所有aidl文件中定义的方法的测试。
其中,service call SERVICE CODE 就是对aidl文件中定义的方法的测试。其中,SERVICE就是对应的service名,code就是在aidl文件中定义的方法,其数值根据定义的方法递增,从1开始。例如,在IAccessibilityManager.aidl文件中,定义了以下方法。
三、测试框架
了解了以下原理之后,就可以编写Fuzz工具进行测试了。这里工具实现方式有两种,一是编写脚本调用的shell提供的service指令测试,而是编写本地App,通过调用binder来对系统服务进行测试。我们采用第二种,更加有利于我们学习Android系统服务及binder通信机制的相关知识。这里不给出具体的代码,后面会上传的github,只给出一些关键的地方。
获取所有的系统服务。
/*** 获取系统中所有的服务名* @return 服务名字符串数组*/public String[] ListService() {String SM[]={};try{SM=(String [])Class.forName("android.os.ServiceManager").getMethod("listServices").invoke(null);// Log.d(tag,"I find there are "+SM.length+" System Services");for(int i=0;i< SM.length;i++){// Log.d(tag,SM[i]);}}catch(Exception e){e.printStackTrace();Log.e(tag, e.toString());}return SM;}
通过反射获取IBinder接口对象。
/*** 使用反射机制获取服务的IBinder接口* @param sername 服务名* @return 返回服务的IBinder接口* @throws Exception*/private static IBinder getIBinder(String sername) throws Exception{Class smcls = Class.forName("android.os.ServiceManager");Method mth = smcls.getMethod("getService", String.class);return (IBinder) mth.invoke(null, sername);}
通过binder获取接口名。
/*** 获取接口名* @param serHandle 服务的IBinder接口* @return 返回接口名字符串* @throws RemoteException*/private static String getInterfaceName(IBinder serHandle) throws RemoteException {Parcel data = Parcel.obtain();Parcel reply = Parcel.obtain();serHandle.transact(INTERFACE_TRANSACTION, data, reply, 0);String interfacename = reply.readString();data.recycle();reply.recycle();return interfacename;}
通过binder调用系统服务函数,进行测试。
void testNUll(String sername, int code) {for (int i = 0; i < testcaseint.length; i++)for (int j = 0; j < testcaseint.length; j++) {try {Log.d(tag, "-" + sername + "-" + code + "-arg1-" + testcaseint[i] + "-arg2-" + testcaseint[j]);Parcel data = Parcel.obtain();Parcel reply = Parcel.obtain();IBinder ib = getIBinder(sername);String in = getInterfaceName(ib);data.writeInterfaceToken(in);data.writeInt(testcaseint[i]);data.writeInt(testcaseint[j]);// data.writeInt(0);// data.writeInt(3);ib.transact(code, data, reply, 0);//可以读出reply中的数据// Log.d(tag, "-" + sername + "-" + code + "-" + "reply is \n" + reply.readString());reply.readException();data.recycle();reply.recycle();} catch (Exception e) {}}}
单次调用binder测试系统服务中定义的方法流程如下。
整个Fuzz工具的架构如下:
还有一个问题,要实现整个Fuzz的自动化,还需要自动化监控系统重启事件。
四、DoS的自动化检测
Android系统开机完成之后,会发出一个BOOT_COMPLETED 系统广播 ,所以通过检测此广播可以监控系统是否发生了重启,从而确定漏洞位置,即哪一个系统服务对应的哪一个方法触发。除此之外,BOOT_COMPLETED 广播是由ActivityManagerService的finishBooting方法发出的,所有可以通过Hook此API完成监测。鉴于Xposed的Hook框架可以很容易的帮助我们做到这点。
Android系统服务Fuzz测试相关推荐
- 符号执行android,Android的fuzz测试技术之符号执行浅谈-android学习之旅(82)
简单的漏洞越来越少,需要改进目前的方法 : 通过符号执行,得出执行路径,然后在进行fuzzy是较为有效的方法之一 1)为待测单元自动地生成可到达的测试数据,即提高测试目标的覆盖率 2)根据特定的漏洞模 ...
- Android开发 系统服务,android 系统服务 开发
<Android系统服务开发>分析了安卓提供的硬件控制机制.编写团队目前均从事相关工作,直接对平台源代码及日志进行分析及测试,介绍了目前尚未普及的安卓平台的硬件控制基本原理及实际框架的劋作 ...
- Android 弱网测试(小米手机切换3g和2g)
Android 弱网测试,目前主要的是4g 弱网的话我们可以使用3g和2g 对app 进行测试 现在以小米手机为例 我们测试不同网络下的加载情况 第一步 第二步 第三步: 然后我们就可以根据不同的网络 ...
- Android App压力测试(Monkey和ADB)
压力测试简介 压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分.压力测试的基本思路很简单:不是在常规条件下运行手动或自动测试,而是在计算机数量较少或系统资源匮乏的条件下运行测试.通常 ...
- Xamarin Android真机测试报错
Xamarin Android真机测试报错 Xamarin Android真机测试报错,错误信息为INSTALL_CANCELLED_BY_USER.出现这个错误,通常都是真机上开发者选项设置错误.由 ...
- java+JBroFuzz对restful api进行fuzz测试
@本文原创,转载请注明 0X00: 序言 fuzz测试作为安全测试的一个基本策略,被越来越多的引入整个测试过程,来避免一些简单的可能引发的安全问题. 如何将fuzzing测试引入软件自动化测试过程是本 ...
- android monkey压力测试(二)
一.什么是Monkey 顾名思义,Monkey就是猴子, Monkey测试,就像一只猴子, 在电脑面前,乱敲键盘在测试. 猴子什么都不懂, 只知道乱敲 通过Monkey程序模拟用户触摸屏幕.滑动T ...
- android 蓝牙链接电脑,如何使从台式电脑到Android设备的测试蓝牙连接
我正在使用具有蓝牙适配器的Ubuntu 11.10台式电脑和使用带有蓝牙的Android 2.2的Android平板电脑. (两款设备上的蓝牙版本应为2.0或2.1版本)如何使从台式电脑到Androi ...
- android 测试 大赛,轻量级android应用自动测试工具-2017全国大学生软件测试大赛.pdf...
轻量级android应用自动测试工具-2017全国大学生软件测试大赛 DroidBot: A Lightweight Android App Testing Bot 轻量级Android应用自动测试工 ...
最新文章
- ORACLE OLAP错误ORA-06512: at SYS.OLAPIHISTORYRETENTION
- Redux 学习笔记
- springboot引入lib包_springboot项目打包引入lib目录下jar包
- 如何允许非Administrator用户远程登录主机
- linux在shell中获取系统时间,linux在shell中获取时间
- Python3.4连接Mysql
- asyn4j -- java 异步方法调用框架
- stunnel使用详解
- h5分线程Worker
- 标准布局类(11中布局类)
- Webpack框架知识整理——Modules
- Fluent中udf编译问题
- 关于网页加载慢的一个解决方法——取消勾选【局域网设置】中的【自动检测设置】
- FoxMail上配置163邮箱的方法
- Power算法求X的N次幂
- Java笔试/面试题
- eNSP-配置单臂路由与静态路由实验
- 妙赞大讲糖:糖友食谱的三宜
- linux软件实现看门狗,一个软件实现的Linux看门狗—soft_wdt
- android studio ant编译,Android Studio编译cocos2dx项目