OWASP 类别: MASVS-CODE: 代码质量
概述
发布包含测试或调试功能的生产版本可能会对应用程序的安全态势产生负面影响。这些功能用于帮助开发人员在新的版本发布之前或之后发现和识别预期应用程序用例中的错误,并且不应公开访问。
测试/调试功能的示例包括
- 隐藏菜单
- 启用调试日志的选项
- 更改应用程序流程的选项
- 绕过支付或订阅流程的选项
- 绕过身份验证的选项
- 针对特定于应用程序的活动的测试
以上所有内容都可能被恶意用户利用,以更改应用程序的预期流程或检索系统信息以定制进一步的攻击。
暴露测试或调试功能所带来的风险可能会因与调试功能本身相关联的操作而异。
应用程序的另一个风险领域是在 AndroidManifest.xml 元素 <application>
中设置的属性 android:debuggable。正如在 android:debuggable 文章中所述,部署具有上述设置值的生产应用程序,允许恶意用户访问原本不可访问的管理资源。
影响
与生产版本中的测试或调试功能交互的恶意用户可能会导致意外结果。任何操作的影响都与分配给该功能的权限直接相关。权限越高,主动利用可能产生的影响就越大。应用程序中的此类功能可用于绕过多种保护措施,绕过付费墙,检索系统或用户相关信息,或触发测试活动。
缓解措施
避免使用调试组件
测试或调试功能绝不应在生产应用程序组件(例如活动、广播接收器、服务或内容提供者)中实现,因为如果导出,任何其他设备上的进程都可以运行这些组件。将调试组件设置为不可导出(android:exported="false")并不能构成对功能的有效保护,因为任何已植根的设备仍然可以通过 Android Debug Bridge (ADB) 工具执行它,如果启用了调试选项。
将调试或测试功能限制为暂存版本
应用程序中任何测试或调试功能的执行应仅限于一组受限的预发布版本,以允许仅开发人员在受控环境中调试或测试应用程序的功能。这可以通过创建应用程序的专用测试或调试版本以及为其提供高级的工具化测试来实现,以确保任何测试或调试功能都在隔离版本上运行。
实现自动化 UI 测试
在应用程序上运行测试时,请选择自动化 UI 测试,因为它们可重复,可以在独立的环境中执行,并且不易出现人为错误。
资源
- 高级测试设置的开发人员指南
- 自动化 UI 测试的开发人员指南
- android:debuggable
- android:exported
- Android 市场中的可调试应用程序
- 调试代码会导致安全漏洞吗?