OWASP 类别:MASVS-NETWORK:网络通信
概览
在 Android 应用中允许明文网络通信,意味着监控网络流量的任何人都可以查看和操纵正在传输的数据。如果传输的数据包含敏感信息(例如密码、信用卡号或其他个人信息),这就会成为一个漏洞。
无论您是否发送敏感信息,使用明文都可能存在漏洞,因为明文流量还可以通过 ARP 或 DNS 中毒等网络攻击进行操纵,从而可能使攻击者能够影响应用的行为。
影响
当 Android 应用通过网络发送或接收明文数据时,监控网络的任何人都可以拦截并读取这些数据。如果这些数据包含敏感信息(例如密码、信用卡号或个人消息),可能会导致身份窃取、金融欺诈和其他严重问题。
例如,应用如果以明文形式传输密码,可能会将这些凭据泄露给拦截流量的恶意操作者。然后,他们可能会利用这些数据,在未经授权的情况下获得用户账号的访问权限。
风险:未加密的通信渠道
通过未加密的通信通道传输数据会泄露设备和应用端点之间共享的数据。上述数据可能会被攻击者拦截并可能被修改。
缓解措施
数据应通过加密的通信通道发送。安全协议应作为不提供加密功能的协议的替代方案。
具体风险
本部分将汇总符合以下条件的风险:需要采用非标准的缓解策略,或原本已在特定 SDK 级别得到缓解,而为了提供完整信息才列在此处。
风险信号:HTTP
此部分中的指南仅适用于以 Android 8.1(API 级别 27)或更低版本为目标平台的应用。从 Android 9(API 级别 28)开始,网址Connection、Cronet 和 OkHttp 等 HTTP 客户端会强制使用 HTTPS,因此系统默认情况下已停用明文支持。不过,请注意,其他 HTTP 客户端库(例如 Ktor)不太可能对明文强制执行这些限制,因此应谨慎使用。
缓解措施
使用 NetworkSecurityConfig.xml 功能来选择停用明文流量并为应用强制使用 HTTPS,仅为所需的特定网域保留例外情况(通常出于调试目的):
Xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="false">
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">debug.domain.com</domain>
</domain-config>
</network-security-config>
此选项有助于防止应用因外部源(如后端服务器)提供的网址发生变化而意外回归。
风险:FTP
使用 FTP 协议在设备之间交换文件会带来多种风险,其中最严重的是通信通道缺少加密。应改用更安全的替代方案,例如 SFTP 或 HTTPS。
缓解措施
在应用中通过互联网实现数据交换机制时,您应使用 HTTPS 等安全协议。Android 提供了一组 API,可让开发者创建客户端-服务器逻辑。您可以使用传输层安全协议 (TLS) 来实现安全保护,确保两个端点之间的数据交换经过加密,从而防止恶意用户窃听通信内容和检索敏感数据。
通常,客户端-服务器架构依赖于开发者拥有的 API。如果您的应用依赖于一组 API 端点,请遵循以下安全最佳实践来保护 HTTPS 通信,从而确保深度安全:
- 身份验证 - 用户应使用 OAuth 2.0 等安全机制进行身份验证。通常不建议使用基本身份验证,因为它不提供会话管理机制,并且如果凭据存储不当,可以从 Base64 解码。
- 授权 - 应根据最小权限原则限制用户仅访问预期资源。为应用的资源采用谨慎的访问权限控制解决方案即可实现这一点。
- 请遵循安全最佳实践,确保使用经过深思熟虑且最新的加密套件。例如,考虑支持 TLSv1.3 协议,并在必要时为 HTTPS 通信提供向后兼容性。
风险:自定义通信协议
实现自定义通信协议或尝试手动实现众所周知的协议可能会很危险。
虽然自定义协议允许开发者量身定制适应预期需求的独特解决方案,但开发过程中的任何错误都可能会导致安全漏洞。例如,在开发会话处理机制时出现错误,可能会导致攻击者能够窃听通信内容,并动态检索敏感信息。
另一方面,如果不使用操作系统或维护良好的第三方库来实现 HTTPS 等众所周知的协议,则会增加引入编码错误的可能性,这可能会导致在需要时难以(如果不是完全不可能的话)更新您实现的协议。此外,这可能会引入与使用自定义协议相同类型的安全漏洞。
缓解措施
使用受维护的库实现众所周知的通信协议
如需在应用中实现 HTTPS 等众所周知的协议,应使用操作系统库或受维护的第三方库。
这样一来,开发者就可以放心地选择经过全面测试、经过一段时间改进且持续接收安全更新以修复常见漏洞的解决方案。
此外,通过选择众所周知的协议,开发者可以获享跨各种系统、平台和 IDE 的广泛兼容性,从而降低开发过程中出现人为错误的可能性。
使用 SFTP
此协议会对传输中的数据进行加密。使用此类文件交换协议时,应考虑采取其他措施:
- SFTP 支持不同类型的身份验证。应使用公钥身份验证方法,而不是基于密码的身份验证方法。此类密钥应以安全的方式创建和存储,建议使用 Android 密钥库来实现此目的。
- 确保支持的密码遵循安全最佳实践。
资源
- Ktor
- 使用 Cronet 执行网络操作
- OkHttp
- 为网络安全配置选择停用明文流量
- 连接到网络
- 通过网络协议确保安全
- 适用于移动应用和桌面应用的 OAuth 2.0
- HTTP Over TLS RFC
- HTTP 身份验证方案
- Mozilla 网站安全建议
- Mozilla SSL 推荐的配置生成器
- Mozilla 服务器端 TLS 建议
- OpenSSH 主要手册页面
- SSH RFC,详细介绍了可用于此协议的配置和架构
- Mozilla OpenSSH 安全建议
- Android 密钥库系统