【转载】Android app 安全测试调研及执行

时间:2021-07-12 23:12:00

本文来源于:http://testerhome.com/topics/2209

一、通过在线工具进行测试

1.腾讯金刚审计系统
http://service.security.tencent.com

优点:包含了修复建议

2.阿里聚安全检测

网址: http://jaq.alibaba.com/ 
阿里聚安全下有自己的安全博客,包含一些:1.安全漏洞、2.病毒分析、3.技术研究、4.安全报告相关文档。

3.360捉虫猎手检测结果

网址: http://appscan.360.cn/ 
同样有自己的安全博客

4.爱加密

网址:http://safe.ijiami.cn/analyze
优点:在导出的报告中可以看到对当前apk的评分

5.百度MTC

网址: http://mtc.baidu.com/

总结
经比较感觉腾讯金刚审计系统和360捉虫猎手检测结果更全面详细,而且包含修复建意
在线工具的缺点是会把apk暴露出来。

二、使用Drozer测试

1.Drozer简介

drozer是一款针对Android系统的安全测试框架。drozer可以帮助Android app和设备变得更安全,其提供了很多Android平台下的渗透测试exploit供你使用和分享。对于远程的exploit,它可以生成shellcode帮助你进行远程设备管理。

1.更快的Android安全评估
drozer可以大大缩减Android安全评估的耗时,通过攻击测试暴露Android APP的漏洞。

2.基于真机的测试
drozer运行在Android模拟器和真实设备上,它不需要USB调试或其他开发即可使用。

3.自动化和扩展
drozer有很多扩展模块,你可以找到他们进行测试以发现Android安全问题。

2.Drozer的安装和使用

1.安装
Drozer下载地址:http://mwr.to/drozer 
1.在客户端安装Drozer

2.在手机端或模拟器安装agent.apk

3.在手机端或模拟器运行agent.apk点击开启-->Embedded Server-->Enable

4.建立端口转发,drozer使用31415端口,即执行命令:adb forward tcp:31415 tcp:31415

5.drozer console connect

6.安装包中还包含一个测试应用程序sieve.apk

具体可参考:https://www.mwrinfosecurity.com/system/assets/559/original/mwri_drozer-users-guide_2013-09-11.pdf

2.Drozer测试my.akp

1)查看所有的安装的App的包名

dz> run app.package.list
2)查找my.apk

dz> run app.package.list -f sample
com.xxx.xx (my)

3)获取my.apk的一些基本信息

dz> run app.package.info -a com.xx.xxx

Package: com.xx.xxx
Application Label: my
Process Name: my
Version: 1.0
Data Directory: /data/data/com.xxxx.xxxx
APK Path: /data/app/com.xxx.xx-1.apk
UID: 10217
GID: [3003, 1028, 1015]
Shared Libraries: null
Shared User ID: null
Uses Permissions:
- android.permission.READ_LOGS
- android.permission.INTERNET
- android.permission.ACCESS_NETWORK_STATE
- android.permission.READ_PHONE_STATE
- android.permission.ACCESS_WIFI_STATE
- android.permission.WRITE_EXTERNAL_STORAGE
- android.permission.WAKE_LOCK
- android.permission.VIBRATE
- android.permission.WRITE_SETTINGS
- org.agoo.android.permission.MESSAGE
- android.permission.CHANGE_NETWORK_STATE
- android.permission.CHANGE_WIFI_STATE
- android.permission.GET_TASKS
- android.permission.SEND_SMS
- android.permission.READ_EXTERNAL_STORAGE
- android.permission.RECEIVE_SMS
- android.permission.SYSTEM_ALERT_WINDOW
- android.permission.ACCESS_COARSE_LOCATION
- android.permission.ACCESS_FINE_LOCATION
- android.permission.RESTART_PACKAGES
- android.permission.MANAGE_ACCOUNTS
- android.permission.GET_ACCOUNTS
- android.permission.READ_CONTACTS
Defines Permissions:
- org.agoo.android.permission.MESSAGE
dz>

