OWASP 类别: MASVS-CODE:代码质量
概览
发布包含测试或调试功能的生产版本可能会对应用的安全状况产生负面影响。这些功能旨在帮助开发者在新版本发布之前或之后发现并识别应用预期用例中的错误,不应公开访问。
测试/调试功能的示例包括
- 隐藏菜单
- 启用调试日志的选项
- 更改应用流程的选项
- 规避支付或订阅流程的选项
- 规避身份验证的选项
- 针对应用专属 activity 的测试
恶意用户可以利用上述所有功能来更改应用的预期流程或检索系统信息以制定进一步的攻击方案。
暴露测试或调试功能引入的风险可能会因与调试功能本身相关的操作而异。
应用的另一个风险领域是 AndroidManifest.xml 元素 <application>
中设置的 android:debuggable 属性。正如 android:debuggable 文章中所述,如果部署的生产应用设置了上述值,恶意用户将能够访问原本无法访问的管理资源。
影响
恶意用户在生产版本中与测试或调试功能交互可能会导致意外结果。任何操作的影响都直接与该功能被分配的权限相关。权限越高,主动利用可能带来的影响就越大。应用中的此类功能可用于规避多项保护措施、绕过付费墙、检索系统或用户相关信息,或触发测试活动。
缓解措施
避免使用调试组件
测试或调试功能不应在 Activity、广播接收器、Service 或 Content Provider 等生产应用组件中实现,因为如果这些组件被导出,则可由设备上的任何其他进程运行。将调试组件设置为不导出 (android:exported="false") 并不能为功能提供有效保护,因为任何已获得 root 权限的设备只要启用调试选项,仍然可以通过 Android 调试桥 (ADB) 工具执行它。
将调试或测试功能限制在过渡版本中
应用中任何测试或调试功能的执行应仅限于有限的过渡版本集,以便只有开发者才能在受控环境中调试或测试应用功能。实现此目的的方法是创建应用的专用测试或调试版本,并对其进行高级仪器化测试,以确保任何测试或调试功能都在独立版本上运行。
实现自动化 UI 测试
对应用运行测试时,最好选择自动化 UI 测试,因为它们可重复,可在独立环境中执行,且不易出错。
资源
- 关于高级测试设置的开发者指南
- 关于自动化 UI 测试的开发者指南
- android:debuggable
- android:exported
- Android Market 中的可调试应用
- 调试代码会导致安全漏洞吗?