MASWE-0005: 应用程序包中硬编码的API密钥
概述¶
硬编码在应用程序包、源代码或编译后的二进制文件中的API密钥可以很容易地通过逆向工程提取出来。
影响¶
在应用程序中硬编码API密钥可能导致各种安全问题,包括但不限于:
- 经济损失:攻击者可以利用被泄露的硬编码API密钥进行未经授权的API调用,并滥用按使用量计费的服务(例如,AI或ML API服务),从而给应用程序所有者带来意想不到的费用。
- 系统完整性和业务运营受损:提取出的API密钥可能使攻击者未经授权访问敏感资源和服务。这直接影响开发者和企业,损害应用程序的完整性、隐私和服务的连续性——可能导致服务中断,例如拒绝服务 (DoS) 或因违反策略而暂停服务。此类事件会严重影响用户体验,侵蚀用户信任,并对业务声誉和运营产生负面影响。
- 绕过保护机制:硬编码的API密钥可以使绕过应用程序保护机制变得更容易。攻击者可以利用这一点访问受限内容、在应用程序功能中作弊,或解锁旨在付费购买的功能,从而影响收入和用户体验。
引入方式¶
API密钥可以在以下几个区域中被硬编码:
- 应用程序源代码:直接嵌入在应用程序源代码中。
- 应用程序资产:包含在最终交付的应用程序包(通常是APK/IPA)文件中,例如配置文件、清单文件和资源文件。
- 库:第三方、第一方库或任何其他应用程序依赖项的配置文件或源代码。
缓解措施¶
- 使用提供安全身份验证、客户端验证和会话控制的有状态API服务。实施在合理短时间内(例如1小时)过期的动态令牌。这有助于减少密钥暴露的影响。此外,确保正确的错误处理和日志记录,以检测并响应未经授权的访问尝试。考虑使用OAuth 2.0和AppAuth等安全库来简化安全的OAuth流程。
- 如果无法使用有状态API服务,请考虑使用无状态API服务和中间件解决方案(有时称为API代理或API网关)。这涉及在应用程序和API端点之间代理请求。使用JSON Web Tokens (JWT) 和 JSON Web Signature (JWS) 将易受攻击的静态密钥存储在服务器端,而不是应用程序(客户端)中。实施安全的密钥管理实践,并考虑使用云密钥管理服务。
- 如果API密钥必须硬编码,请务必将其配置为具有最低所需权限,以减少暴露时的影响。许多服务允许您创建具有受限访问权限的密钥,这限制了可执行的操作。
- 考虑使用密钥管理服务,在验证应用程序完整性后,在运行时获取API密钥。
- 定期审计代码库和依赖项中是否存在硬编码的敏感数据(例如,使用gitLeaks等工具)。
- 使用白盒密码学技术对应用程序中的API密钥和敏感数据进行加密,确保即使应用程序被逆向工程,加密算法和密钥也能得到保护。
- 尽管并非万无一失,并且在没有其他安全选项可用时应作为最后手段,但代码和资源混淆及加密可以通过增加分析应用程序和发现硬编码秘密的难度来阻止攻击者。避免自定义实现,并使用成熟的解决方案,例如RASP (Runtime Application Self-Protection),它可以确保API密钥仅在必要时才在内存中完全组装,否则将其混淆或分散在不同的组件中。RASP还可以通过与安全密钥管理解决方案集成,在运行时安全地动态检索和管理密钥。