我有一个关于设置以AWS为后端的移动应用程序的安全问题。要开始使用移动SDK,您需要一个awsconfiguration.json,其中包含AppClientId和AppClientSecret。尽管根据文件,它说最好的做法是"像管理用户名和密码一样安全地管理访问密钥。"此外,如果你查看IPA/APK文件,你可以很容易地提取这些密钥。我的问题是,这真的重要吗?安全风险是什么?我知道它们是用来签署请求的,所以有人能用这些密钥签署任意请求吗?我设置了用户池,只允许经过身份验证的用户调用lambda函数。
您的问题
要开始使用移动SDK,您需要一个awsconfiguration.json,其中包含AppClientId和AppClientSecret。
从您在移动应用程序的二进制文件中发布机密的那一刻起,您就必须将其视为属于公共域,因此不再是机密,因为它可供攻击者获取,并可能被重复使用和滥用,以便代表您的移动应用程序、请求中的what以及您的已验证用户向后端发出请求,请求中的联系人。
可以轻松攻击你的移动应用程序的开源和付费工具不胜枚举,但你可以在我的个人Github要点中看到其中一些工具的列表。
此外,如果你要查看IPA/APK文件内部,你可以很容易地提取这些密钥。我的问题是,这真的重要吗?
取决于您对可以通过后端端点交付的数据的重视程度,以及您愿意在AWS账单中支付多少钱。
你有没有说过,通过对移动应用二进制文件的静态分析很容易找到秘密,但你可以让它们更难找到,在这个简单的Android演示应用程序的Github回购中,你可以在这里看到使用本地C代码来隐藏API密钥。你可以在谷歌的官方文档中找到更多信息,在这里和这里。
安全风险是什么?我知道它们是用来签署请求的,所以有人能用这些密钥签署任意请求吗?
即使上述JNI技术可能会阻止许多技术较差的攻击者窃取您的AWS机密,您也必须记住,在运行时,攻击者可以使用像Frida这样的工具框架钩入您的代码并从中提取任何机密。因此,无论您如何隐藏它,即使是加密的,攻击者只需要找到返回或使用未加密机密的函数,就可以提取机密,并将其发送到远程控制服务器,在那里他们可以重复使用机密,代表您的移动应用程序向AWS后端签署请求,从而欺骗请求的内容,从而回答您的问题。
我设置了用户池,只允许经过身份验证的用户调用lambda函数。
此用户池将识别已验证的用户,换句话说,就是请求中的用户,但它无法识别/验证发出请求的内容。
想象一下什么,就好像请求是由您真正的移动应用程序发出的,就像您将其上传到应用商店一样,或者它是它的修改版本,由Frida或类似框架进行检测,或者是Postman或Curl的请求。
可能的解决方案
我建议您将AWS API网关与移动应用验证解决方案结合使用,以识别/验证代表您的验证用户提出请求的内容,如前所述,我将为验证用户使用AWS STS令牌:
您可以使用AWS安全令牌服务(AWS STS)创建并为受信任的用户提供临时安全凭据,以控制对您的AWS资源的访问。
再跑一英里
我总是喜欢推荐OWASP在帮助开发人员提高应用程序安全性方面所做的出色工作和努力,因此我向您推荐Github repo OWASP-移动安全测试指南:
《移动安全测试指南》(MSTG)是一本关于移动应用程序安全开发、测试和逆向工程的综合手册。
您需要通过两步来保护它
1) 你需要创建一个逻辑来编码和解码你的凭证
在iOS应用程序中存储包含的AWS凭据的最佳位置
2) 现在,SDK允许从awsconfiguration.json文件传递包含配置的JSONObject。您可以将JSONObject中的信息存储在自己的安全机制中,并在运行时通过构造函数提供。
https://github.com/aws-amplify/aws-sdk-android/issues/711
如果将IAM密钥硬编码到应用程序中(这通常是不可取的),请假设世界上任何人都可以使用这些凭据。将这些权限锁定到可以轻松地发布到reddit的程度。
真正的答案是使用AWS cognito身份为给定的角色生成STS令牌,并使该角色具有所需的权限。这允许您为每个单独的用户提供审计跟踪(某种程度上)。它允许您禁用注册或取消单个用户的权限,而不会破坏其他人的应用程序。它允许您以更可控和可扩展的方式让不同的用户拥有不同的权限。
应用程序中硬编码API密钥的问题是,如果您发现漏洞或滥用,而不可能为所有人破坏应用程序,则无法精细地吊销权限。你不能在不进行软件更新的情况下旋转API键(你的用户多久更新一次,真的吗?)。最重要的是,你根本无法跟踪请求,你只知道API密钥何时被滥用(我认为cloudtrail会给你提供呼叫IP地址,如果你可以使用的话),你所做的任何更改都会立即影响到你的所有用户。
这里有一些文档,包括示例应用程序和快速入门指南,可以帮助您使用Cognito:https://aws.amazon.com/cognito/dev-resources/