1. 问题说明

Android 中的每个程序都是由基本组件如 Activity、Service、content Provider 和 Broadcast Receiver 等所组成,而作为实现应用程序的主体的 Activity 承担着大量的显示和交互工作,甚至我们可以理解为一个「界面」就是一个 Activity。既然 Activity 这么重要,如果 Activity 组件存在问题那么就可能会被系统或者第三方的应用程序直接调出并使用。而组件导出可能导致登录界面被绕过、信息泄露、数据库 SQL 注入、DOS、恶意调用等风险。

2. 测试步骤

检查 AndroidManifest.xml 文件中注册的 Activity(MobSF),查看 exported 属性是否被设置为 true,若是则根据业务判断风险。这里我们需要使用到 Drozer 工具,该工具的详细使用我们会在后面另写文章进行讲解。

相关 drozer 命令如下:(com.packagename 一般在文件管理器 /0/Android/data/ 下,整个文件夹就是 packagename,就是 com.xxxxx.xxxx)

Activity - 图1

  1. dz> run app.activity.info -a com.packagename
  2. # 将 APP 的 activity 控件全部导出如下图

Activity - 图2

  1. dz> run app.activity.start --component com.packagename com.example.package.welcome
  2. # 后面的参数一个是 APP 的 packagename,一个是上图列出的具体内容,调用每一个组件,检查组件是否存在问题

比如我在项目中就遇到过调用信用卡的组件,发现 APP 直接打开并绕过登录进入信用卡信息验证界面,这就有可能被第三方利用获取到用户的银行卡信息和手机。

Activity - 图3

3. 修复建议

  1. APP 内使用的私有 Activity 不应配置 intent-filter,如果配置了 intent-filter 需设置 exported 属性为 false;
  2. 使用默认 taskAffinity;
  3. 使用默认 launchMode;
  4. 启动 Activity 时不设置 intent的FLAG_ACTIVITY_NEW_TASK 标签;
  5. 谨慎处理接收的 intent 以及其携带的信息;
  6. 签名验证内部 (in-house)app;
  7. 当 Activity 返回数据时候需注意目标 Activity 是否有泄露信息的风险;
  8. 目的 Activity 十分明确时使用显示启动;
  9. 谨慎处理 Activity 返回的数据,目的 Activity 返回的数据有可能是恶意应用伪造的;
  10. 验证目标 Activity 是否恶意 APP,以免受到 intent 欺骗,可用 hash 签名验证;
  11. 提供二手资产时,资产应受到同等保护;
  12. 尽可能的不发送敏感信息,应考虑到启动 public Activity 中 intent 的信息均有可能被恶意应用窃取的风险。