Android签名验证

时间:2016-06-16 05:07:25

标签: java android apk

在Android签名验证及其漏洞的情况下,我有很多疑问需要清除。

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

所以当这个zipsigner签署unsigned 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/

2 个答案:

答案 0 :(得分:10)

  1. 私钥是从不分发APK的一部分,除非我误解了您的问题。除非您自己的系统遭到黑客入侵,否则无法代表您签名。

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

  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

  4. 您还应该阅读此内容,了解防篡改的可能方法APK - https://www.airpair.com/android/posts/adding-tampering-detection-to-your-android-app

答案 1 :(得分:2)

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

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

    不检查META-INF文件是加密代码工作方式的副作用。为了保护您需要创建一条唯一描述该消息的消息。这是受保护数据的哈希值。遗憾的是,证书不能包含在此中,因为它是在计算哈希值之后添加的。 因此,通常可以在不破坏签名的情况下添加地点。对于windows和.exes,Microsoft's report here:MS13-98。在这种情况下,某些安装程序使用未经检查的数据来选择从哪里下载文件。这使他们很脆弱。

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

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

    自签名问题

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

      

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

    • 私钥在APK中无法使用,因此无法用于重新签名数据。
    • 如果不更改其哈希值,则无法修改APK(META-INF外部)中的文件。
      

    每当解压缩apk时,它会丢失其签名信息吗?

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