分析:可以看到myapk的版本信息,数据存储的目录,用户ID,组ID,是否有共享库,还有权限信息等。

4)APP攻击面分析

分析Activity/Broadcast Receiver/Content Provider/Service是否能被其他的的应用程序调用

dz> run app.package.attacksurface com.xxx.xxxx
Attack Surface:
5 activities exported
0 broadcast receivers exported
0 content providers exported
0 services exported
is debuggable
dz>

分析:结果显示了潜在可以利用的组件个数: “exported”表示组件可以被其他App使用。 services is debuggable表示我们可以用adb绑定一个调试器到进程。

调试方法参见:http://bobao.360.cn/learning/detail/140.html

5)Activity组件暴露

dz> run app.activity.info -a com.xxx.xxxx
Package: com.xxxx.xxxx
com.xxxxx.xxx.xSinaWeiboActivity
Permission: null
com.tencent.tauth.AuthActivity
Permission: null
com.xxx.xxxx.xxxx.WXEntryActivity
Permission: null
com.xxx.xxx.ContainerActivity
Permission: null
com.xxxxx.xxxx.MainActivity
Permission: null
dz>

分析:其中上图的MainActivity是程序启动时主界面,必须是exported,其他几个activity是理论上说是不能exported的。

我们可以通过命令run app.activity.start --component 包名 包名.类名启动Activity

dz#> run app.activity.start --component com.xxx.sample 包名.类名
dz#> run app.activity.start --component com.xxxx.sample com.xxx.xxxxx.WXEntryActivity

解决方案:

保护应用程序组件

① 设置android:exported属性为false

在AndroidManifest.xml文件中,我们应该设置设置android:exported属性为false来保护应用。

② 通过权限控制限制访问

android:exported属性不是唯一的限制措施。我们还可以通过基于权限的方法来定制一个Activity的权限。这个可以限制应用之间的访问权限。

无需暴露的组件请设置exported=”false”;若需要外部调用,建议添加自定义signature或signatureOrSystem级别的私有权限保护;需要暴露的

组件请严格检查输入参数,避免应用出现拒绝服务。

6)ContentProvider组件暴露

dz> run app.provider.info -a  com.xxxx.sample
Package: com.xxxxx.sample
No matching providers.
dz>

分析:我们可能没有用到Content Provider或者说是安全的。如果包含则会显示exported的content provider的具体信息,包括名字,权限,访问路径等,就可以做一此类如Sql注入的操作。

① 检查是否有sql注入

dz> run scanner.provider.injection -a com.xxxxx.sample
Scanning com.xxxx.sample...
D:\Java\jdk1.8.0_11\bin\javac.exe -cp C:\drozer\lib\drozer\lib\android.jar ZipUtil.java
C:\drozer\lib\drozer\lib\dx.bat --dex --output 4a78a7a38b67b985beccf6efac92375b.apk ZipUtil.class
trouble processing:
bad class file magic (cafebabe) or version (0034.0000)
...while parsing ZipUtil.class
...while processing ZipUtil.class
1 warning
no classfiles specified
drozer could not find or compile a required extension library.
dz>

② 检查是否存在遍历文件的漏洞

dz> run scanner.provider.traversal -a com.xxxxx.sample
Scanning com.xxxx.sample...
D:\Java\jdk1.8.0_11\bin\javac.exe -cp C:\drozer\lib\drozer\lib\android.jar ZipUtil.java
C:\drozer\lib\drozer\lib\dx.bat --dex --output 4a78a7a38b67b985beccf6efac92375b.apk ZipUtil.class
trouble processing:
bad class file magic (cafebabe) or version (0034.0000)
...while parsing ZipUtil.class
...while processing ZipUtil.class
1 warning
no classfiles specified
drozer could not find or compile a required extension library.
dz>

7)Broadcast receivers组件暴露

通过反编译可以看到有三个广播接收器被注册,且未设置exported=“false”

风险描述

