【问题标题】:Android signature verification安卓签名验证
【发布时间】:2016-10-17 10:42:13
【问题描述】:

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

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

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

从上述情况来看,在重新打包时,恶意软件可能会包含在我的 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/

【问题讨论】:

    标签: java android apk


    【解决方案1】:

    阅读其他答案链接black hat : APK issues

    1. 如果您确保私钥安全,那么只有您可以签署 APK,并且只有您才能将它们发布到给定的商店。
    2. META-INF 目录中的额外信息未经过检查和验证。这允许将额外数据添加到 jar 文件中,这些数据可用于将信息偷运到 APK 中。但这不会被您的 APK 文件使用,也不会造成声誉受损。
    3. 测试算法存在缺陷,这意味着如果自签名,则不会在设备上检查证书的有效性。

    数据走私

    不检查 META-INF 文件是密码工作方式的副作用。为了保护事物,您需要创建一个唯一描述该消息的消息。这是受保护数据的哈希值。不幸的是,证书不能包含在其中,因为它是在计算哈希后添加的。 因此,通常有些地方可以添加而不会破坏签名。对于 Windows 和 .exe,Microsoft's report here:MS13-98。在这种情况下,一些安装程序使用未经检查的数据来选择从哪里下载文件。这让他们很容易受到攻击。

    在 X509 证书中,有一些未选中的字段。 (未经身份验证的属性)。这使得任何基于 X509 的解决方案都能够走私数据。您的保护,是您上传的本地副本没有走私值。

    如果您不依赖安全目录中未经身份验证的数据,那么您就不会容易受到更改的影响。所以最好的选择是不这样做。

    自签名问题

    自签名会导致一些检查被遗漏。这允许攻击者创建一个声称是他们的可更新包。这是版权问题,而不是安全问题,因为它明显是被篡改的二进制文件(未通过自签名检查)。

    有没有办法重新打包 apk 并使用相同的私钥对应用程序进行签名?

    • 私钥在 APK 中不可用,因此不能用于对数据进行重新签名。
    • APK 中的文件(META-INF 之外)不能在不更改其哈希值的情况下进行修改。

    apk 解压后会丢失签名信息吗?

    解压 APK 不会破坏其签名,您可以重新打包。您可以在不破坏签名的情况下从 APK 中删除项目。但是,在不破坏签名的情况下更改资源和代码是不可能的。

    【讨论】:

      【解决方案2】:
      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

      【讨论】:

      • 你能找到我的链接或从谷歌写到系统固件修复已在最新更新中修复吗? @prabindh
      • 不,修复过程并将其推广到 Android 生态系统比我在这里描述的要复杂得多。不过,您可以关注此文件,获取主线 Google 补丁 (androidxref.com/6.0.1_r10/history/libcore/luni/src/main/java/…)。
      猜你喜欢
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 2019-10-04
      • 2020-06-23
      相关资源
      最近更新 更多