明文通信

OWASP 类别: MASVS-NETWORK:网络通信

概览

允许 Android 应用中的明文网络通信意味着任何监控网络流量的人都可以查看和操纵正在传输的数据。如果传输的数据包含密码、信用卡号或其他个人信息等敏感信息,这就会成为一个漏洞。

无论您是否正在发送敏感信息,使用明文仍然可能是一个漏洞,因为明文流量也可能通过 ARP 或 DNS 投毒等网络攻击被操纵,从而可能使攻击者影响应用的行为。

影响

当 Android 应用通过网络发送或接收明文数据时,任何监控网络的人都可以拦截并读取这些数据。如果这些数据包含密码、信用卡号或个人消息等敏感信息,则可能导致身份盗窃、金融欺诈和其他严重问题。

例如,以明文形式传输密码的应用可能会将这些凭据暴露给拦截流量的恶意攻击者。然后,这些数据可能会被用于未经授权地访问用户的账户。

风险:未加密的通信通道

通过未加密的通信通道传输数据会暴露设备和应用端点之间共享的数据。这些数据可能被攻击者拦截并潜在地修改。

缓解措施

数据应通过加密的通信通道发送。应使用安全协议来替代不提供加密功能的协议。

具体风险

本部分收集了需要非标准缓解策略或在特定 SDK 级别已缓解的风险,并在此处列出以供参考。

风险:HTTP

本部分中的指导仅适用于以 Android 8.1(API 级别 27)或更早版本为目标的应用。从 Android 9(API 级别 28)开始,URLConnection、CronetOkHttp 等 HTTP 客户端强制使用 HTTPS,因此默认禁用明文支持。但是,请注意,Ktor 等其他 HTTP 客户端库不太可能对明文强制实施这些限制,因此应谨慎使用。

缓解措施

使用 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 解码。
  • 授权 – 用户应遵循最小权限原则,仅限于访问预期的资源。这可以通过对应用资产采用谨慎的访问控制解决方案来实现。
  • 遵循安全最佳实践,确保使用经过深思熟虑且最新的密码套件。例如,对于 HTTPS 通信,如果需要向后兼容性,请考虑支持 TLSv1.3 协议

风险:自定义通信协议

实现自定义通信协议,或尝试手动实现众所周知的协议,可能很危险。

虽然自定义协议允许开发者根据预期需求量身定制独特的解决方案,但开发过程中的任何错误都可能导致安全漏洞。例如,开发会话处理机制的错误可能导致攻击者能够窃听通信,并实时检索敏感信息。

另一方面,在不使用操作系统或维护良好的第三方库的情况下实现 HTTPS 等众所周知协议,会增加引入编码错误的几率,这些错误可能导致在需要时难以(甚至不可能)更新您实现的协议。此外,这可能会引入与使用自定义协议相同的安全漏洞。

缓解措施

使用维护良好的库来实现众所周知的通信协议

要在您的应用中实现 HTTPS 等众所周知协议,应使用操作系统库或维护良好的第三方库。

这使得开发者可以安全地选择经过全面测试、随着时间推移得到改进并持续接收安全更新以修复常见漏洞的解决方案。

此外,通过选择众所周知协议,开发者受益于在各种系统、平台和 IDE 之间的广泛兼容性,从而减少开发过程中人为错误的发生率。

使用 SFTP

此协议对传输中的数据进行加密。使用此类文件交换协议时,应考虑采取额外的措施

  • SFTP 支持不同类型的身份验证。应使用公钥身份验证方法,而不是基于密码的身份验证。此类密钥应安全创建和存储,建议为此目的使用 Android Keystore
  • 确保支持的密码遵循安全最佳实践。

资源