导出的组件可以被第三方app任意调用,导致敏感信息泄露或者恶意攻击者精心构造攻击载荷达到攻击的目的。

修复建议

如果组件不需要与其他app共享数据或交互,请将AndroidManifest.xml 配置文件中设置该组件为exported = “False”。如果组件需要与其他app共享数据或交互, 请对组件进行权限控制和参数校验。

8)Service组件暴露

① 获取是exported状态的services的

dz> run app.service.info -a com.xxxxx.sample
Package: com.xxxxx.sample
No exported services.
dz>

分析:没有exported的services

② 关于Services模块

dz> cd app
dz#app> cd service
dz#app.service> ls
app.service.info Get information about exported services
app.service.send Send a Message to a service, and display the reply
app.service.start Start Service
app.service.stop Stop Service dz#app.service>

3.Logcat安全
android.permission.READ_LOGS:app读取日志权限,android 4.1之前版本通过申请READ_LOGS权限就可以读取其他应用的log了。但是谷歌发现这样存在安全风险,于是android 4.1以及之后版本,即使申请了READ_LOGS权限也无法读取其他应用的日志信息了。4.1版本中 Logcat的签名变为“signature|system|development”了,这意味着只有系统签名的app或者root权限的app才能使用该权限。普通用户可以通过ADB查看所有日志。

通过 adb shell logcat可以查看所有logcat信息

有些人认为任何log都不应该在发行版本打印。但是为了app的错误采集,异常反馈,必要的日志还是要被输出的,只要遵循安全编码规范就可以将风险控制在最小范围。

建议:
Log.e()/w()/i():建议打印操作日志

Log.d()/v():建议打印开发日志

1、敏感信息不应用Log.e()/w()/i(), System.out/err 打印。

2、如果需要打印一些敏感信息建议使用 Log.d()/v()。(前提:release版本将被自动去除)

3、Log.d()/v()的返回值不应被使用。(仅做开发调试观测)

参考:http://www.droidsec.cn/android-logcat-security/

4.反编译查看myapk.apk是否安全

1.使用APKTOOL反编译AndroidManifest.xml文件

2.检查AndroidManifest.xml文件是否有如下内容:android:debuggable="true"

如果你在其中发现了这样的内容,该应用是可以被调试的。很显示我们的xxxxx_sample是可被调试的。

调试方法参见:http://bobao.360.cn/learning/detail/140.html

3.反编译查看配置文件AndroidManifest.xml中activity组件(关注配置了intent-filter的及未设置export=“false”的)

通过分析AndroidManifest.xml,我们获得了以下信息:

包名:com.xxx.sample
入口”com.xxxx.sample.MainActivity

其它组件的export同Activity

三、参考资料

1.《Android 安全测试初探》合集:http://testerhome.com/topics/1698

2.Android Hacking and Security

英文原文: http://resources.infosecinstitute.com/android-hacking-security-part-1-exploiting-securing-application-components/

中文:http://bobao.360.cn/learning/detail/122.html

3.Android安全中文网站: http://www.droidsec.cn

