移动安全研究:在IPA中重签名iOS应用程序
2020-03-01 10:30:00 Author: www.4hou.com(查看原文) 阅读量:161 收藏

当研究人员被要求对iOS应用程序执行黑盒安全分析时,根据范围的不同,他们可能只能从AppStore访问iOS应用程序。但大多数时候,客户会给研究人员一个IPA(Apple程序应用文件iPhoneApplication的缩写)。在黑箱分析中,研究人员无法访问源代码,因此通过Xcode将其部署到用于测试的设备上是不可能的。一种可能的解决方案是使用研究人员拥有的配置文件重新设计应用程序,并将其部署到研究人员的测试设备上。在这篇文章中,我将解释如何重新签署一个iOS应用程序,以便研究人员生成可部署到测试设备的IPA。

代码签名

作为一项安全措施,Apple要求其信任的开发人员对在其设备上运行的所有代码进行数字签名,签名的工作方式类似于SSL证书在网站上的工作方式。

SSL证书和CA

要在你的网站上使用HTTPS,你需要有数字证书。该证书包含有关你网站的信息,任何人都可以验证。你可以在网站上使用该证书来加密用户与服务器之间的通信。但是你的用户需要能够检查你正在使用的证书的有效性。那用户如何验证它?

首先,你为网站获得的证书应该由受信任的对象签署,该对象可以验证你的身份。否则,想象一下,任何人都可以生成数字证书并假装成你的银行。为此,你的浏览器已预装了许多受信任的证书颁发机构(CA),并且你的浏览器将仅接受由任何这些CA签名(生成)的证书。你的浏览器通过查询CA来验证你网站上的证书。

要获得证书,首先需要生成一个CSR(证书签名请求),在其中指定所需的证书的详细信息。此CSR发送到CA。CA将验证你提交的数据是否正确,他们可能会要求你提供域所有权的证明,以及任何其他表明你身份的文档。当他们验证了所有这些之后,他们将生成并将证书发回给你。你可以在你的网站上使用这个证书。

这就是如何为你的网站获得SSL证书的大致思路,同样的概念也适用于iOS应用程序。

苹果是iOS应用程序的唯一有效CA

因此,如你现在可能想象的那样,或者如果你已经使用Apple创建了Developer帐户,则过程几乎是相同的。发送CSR后,你会从有效的证书颁发机构(在研究人员的情况下仅是Apple)获得证书。

有了证书后,就可以开始数字签名代码了。使用证书对数字进行代码签名将识别你创建的任何应用程序。Apple相信这是你的代码,因为你是唯一有权访问该证书的私钥的人。

希望你可以更好地了解证书的工作方式,我不想做太多细节,因为那里有很多好的资源可以解释这一点,而这篇文章并不是要了解代码签名的工作原理。如果概念仍然不清楚,你可以查看Apple的代码签名支持页面代码签名指南

好的,开始重新签名iOS应用程序。为此,研究人员需要一个IPA文件。

从IPA中提取应用程序捆绑包

无论你使用的是frida-ios-dump还是任何其他工具,我都将假定你拥有.ipa文件。但是你应该具有可以使用的IPA文件。如果你想继续,研究人员将使用OWASP iGoat-Swift。你可以直接下载iGoat-Swift_v1.0.ipa,也可以复制该项目并提取IPA文件。

研究人员将使用ios-deploy将应用程序侧面加载到测试设备上。目前,如果你尝试按原样侧载IPA文件,则该文件将失败,因为配置文件未将你的设备作为运行你的应用程序的有效设备。这就是研究人员重新签名的原因。因此,先提取IPA。

可以将IPA文件解压缩,将该文件作为ZIP文件。文件扩展名意义不大,但为了清楚起见,让empty-shell更改扩展名。

$ mv iGoat-Swift_v1.0.ipa iGoat-Swift_v1.0.zip
$ unzip iGoat-Swift_v1.0.zip -d iGoat-Swift
# this should create a directory iGoat-Swift with Payload inside

研究人员需要首先检查当前IPA需要哪些权利,因此研究人员将首先提取这些权利。

提取权利

设备上安装的每个应用程序都需要一个配置文件,这些配置文件是在Apple的开发人员网站上创建的。我假设你已经有一个,稍后,研究人员将用你当前在IPA上的配置文件替换你的配置文件,但是就目前而言,研究人员需要浏览当前的配置文件,以了解研究人员需要为自己创建的配置文件的要求。

首先,研究人员将从Embedded.mobileprovision中提取一个plist。让研究人员来研究iGoat-Swift目录。

# We should have the following directory structureiGoat-Swift
└── Payload
    └── iGoat-Swift.app

因此,研究人员将在应用程序包中获取Embedded.mobileprovision:

$ cd iGoat-Swift
$ security cms -D -i Payload/iGoat-Swift.app/embedded.mobileprovision > provision.plist

如果你想阅读plist,可以跳到你喜欢的编辑器中,或者研究人员可以使用PlistBuddy从plist中提取所有权利部分。

