Android 安全测试

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

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


↙↙↙阅读原文可查看相关链接,并与作者交流