【转载】Android app 安全测试调研及执行的更多相关文章

  1. Android APP压力测试(二)之Monkey信息自动收集脚本

      Android APP压力测试(二) 之Monkey信息自动收集脚本 前言: 上一篇Monkey介绍基本搬抄官方介绍,主要是为了自己查阅方便.本文重点介绍我在进行Monkey时如何自动收集相关信息 ...

  2. Android APP压力测试(三)之Monkey日志自动分析脚本

    Android APP压力测试(三) 之Monkey日志自动分析脚本 前言 上次说要分享Monkey日志的分析脚本,这次贴出来分享一下,废话不多说,请看正文. [目录] 1.Monkey日志分析脚本 ...

  3. Android APP压力测试(一)之Monkey工具介绍

    Android APP压力测试(一) 之Monkey工具介绍 前言 本文主要介绍Monkey工具.Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕.滑动. ...

  4. Android App 压力测试 monkeyrunner

    Android App 压力测试 第一部分 背景 1. 为什么要开展压力测试? 2. 什么时候开展压力测试?第二部分 理论 1. 手工测试场景 2. 自动测试创建 3. Monkey工具 4. ADB ...

  5. Monkey Android app稳定性测试工具之Monkey使用教程

    Monkey Android app稳定性测试工具之Monkey使用教程 by:授客 QQ:1033553122 由于篇幅问题,仅提供百度网盘下载链接: Android app稳定性测试工具之Monk ...

  6. 深圳尚学堂:Android APP的测试流程

    每一个新开发的软件都避免不了测试,我在这里总结了一些Android系统的移动端APP测试的一些测试流程,希望可以给大家一些帮助. 1. UI 测试App主要核ui与实际设计的效果图是否一致:交互方面的 ...

  7. Android App渗透测试工具drozer,Qark,Androguard

    一. drozer简介 drozer(以前称为Mercury)是一款Android安全测试框架. drozer允许您通过承担应用程序的角色并与Dalvik VM,其他应用程序的IPC端点和底层操作系统 ...

  8. Android App常规测试内容

    转自:https://mp.weixin.qq.com/s?__biz=MzU0NjcyNDg3Mw==&mid=2247484053&idx=1&sn=116fe8c7eed ...

  9. Android App渗透测试工具汇总

    网上搜集了一些App安全学习教程及工具,项目地址:https://github.com/Brucetg/App_Security 一. drozer简介 drozer(以前称为Mercury)是一款A ...

随机推荐

  1. C++实现树的基本操作,界面友好,操作方便,运行流畅,运用模板

    Ⅰ.说明: .采用左孩子右兄弟的方式,转化为二叉树来实现. .树的后根遍历与二叉树的中根遍历即有联系又有区别,请读者注意分析体会. Ⅱ.功能: .创建树并写入数据 .先根遍历树 .计算树高 .后根遍历 ...

  2. 判断线段相交(hdu1558 Segment set 线段相交+并查集)

    先说一下题目大意:给定一些线段,这些线段顺序编号,这时候如果两条线段相交,则把他们加入到一个集合中,问给定一个线段序号,求在此集合中有多少条线段. 这个题的难度在于怎么判断线段相交,判断玩相交之后就是 ...

  3. VS2008快捷键_大全

    Ctrl+B,C: 清除全部标签 Ctrl+I: 渐进式搜索 Ctrl+Shift+I: 反向渐进式搜索 Ctrl+F: 查找 Ctrl+Shift+F: 在文件中查找 F3: 查找下一个 Shift ...

  4. javascript中数组方法小计

    一:数组的常用方法: 1:join(); 将数组转为字符串显示.不输入参数,默认以逗号连接:输入参数,则以参数连接. var arr=[1,2,3]; console.log(arr.join()); ...

  5. SuperSocket基础一

    SuperSocket基础(一)——————基本概念 项目中之前一直使用TCP socket服务框架,但是不利于扩展.最近刚接触到开源的superSocket感觉很不错,特记录一下.官方开源地址:ht ...

  6. Scrapy抓取Quotes to Scrape

    # 爬虫主程序quotes.py # -*- coding: utf-8 -*- import scrapy from quotetutorial.items import QuoteItem # 启 ...

  7. PAT1079 :Total Sales of Supply Chain

    1079. Total Sales of Supply Chain (25) 时间限制 250 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHE ...

  8. select、poll、epoll之间的区别(搜狗面试)

    (1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对 ...

  9. thinkphp5中__PUBLIC__的使用

    在使用thinkphp5.1开发的时候遇到设置__PUBLIC__无法生效的问题.这次的版本升级有比较大的改动,很多写法已经被更改,下面说下怎么去解决这个问题. 工具/原料   phpstorm ln ...

  10. [AWS] Serverless

    先来个热身 一整套方案,构建移动消息收发应用程序 (iOS) 要实现的目标: 使用 AWS Mobile Hub 为聊天应用程序配置移动云计算后端基础设施. 使用 Amazon Cognito 配置适 ...