不安全的 API 使用

OWASP 类别: MASVS-PLATFORM: Platform Interaction

概览

许多移动应用使用外部 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 Tokens (JWT) 和 JSON Web Signature (JWS),或者提供完全认证的服务,如前所述。这提供了一种将易受攻击的静态密钥存储在服务器端而不是应用(客户端)中的方法。

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

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

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

资源