不安全的 API 使用

OWASP 类别: MASVS-PLATFORM:平台交互

概述

许多移动应用使用外部 API 提供功能。传统上,使用静态令牌或密钥对连接到服务的应用进行身份验证。

但是,在客户端-服务器设置(或移动应用和 API)的上下文中,使用静态密钥通常不被认为是访问敏感数据或服务的安全身份验证方法。与内部基础设施不同,如果任何人可以访问此密钥,则任何人均可访问外部 API 并滥用服务。

例如,静态密钥有可能从应用中反向工程或在移动应用与外部 API 通信时被拦截。静态密钥也更有可能在应用中硬编码。

当没有使用足够安全的身份验证和访问控制时,API 数据和服务就会面临风险。

使用静态密钥时,攻击者可以重放请求或使用(拦截或反向工程的)密钥构建新的请求,而无需任何时间限制,从而利用 API。

影响

如果开发人员正在为 AI 或 ML API 服务付费,则攻击者可以相对轻松地窃取此密钥,并在其服务上产生债务,或使用它创建虚假内容。

存储在 API 上的任何用户数据、文件或 PII 都将公开可用,从而导致有害的泄露。

攻击者还可以利用此访问权限进行欺诈、重定向服务,并在极少数情况下完全控制服务器。

缓解措施

有状态 API

如果应用提供用户登录或能够跟踪用户会话,我们建议开发人员使用像 Google Cloud 这样的 API 服务,以便与其应用进行有状态集成。

此外,请使用 API 服务提供的安全身份验证、客户端验证和会话控制,并考虑使用动态令牌作为静态密钥的替代方案。确保令牌在合理的时间内过期(1 小时很常见)。

然后应使用动态令牌进行身份验证以提供对 API 的访问权限。这些指南 显示了如何使用 OAuth 2.0 实现此目的。除了这些指南之外,还可以进一步加强 OAuth 2.0,以通过实施以下功能来减少 Android 应用中的漏洞。

实施适当的错误处理和日志记录

  • 以优雅的方式处理 OAuth 错误,并将其可见地记录下来以进行调试。
    • 减少的攻击面也有助于您识别和解决可能出现的任何问题。

    • 确保记录或向用户展示的任何消息都清晰明了,但不要包含对攻击者有用的信息

安全配置应用程序中的 OAuth

  • redirect_uri参数发送到授权和令牌端点。
  • 如果您的应用使用与第三方服务的 OAuth,请配置跨源资源共享(CORS)以限制对您的应用资源的访问。
    • 这将有助于防止未经授权的跨站点脚本(XSS)攻击。
  • 使用 state 参数防止CSRF攻击。

使用安全库

  • 考虑使用安全库,例如AppAuth,以简化安全 OAuth 流程的实现。
    • 这些 Android 库可以帮助自动化前面提到的许多安全最佳实践。

其他身份验证方法(包括 Firebase 和 Google ID 令牌)在OpenAPI 文档中进行了描述。

无状态 API

如果 API 服务不提供前面推荐的任何保护措施,并且需要在没有用户登录的情况下进行无状态会话,开发人员可能需要提供自己的中间件解决方案。

这将涉及在应用和 API 端点之间“代理”请求。一种方法是使用JSON Web 令牌(JWT)和JSON Web 签名(JWS),或提供前面推荐的完全认证的服务。这提供了一种在服务器端而不是在应用程序(客户端)中存储易受攻击的静态密钥的方法。

在移动应用程序中提供端到端无状态解决方案存在固有问题。一些最关键的挑战是客户端(应用程序)的验证以及在设备上安全地存储私钥或密钥。

Play Integrity API提供应用程序和请求完整性的验证。这可以缓解一些可能滥用此访问权限的情况。至于密钥管理,在许多情况下,密钥库是安全存储私钥的最佳位置。

一些移动应用程序使用注册阶段来检查应用程序的完整性并使用安全交换提供密钥。这些方法很复杂,超出了本文档的范围。但是,云密钥管理服务是一种潜在的解决方案。

资源