避免禁用证书固定 Android

Avoid disabling certificate pinning Android

我正在开发一个使用证书固定的 Android 应用程序(以类似的方式 this)。

但是,我遇到了可以绕过此保护措施的动态检测库,例如 Frida, or worse yet, Objection

我知道安全必须在服务器端实现,但是,我想在 API 之外继续窥探。此外,我还了解到 Java 可执行文件易于反汇编和分析。

我怎样才能使这个过程对攻击者来说更加困难,即制作基本命令,例如 objection

android sslpinning disable

失败并强化我的应用程序?我已经看到,根据资产的命名,此过程也会崩溃。

有什么想法吗?

几个硬框架可以使 Frida 和类似工具更难附加和操作应用程序进程。然而,如果有足够的时间、动力 and/or 金钱,您甚至可以打破这些框架。

然而通常这不是问题"using a hardening framework or not"而是“你愿意花多少钱来获得这个额外的保护?

据我所知,没有免费的甚至便宜的加固框架(如果我错了请纠正我并提供指向那些 free/cheap 具有良好保护的解决方案的链接),因此只是一个问题多少保护你想要,你愿意付出多少。

注意:Proguard和R8不是加固框架!他们只是稍微混淆了代码,但特别是在通过 Frida 进行证书固定和禁用时,他们不提供任何保护!

可能的解决方案

How can I make this process more difficult for an attacker

您的问题的一个可能解决方案是使用移动应用证明解决方案来保证 run-time 您的移动应用没有受到 MitM 攻击,没有被篡改,没有 运行有根设备,未连接到调试器,并且不存在检测框架。这是通过 运行 后台的 SDK 实现的,该 SDK 将与云中的服务 运行 通信,以证明移动应用程序的完整性,并且设备已 运行 开启。移动应用程序中的 SDK 不会根据移动应用程序提供的测量结果在云服务中完成有关应用程序或移动设备完整性的任何决定。

因此,在成功证明移动应用程序完整性后,云服务会发布一个短时间的 JWT 令牌,并使用仅 API 服务器和移动应用程序证明服务中的秘密进行签名云知道。如果移动应用证明失败,JWT 令牌将使用 API 服务器不知道的秘密进行签名。

现在,应用程序必须在请求的 headers 中随每个 API 调用 JWT 令牌一起发送。这将允许 API 服务器仅在可以验证 JWT 令牌中的签名和过期时间时才为请求提供服务,并在验证失败时拒绝请求。

一旦移动应用程序不知道移动应用程序证明服务使用的秘密,即使应用程序被篡改,也无法在 run-time 对其进行逆向工程,运行 root 设备或通过成为中间人攻击目标的连接进行通信。

所以这个解决方案在没有误报的积极检测模型中工作,因此不会阻止合法用户,同时让坏人无法进入。

Any ideas?

您可以尝试推出自己的解决方案,也可以寻找现有的移动应用认证 SAAS 解决方案,例如 Approov(我在这里工作),它为多个平台提供 SDK,包括 iOS, Android, React Native 等。集成还需要在 API 服务器代码中进行少量检查,以验证云服务发布的 JWT 令牌。此检查对于 API 服务器能够决定处理哪些请求以及拒绝哪些请求是必要的。

总结

最后,为保护您的 API 服务器和移动应用程序而使用的解决方案必须根据您要保护的内容的价值和该类型的法律要求来选择数据,例如欧洲的 GDPR 法规。

加倍努力

您似乎对移动应用程序安全很感兴趣,我想推荐您吗:

OWASP Mobile Security Project - Top 10 risks

The OWASP Mobile Security Project is a centralized resource intended to give developers and security teams the resources they need to build and maintain secure mobile applications. Through the project, our goal is to classify mobile security risks and provide developmental controls to reduce their impact or likelihood of exploitation.