设想 :
假设您有一个在服务器上使用某些 API 的 Android 应用程序。
该应用程序没有登录功能(不需要它,因为用户在服务器上没有任何个人数据)
为了向服务器发送请求,您需要在服务器上创建 OAuth2 功能。您向服务器发出请求,它返回一个身份验证令牌。
但是,如果用户监视网络请求,则可以轻松接受此请求。因此,您创建了一个与 Auth 请求的 POST 正文一起发送的密钥。
问题从这里开始:
您创建的这个密钥必须保留在应用程序中,应用程序中的任何代码都可以分解(反编译)并且可以访问该密钥。
密钥不能在服务器上,否则需要一个请求来获取它,从而可以对其进行监控。
您不能以任何方式对其进行编码,因为解码功能必须在 Android 端,因此可以反编译。
问题:
有没有办法至少使密钥更难解码?
PS:使用 R8 或 Proguard 只会模糊代码。如果黑客或攻击者尝试,他们可以很容易地看到应用程序的整个代码,并可以跟随以了解编码或解码的流程,或找到代码中的关键。
为了向服务器发送请求,您需要在服务器上创建 OAuth2 功能。您向服务器发出请求,它返回一个身份验证令牌。
在这里,你是暴露自己信托在首次使用(豆腐)的应用程序,这意味着API服务器必须接受该请求从来自确实什么你信任的是你真正的和未被篡改的移动应用程序。
但是,如果用户监视网络请求,则可以轻松接受此请求。因此,您创建了一个与 Auth 请求的 POST 正文一起发送的密钥。
这是一样容易做的中间人(MITM)人攻击有类似的工具mitmproxy或者Wireshark的,而这一切都需要对攻击者了解如何执行请求,就好像他是什么你觉得为你的真正的移动应用程序,因此无需在他的中间人攻击的 Auth 请求的 POST 正文中窃取密钥。
豆腐:
首次使用信任(TOFU)或首次使用信任(TUFU)是客户端软件使用的一种安全模型,需要与未知或尚未信任的端点建立信任关系。
中间人:
用于渗透测试人员和软件开发人员的交互式 TLS 拦截 HTTP 代理。
Wireshark 是一个网络流量分析器或“嗅探器”,适用于 Linux、macOS、*BSD 和其他 Unix 和类 Unix 操作系统以及 Windows。
您创建的这个密钥必须保留在应用程序中,应用程序中的任何代码都可以分解(反编译)并且可以访问该密钥。
是的,这确实是一个大问题,即使你在本机 C 代码中隐藏了秘密,就像我在这个 repo 中展示的那样,你仍然可以使用工具对你的移动应用程序的二进制文件进行静态分析,比如MobSF,来提取任何秘密或找到处理它们的逻辑。
您不能以任何方式对其进行编码,因为解码功能必须在 Android 端,因此可以反编译。
再一次你是对的,所需要的只是使用已经提到的 MobSF,或者通过在运行时将检测框架挂钩到代码来更高级,这将允许动态提取密钥,和/或修改任何行为你的代码。这种工具的一个很好的例子是Frida
暴徒SF:
移动安全框架 (MobSF) 是一种自动化的一体化移动应用程序 (Android/iOS/Windows) 渗透测试、恶意软件分析和安全评估框架,能够执行静态和动态分析。
弗里达:
将您自己的脚本注入黑盒进程。挂钩任何函数,监视加密 API 或跟踪私有应用程序代码,无需源代码。编辑,点击保存,并立即查看结果。无需编译步骤或程序重新启动。
有没有办法至少使密钥更难解码?
正如我已经提到的,Frida 可用于在运行时修改代码的行为,因此攻击者会发现执行此操作的代码并钩住它的返回以提取已解码的密钥。
比强化秘密更好的是在移动应用程序代码中根本没有秘密,无论是静态的还是由移动应用程序本身在运行时动态生成的。要实现这一点,您需要研究移动应用证明的概念。
移动应用认证的作用
这将是一个解决方案,让您的API服务器知道什么发出请求确实是你已经上传到谷歌Play商店,而不是一个自动化的脚本,邮递员请求,或假冒任何其它形式的真正移动应用程序。它将包含一个运行在云上的证明层,它将挑战移动应用程序,并根据返回的度量,它会为移动应用程序颁发短期 JWT 令牌,以便在每个请求中传递给 API 服务器,这将验证它们有效的签名和过期时间。我更详细地介绍了我文章的这一部分:
在我们深入研究移动应用证明服务的角色之前,我们首先需要了解访问 API 服务器的内容和人员之间的区别。这在本文中有更详细的讨论,我们可以阅读:
向 API 服务器发出请求的内容是什么。它真的是您的移动应用程序的真实实例,还是机器人、自动化脚本或攻击者使用 Postman 之类的工具手动浏览您的 API 服务器?
在谁是移动应用,我们可以验证,授权和以多种方式确定,比如使用OpenID登录连接或流的oauth2的用户。
移动应用程序认证服务的作用是进行身份验证什么是发送请求,因此只响应来自真正的移动应用程序实例来请求,并拒绝未经授权来源的所有其他请求。
为了知道什么是发送请求到API服务器,移动应用程序认证服务,在运行时,将鉴定出具有高可信度,你的移动应用程序存在,没有被篡改/重新包装,是不是在一个根植运行设备,尚未被检测框架(Frida、xPosed、Cydia 等)连接,并且不是中间人攻击 (MitM) 的对象。这是通过在后台运行 SDK 来实现的,该 SDK 将与在云中运行的服务进行通信,以证明其运行的移动应用程序和设备的完整性。
成功证明移动应用程序的完整性后,将发布一个短时间存在的 JWT 令牌,并使用只有 API 服务器和云中的移动应用程序证明服务知道的秘密进行签名。在证明失败的情况下,JWT 令牌使用不正确的秘密进行签名。由于移动应用证明服务使用的秘密不被移动应用知道,因此即使应用被篡改、在有根设备中运行或通过连接进行通信,也无法在运行时对其进行逆向工程这就是中间人攻击的目标。
移动应用程序必须在每个 API 请求的标头中发送 JWT 令牌。这允许 API 服务器仅在可以验证 JWT 令牌是否已使用共享密钥签名且未过期时才提供请求。所有其他请求将被拒绝。换句话说有效的JWT令牌告诉API服务器是什么发出请求是上传到谷歌或苹果专卖店的正品移动应用程序,而无效或缺失的JWT令牌意味着什么发出请求没有被授权这样做,因为它可能是机器人、重新打包的应用程序或进行中间人攻击的攻击者。
使用移动应用证明服务的一大好处是其主动和积极的身份验证模型,它不会产生误报,因此不会阻止合法用户,同时阻止坏人。
保护 API 服务器和移动应用程序免受攻击是一项非常艰巨的工作,您已经知道了,从您的问题内容来看,我试图通过提供更多上下文和工具来让阅读此答案的任何人更加明确就这样。
归根结底,一切都与深度安全有关,您应该应用尽可能多的防御层,这是法律对您的用例的要求,并且您判断所尝试的数据的价值是足够的保护。
在我回答的任何安全问题中,我总是喜欢通过推荐 OWASP 的优秀作品来结束,特别是这个:
移动安全测试指南 (MSTG) 是移动应用安全开发、测试和逆向工程的综合手册。
| 归档时间: |
|
| 查看次数: |
1263 次 |
| 最近记录: |