OWASP 类别: MASVS-NETWORK:网络通信
概述
在 Android 应用中允许明文网络通信意味着任何监控网络流量的人都可以查看和操纵正在传输的数据。如果传输的数据包含敏感信息(例如密码、信用卡号码或其他个人信息),则这是一个漏洞。
无论您是否发送敏感信息,使用明文仍然可能是一个漏洞,因为明文流量也可以通过网络攻击(例如 ARP 或 DNS 欺骗)进行操纵,从而可能使攻击者能够影响应用的行为。
影响
当 Android 应用通过网络以明文方式发送或接收数据时,任何监控网络的人都可以拦截和读取该数据。如果此数据包含敏感信息(例如密码、信用卡号码或个人消息),则可能导致身份盗窃、金融欺诈和其他严重问题。
例如,以明文形式传输密码的应用可能会将这些凭据暴露给拦截流量的恶意行为者。然后,这些数据可用于未经授权访问用户的帐户。
风险:未加密的通信通道
通过未加密的通信通道传输数据会使设备和应用端点之间共享的数据暴露出来。攻击者可以拦截并可能修改所述数据。
缓解措施
数据应通过加密的通信通道发送。应使用安全协议来替代不提供加密功能的协议。
具体风险
本节收集需要非标准缓解策略或在特定 SDK 级别已得到缓解的风险,此处仅供完整性考虑。
风险:HTTP
本节指南仅适用于面向 Android 8.1(API 级别 27)或更低版本的应用。从 Android 9(API 级别 28)开始,URLConnection、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>
此选项有助于防止应用因外部来源(例如后端服务器)提供的 URL 更改而意外发生回归。
风险: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
- 基于 TLS 的 HTTP RFC
- HTTP 身份验证方案
- Mozilla 网络安全建议
- Mozilla SSL 推荐配置生成器
- Mozilla 服务器端 TLS 建议
- OpenSSH 主要手册页
- SSH RFC,详细介绍了可用于此协议的配置和方案
- Mozilla OpenSSH 安全建议
- Android 密钥库系统