执行步骤
1、使用drozer命令扫描run scanner.provider.traversal -a com.mwr.example.sieve
2、扫描结果中存在Vulnerable Providers说明存在文件遍历风险。
预期结果:不存在文件遍历漏洞。
整改建议:系统对在调用文件参数时添加防御。
8、Service组件测试
Service组件越权漏洞
安全风险:攻击者可以发送恶意的消息,控制Service执行恶意动作或者造成信息泄露。
执行步骤
1、使用drozer命令 run app.service.info -a xxxx查看service组件暴露。
2、通过定位的service,找到应用程序定义的在接收到消息时的各项参数以及各种处理逻辑。
3、查看业务逻辑寻找是否能够直接调用Service组件,能否能进行越权操作。如果可以风险存在,停止测试,记录漏洞。
预期结果:系统为Service组件分配了适当权限。
整改建议:
- AndroidManifest.xml文件的各receiver标签中,设置android:exported="false";
- 或者在AndroidManifest.xml中,申明一个私有权限,级别为signature;
- 只被应用本身使用的service应设置为私有;
- 尽量不发送敏感信息,在service接收到的数据需需谨慎处理,对调用的接口做校验;
空广播造成Service组件拒绝服务
安全风险:攻击者可以发送恶意的消息,控制Receiver执行恶意动作或者造成信息泄露。
执行步骤
1、查看AndroidManifest.xml文件,定位各Receiver,尤其是设置了android:exported="true"的。
2、尝试调用服务组件,run app.service.start --action 服务名 --component 包名 服务名,查看是否能够造成应用程序拒绝服务。
预期结果:系统为Service组件分配了适当权限。
整改建议: AndroidManifest.xml文件的各组件标签中,设置android:exported="false";组件接收消息代码中增加消息异常处理机制。
备注:其他类型的拒绝服务攻击参考SEC_AN_ PLUS_11.1 intent应用本地拒绝服务漏洞。
intent应用本地拒绝服务漏洞
安全风险
Android系统中提供了Intent机制来协助应用间的交互与通讯,例如:应用A发出一个intent信息,系统根据intent的描述,负责找到可以解析该intent消息的应用B。
B应用负责接收intent的组件,在解析intent数据时,会通过Intent的getXXXExtra()函数,如果解析为空数据、异常、或是畸形数据,就可能会导致程序崩溃。
执行步骤
1、攻击者向Intent传入自定义的序列化对象,被攻击者在组件里解析该序列化数据,可能出现出现找不到类出现ClassNotFoundException异常而崩溃。攻击代码如下:
Intent intent = new Intent(); intent.setAction("serializable_action"); intent.setClassName("com.my.test", "com.my.test.MainActivity"); // 指定攻击目标的包名和Activity入口 intent.putExtra("serializable_obj",XXX); //此处是传入畸形数据 startActivity(intent);
2、数组越界 IndexOutOfBoundsException 异常导致的拒绝服务,如果程序没有对getIntegerArrayListExtra()等获取到的数据数组元素大小的判断,从而导致数组访问越界而导致应用崩溃;攻击应用代码片段:
Intent intent = new Intent(); intent.setClassName("com.alibaba.jaq.pocforrefuseservice", "com.alibaba.jaq.pocforrefuseservice.MainActivity"); ArrayList user_id = new ArrayList(); //定义数组 intent.putExtra("user_id", user_id); startActivity(intent); )
预期结果:在使用Intent获取数据时对异常做了充分的处理。
整改建议
建议处理通过Intent.getXXXExtra()获取的数据时进行以下判断,以及用try catch方式进行捕获所有异常,以防止应用出现拒绝服务漏洞:
- 空指针异常;
- 类型转换异常;
- 数组越界访问异常;
- 类未定义异常;
- 其他异常;
开放网络服务安全测试
安全风险
Android应用通常使用PF_UNIX、PF_INET、PF_NETLINK等不同域名的socket来进行本地进程间通信或者远程网络通信,这些socket暴漏了潜在的本地或远程攻击面,历史上也出现过不少利用socket进行拒绝服务、root提权或者远程命令执行的案例。
特别是PF_INET类型的网络socket,可以通过网络与Android应用通信,其原本用于linux环境下开放网络服务,由于缺乏对网络调用者身份或者本地调用者的安全检查机制,在实现不当的情况下,可以突破Android的沙箱限制,对被攻击的应用执行命令,导致比较严重的漏洞。
执行步骤
1、使用反编译工具打开应用,反编译出应用源码。
2、检测对收到socket数据是否进行处理,代码示例如下:
//定义读取socket命令 public static String readCMDFromSocket(InputStream in) { int MAX_BUFFER_BYTES = 2048; String msg = ""; byte[] tempbuffer = new byte[MAX_BUFFER_BYTES]; try { int numReadedBytes = in.read(tempbuffer, 0, tempbuffer.length); if( numReadedBytes > -1 ) msg = new String(tempbuffer, 0, numReadedBytes, "utf-8"); tempbuffer = null; } catch (Exception e) { e.printStackTrace(); } return msg; } ... //处理socket信息 public void handlemsg() { ... msg = readCMDFromSocket(in) if ("exec" == msg) { //没有任何的socket命令校验 ... ... } ... }
3、如果出现类似以上代码,未对接收到的socket和内容做任何校验检查,则风险存在。
预期结果:对socket数据内容进行校验。
整改建议:直接传递命令或者间接处理敏感信息时,避免使用socket实现。
运行其它可执行程序风险
安全风险
APP中使用了有运行其他程序的代码逻辑,如果执行的代码是第三方库中,可能会存在未知的恶意行为,如果是程序自身代码,若调用逻辑有缺陷可能会导致执行其他恶意的第三方程序,攻击者可能会利用该缺陷执行恶意代码。
执行步骤
1、使用反编译工具打开应用,反编译出应用源码。