【转载】Android app 安全测试调研及执行
本文来源于: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
总结:
经比较感觉腾讯金刚审计系统和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://bobao.360.cn/learning/detail/122.html
3.Android安全中文网站: http://www.droidsec.cn