java - 安卓签名验证

标签 java android apk

关于Android签名验证及其漏洞,我有很多疑问需要解决。

一旦我们为应用程序生成 apk,我们就可以解压 apk 并使用 apktool 编辑资源文件。当我们重新打包编辑后的 ​​apk 时,它会丢失其签名。我可以使用 jarsigner 和我在生成 apk 时使用的我自己的私钥来签名未签名的 apk。我在 playstore 中找到了一个名为 zipsigner 的应用程序,它可以用来对这种未签名的 apk 进行签名。

那么当这个 zipsigner 对未签名的 apk 进行签名时,apk 是使用我的相同私钥签名还是使用不同的 key 签名?因为我的 META-INF 文件夹仍然包含 XXX.SF 和 XXX.RSA 文件,其中包含我的私钥信息。如果它与我的私钥相同,那么新的 apk 将是我的应用程序的升级,或者如果它是不同的 key ,我将拥有两个具有相同名称的不同应用程序。

从上述情况来看,我的 apk 中有可能在重新打包时包含恶意软件。 Android的签名验证机制似乎存在漏洞,META-INF文件夹内文件的消息摘要没有包含在MANIFEST.MF和XXX.SF文件中。这为任何人创造了在这些文件夹中包含恶意软件代码、重新打包 apk 并使用 zipsigner 应用程序退出的可能性。

我正在寻找一种可以防止将文件添加到 META-INF 文件夹中的解决方案,我从下面的博客中找到了一个。但我无法理解解决方案的重点。这看起来更像是一个研究课题,因此互联网上没有太多可用信息。有人可以尝试找出博客中指定的解决方案吗?博客链接在问题下方指定。

http://blog.trustlook.com/2015/09/09/android-signature-verification-vulnerability-and-exploitation/

最佳答案

  1. 私钥绝不是分布式 APK 的一部分,除非我误解了您的问题。除非您自己的系统被黑客入侵,否则其他人无法代表您签名。

  2. 共享链接 (blog.truSTLook.com) 讨论了 Android 跳过检查具有 .sf(以及具有相关扩展名的文件)扩展名的文件。因此,恶意软件可以将自己隐藏在具有这些扩展名之一的文件中。 修复提到有一个 Android“系统固件”修复,不是可以在应用程序级别完成的东西。这意味着,OEM(谷歌本身或三星/其他)必须发布更新的固件来解决这个问题。检查最新更新,它可能已经修复。

  3. 在我看来,即使用户旁加载 APK,这也比真正的攻击/威胁更令人讨厌。有关详细信息,请参阅下面的 Blackhat 论文 - https://www.blackhat.com/docs/ldn-15/materials/london-15-Xiao-What-Can-You-Do-To-An-APK-Without-Its-Private-Key-wp.pdf

您还应该阅读这篇文章,了解防篡改 APK 的潜在方法 - https://www.airpair.com/android/posts/adding-tampering-detection-to-your-android-app

关于java - 安卓签名验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37850299/

相关文章:

java - 避免使用 CountDownLatch 在发送回调之前等待许多线程

java - 将具有数据绑定(bind)的 Android 项目从 Java 转换为 Kotlin

Android Studio APK 未更新 buildVersion

android - Apk 在 Google Playstore 上发布时暂停违反模拟政策

android - 为 x86 编译的 APK 可以上传到 Amazon Appstore 吗?

接口(interface) : from which modules are they invoked? 中的 Java 9 默认方法

java - 关于 FOR 循环处理将一维数组转换为二维数组

java - 使用java使用mongodb中的表达式更新给定字段的值

java - java system.setproperty 有替代方案吗?

java - Android - 如何在 JSON 中仅序列化扩展类的显式字段