验证Android应用程序完整性的简单方法



我想检测APK文件中的任何篡改,并验证应用程序或构建的完整性。当我在网上搜索时,我从官方来源得到了这个解决方案-https://developer.android.com/google/play/integrity/overview

然而,它看起来实现起来并不太多,而且还涉及到服务器端的更改。因此,我研究了另一种解决方案,即找出用于签名我的应用程序的当前密钥库的签名,并将其发送到后端(在将构建上传到PlayStore之前,后端已经有了原始签名)进行验证。

样本代码:

SigningInfo signingInfo = getPackageManager()
.getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES)
.signingInfo;
signingInfo.getApkContentsSigners();
//Send the information to backend to check if matches our original release.keystore signature
  1. 检查APK完整性的上述简单代码有什么缺点吗
  2. 如果没有,那么-Goggle推荐Play Integrity API而不是这个简单的解决方案的原因是什么

您的问题

然而,它看起来没有太多需要实现的内容,并且还涉及服务器端的更改。

保护移动应用程序是一项非常复杂的任务,如果仅在客户端完成,攻击者可以绕过有关其完整性的任何决定。

攻击者可以使用反向工程技术对您的移动应用程序进行反编译和篡改,也可以使用检测框架在运行时挂接您的代码,以改变其行为和/或提取所需的任何内容,然后自动对移动应用程序后端进行攻击。

一些非常流行的开源工具使逆向工程变得更容易:

MobSF-移动安全框架

移动安全框架是一个自动化的、一体化的移动应用程序(Android/iOS/Windows)笔测框架,能够执行静态分析、动态分析、恶意软件分析和web API测试。

Frida:

将您自己的脚本注入黑盒进程。挂钩任何函数,监视加密API或跟踪私有应用程序代码,无需源代码。编辑,点击保存,立即查看结果。所有这些都没有编译步骤或程序重新启动。

为了说明这种逆向工程技术的使用,任何关于移动应用程序及其运行设备的完整性的决定都需要在后端根据从移动应用程序和设备中进行/执行的测量/挑战来执行。

因此,我研究了另一种解决方案,即找出用于签名我的应用程序的当前密钥库的签名,并将其发送到后端(在将构建上传到PlayStore之前,后端已经有了原始签名)进行验证。

攻击者可以轻松执行MitM攻击来拦截此请求,然后提取您发送到后端的此签名。从这里开始,攻击者在向API后端执行API请求时模拟您的移动应用程序将是微不足道的。你可以学习如何在自己的手机上进行MitM攻击,尝试自己提取其签名,我可以通过我的文章《用中间人攻击窃取Api密钥:》来帮助你

为了帮助演示如何窃取API密钥,我在Github中构建并发布了适用于Android的Currency Converter Demo应用程序,该应用程序使用了与我们在早期的Android Hide Secrets应用程序中使用的相同的JNI/NDK技术来隐藏API密钥。

因此,在本文中,您将学习如何设置和运行MitM攻击,以拦截您控制的移动设备中的https流量,从而窃取API密钥。最后,您将从高层次了解如何减轻MitM攻击。

虽然我的文章是提取API密钥,但从API请求提取应用程序签名的步骤相同。

示例代码:

SigningInfo signingInfo = getPackageManager()
.getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES)
.signingInfo;
signingInfo.getApkContentsSigners();
//Send the information to backend to check if matches our original >release.keystore signature
  1. 检查APK完整性的上述简单代码有什么缺点吗

我已经提到MitM攻击是提取发送到后端的签名的一种方式,但攻击者也可以在运行时使用Frida挂接此代码的函数并提取签名。攻击者还可以反编译您的移动应用程序二进制文件并从中提取签名。

这种方法的缺点是,攻击者很容易绕过它,甚至是那些不太熟练的攻击者,比如脚本孩子,他们只是在谷歌上搜索如何做事情和/或使用暗网购买专门的解决方案/工具来帮助他们实现恶意意图。

  1. 如果没有,那么-Goggle推荐Play Integrity API而不是这个简单的解决方案的原因是什么

Google之所以推荐Play Integrity API,是因为它依赖于更先进的技术,这些技术也需要后端集成,从而使流程更难绕过,需要更多的技能才能成功执行攻击。

可能的解决方案

我想检测APK文件中的任何篡改,并验证应用程序或构建的完整性。当我在网上搜索时,我从官方来源得到了这个解决方案-https://developer.android.com/google/play/integrity/overview

即使您愿意尽一切努力实现此解决方案,也需要考虑仅适用于Android的解决方案的缺点,因此,当您还希望使用相同的API后端的iOS应用程序时,需要另一个解决方案。

我建议您阅读我对以下问题的回答如何确保移动应用程序的API REST安全,特别是加强和屏蔽移动应用程序保护API服务器一个可能的更好解决方案部分,用于验证移动应用程序及其运行设备的完整性并将API服务器锁定到移动应用程序。答案I链接上的解决方案建议使用移动应用验证解决方案,该解决方案将通过云服务验证设备和移动应用程序的完整性,该云服务将发布JWT,使API服务器能够知道发出API请求的内容确实是上传到Android Play商店的移动应用程序真实且未修改的实例。

你想多跑一英里吗

在回答安全问题时,我总是喜欢引用OWASP基金会的出色工作。

对于APIS

OWASP API安全前10名

OWASP API安全项目旨在通过强调不安全API中的潜在风险并说明如何减轻这些风险,为软件开发人员和安全评估人员提供价值。为了实现这一目标,OWASP API安全项目将创建并维护API十大安全风险文档,以及创建或评估API时最佳实践的文档门户。

适用于移动应用程序

OWASP移动安全项目-十大风险

OWASP移动安全项目是一个集中的资源,旨在为开发人员和安全团队提供构建和维护安全移动应用程序所需的资源。通过该项目,我们的目标是对移动安全风险进行分类,并提供开发控制,以减少其影响或被利用的可能性。

OWASP-移动安全测试指南:

《移动安全测试指南》(MSTG)是一本关于移动应用程序安全开发、测试和逆向工程的综合手册。

最新更新