# we'll use tee to see the output on the screen and also write it to the
# entitlements.plist file
$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist | tee entitlements.plist
# we could have also done it the long and boring way if you feel
# like typing more.
$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist
$ cat entitlements.plist

你会看到类似以下内容:

        application-identifier        6J6AZQ7T23.*        com.apple.developer.team-identifier        6J6AZQ7T23        get-task-allow                keychain-access-groups                        6J6AZQ7T23.*

如果你曾经使用过该权利,并且了解其含义,那么你将知道需要创建哪些权利。如果你不完全了解他们,请使用Google进行查找:

1.get-task-allow允许你以调试模式运行该应用程序,当研究人员从Xcode运行该应用程序时将其添加进来的。

2.keychain-access-groups允许你在应用程序组之间共享钥匙串项目;

当你选择Xcode中的keychain-access-groups的权利时,将生成application-identifier和com.apple.developer.team-identifier。

现在,研究人员拥有了所需的一切,“侦查”步骤完成。

创建一个empty-shell的应用程序

研究人员将创建一个将在设备上运行的空Xcode项目,此应用程序应具有与研究人员将重新签名的应用程序相同的权利。重新签名部分可能会引起误导,这意味着研究人员将使用相同的应用程序但签名不同。我认为,研究人员将使用其他应用程序并将旧应用程序的代码放入其中。

研究人员无法更改应用程序的某些部分并保持签名不变,这就是对代码进行数字签名的全部目的。

研究人员需要的iGoat-Swift应用的授权是“密钥链访问组”,在项目信息授权部分搜索它并添加它。

生成并运行你的空应用程序,在测试设备上运行该应用程序后,你将拥有正确的配置文件,其中包含你的设备ID。

现在,你可以从测试设备中删除空的应用程序。研究人员只需要Xcode即可创建正确的配置文件。现在,研究人员将使用该配置文件“重新签名” iGoat-Swift应用程序。

获取正确的配置文件

现在,让研究人员从empty-shell应用程序中获取权利。研究人员需要找到Xcode将应用程序捆绑包保存到刚刚构建的应用程序的位置。

为此,进入Xcode的文件导航,找到“Product”,然后单击应用程序。然后,检查Xcode检查器区域(Xcode界面的右侧面板),你将找到应用程序包的路径。

在应用程序包中,你会找到Embedded.mobileprovision。将规定文件复制到研究人员的工作目录中:

$ cp PATH_YOU_GOT_FROM_XCODE/embedded.mobileprovision new_embedded.mobileprovision

现在,研究人员可以从该配置文件中获取正确的权利:

$ security cms -D -i new_embedded.mobileprovision > new_provision.plist
$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' new_provision.plist | tee new_entitlements.plist

现在研究人员可以删除以前的代码签名:

$ rm -r Payload/iGoat-Swift.app/_CodeSignature

并使用从空Xcode项目中获得的权利来重新签名,要重新签名,你需要指定你的配置文件。你可以在钥匙串中找到你的配置文件(如果你注册为Apple开发人员)。你可以使用security(1)命令访问它。

$ security find-identity -v -p codesigning

你将看到你的配置文件,使用与在测试设备上构建和运行empty-shell应用程序所使用的配置文件相同的配置文件。

有了这些信息,就可以重新签名应用程序了:

$ codesign -f -s "Your Provisioning Profile (AAAAAA)" --entitlements new_entitlements.plist Payload/iGoat-Swift.app/
#Code sign any framework you have
$ codesign -f -s "Your Provisioning Profile (AAAAA)" --entitlements new_entitlements.plist Payload/iGoat-Swift.app/Frameworks/*
#And code sign the main Executable
$ codesign -f -s "Your Provisioning Profile (AAAA)" --entitlements new_entitlements.plist Payload/iGoat-Swift.app/iGoat-Swift

这将使用你的配置文件和正确的权利对代码进行签名,现在,研究人员可以从新签署的应用程序捆绑包中生成IPA。

$ zip -qr iGoat-Swift_v1.0.ipa  Payload/

使用ios-deploy(是一个终端安装和调试iPhone应用的是第三方开源库,使用时需要开发者证书和Xcode7以上版本),研究人员可以在测试设备上侧面加载(安装)iOS应用程序,而不会出现任何问题。

$ ios-deploy -b iGoat-Swift_v1.0.ipa

总结

研究人员设法用研究人员的配置文件对应用程序进行了签名,但是请记住,研究人员需要匹配原始的配置文件,我们设法放弃了一个带有配置文件的应用程序,但是请记住,我们需要匹配原始的配置文件,包括它的权利。

我还建议你阅读苹果的代码签名指南,该指南将帮助你更好地理解Apple如何处理代码签名,并解释你可能感兴趣的概念。

另外,我建议你在处理代码签名和供应配置文件时,检查手册页中是否包含codesign(1)和security(1),这些选项都非常方便。有了安全性,你就可以访问钥匙串,如果你想查看使用安全性的另一个示例,请查看此文

本文翻译自:https://rderik.com/blog/resigning-ios-apps-from-an-ipa-for-mobile-security-research/如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/mM53
如有侵权请联系:admin#unsafe.sh