iOS安全审计入门
作者:admin | 时间:2016-12-24 00:09:23 | 分类:黑客技术 隐藏侧边栏展开侧边栏
此前有人统计过2015年漏洞最多的产品,苹果的OSX与iOS系统分别占据第一二名,虽有人怀疑统计数据可能存在重复的不准确情况,但相信大趋势是不会变的。而今年国内一家机构发布的手机安全报告指出,32.3%的用户明确表示自己曾经在手机上遭受过风险危害,而遭遇安全威胁的iPhone用户比例达23.9%。iOS的安全形势不容乐观,因此对iOS应用进行安全审计也变得更为迫切。
本文旨在提供iOS应用程序安全审核方法的概述,并介绍一些可用于执行分析的工具。首先是iOS沙盒介绍:
IOS沙盒
iOS沙盒机制示意图
iOS沙盒机制简述起来就是,iOS应用程序只能在为该程序创建的文件系统中读取文件,不可以去其他地方访问,此区域称为沙盒,所有的非代码文件都要保存在此,如图像、图标、声音、映像以及文本文件等。归纳起来就是以下3点:
1、每个应用程序都有自己的存储空间;
2、应用程序不能翻过自己的围墙去访问别的存储空间的内容;
3、应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。
当然,越狱的iOS设备不受此约束。所有在iOS程序都是在沙箱环境中运行,这种隔离是由操作系统维护,并基于其他四个不同的关键组件,四个组件分别是:Entitlements、Container、Powerbox和XPC 服务。
Entitlements
Entitlements是包括应用签名在内的一系列属性配置的列表。为了启动其他功能,如icloud、推送通知或Apple Pay,我们需要给应用程序指定相应的权限。换句话说,应用程序启动的越多,则沙盒里面的内容就越多。
Containers(容器)
我们知道,在iOS中,每个程序都在自己的容器中运行。启动应用程序时,会为应用程序的进程设置两个环境变量:HOME和CFFIXED_USER_HOME。。通过这种方式,操作系统会让应用认为自己的home目录处在iOS控制之下。如果应用程序试图访问真正的系统用户主目录,沙盒会予以拒绝。
Powerbox
如果应用程序试图访问自己的沙盒以外的文件,系统会拒绝该请求。而iOS提供了一个称为Powerbox的可信中介进程,应用程序可以调用该进程来表明自己有权访问自己沙箱之外的某个文件。在收到类似的访问请求之后,系统会提示用户选择哪些文件可以被应用访问。一旦该用户做出选择,那么该文件被直接提供给应用程序。
XPC Services
为了允许开发者执行相同应用组件的特权分离,iOS启用了一种叫做XPC的进程间通信技术。单个的XPC服务在自己的沙箱中运行,这也就意味着不同的XPC服务具有不同的权限集。应用程序的XPC服务只能由应用程序本身访问,而其寿命则完全由操作系统控制。
关于越狱(建议)
为了对应用程序进行彻底的审计,你需要对iOS设备进行越狱操作,虽然说不越狱也能进行测试,但其功力就下降了很多,甚至还会导致有些审查无法开展(我们会对需要越狱的部分加以标注)。关于越狱,本文不做讨论,有兴趣的看官可以参考以下地址:
远程 API
大部分移动应用都依赖外部Web的API执行用户认证、同步、或者应用的本地数据备份等请求。为了执行API测试,需要通过以下方式代理移动应用程序请求:在控制机上运行代理(比如说Burp)。要设置该设备的代理请求到另一台主机,请参考官方指南(传送门)。
要在本地移动应用程序上执行网络通信的检查列表如下:
1.与远程API的纯文本通讯;
2.缺少SSL证书锁定;
3.SSL配置错误。
与远程API的纯文本通讯
首先检查的就是,应用程序使用SSL/TLS进行网络通讯。如果采用明文HTTP协议,应用程序在中间人攻击中就会变得异常脆弱,一个潜在的攻击者能够截获并修改app与API的网络数据。
缺少SLL证书锁定
证书锁定是将主机和预期的SSL证书或公钥相关联的过程。
在iOS设备设置为通过受控代理正确代理网络流量后,启动应用程序并尝试通过登录来生成网络流量。如果应用拒绝了这次连接,那么证书锁定就已经被正确设置了,相反,就可能会对移动应用程序流量执行中间人攻击。
【需要越狱】如果证书锁定被执行了,尝试使用SSL kill Switch(一个黑盒工具,可以在iOS和OS X中组织SSL证书验证),以便更好的了解API端点和应用调用的参数。
SSL配置错误
在移动应用开发的过程中,开发者为了能够加快开发进程,就可能接受任何自签名的SSL证书。当应用程序部署在Apple Store中时,可能就会忘记对签名进行检查。所以,子对应用进行审计时,要确保应用可以接收任何类型的自签名证书。
静态分析
在本文中,我们用Yelp作为例子来讲解。既然是例子,那这个应用是没有任何漏洞或者利用的。选择它,纯粹是为了描述如何进行iOS应用程序的安全审计。一个应用程序的静态分析涉及审查和撤销应用程序二进制文件。下面是一些执行的工具和需要审计的列表:
Needle
Needle是MWR Infosecurity在今年8月发布的一款工具,该工具旨在方便iOS应用的审查。截至10月,该工具有如下功能可以正常使用:允许应用程序二进制文件,存储,动态和静态分析(前提是,该源代码访问可用)。当然,我们还可以用它将Cycript和Frida进行hooking。Needle由Python语言汇编而成,很容易就通过shell来启动:
python needle.py
Needle需要一些选项才能连接到iOS设备(需要在其上运行OpenSSH服务器)。在下面的例子中,iOS设备的IP是192.168.2.3,并且我们需要连接到默认SSH端口22,并使用metadata(元数据)模块提取一些基本的信息。
set IP 192.168.2.3
set PORT 22
use metadata
run
运行上述命令的结果,显示了应用程序在设备文件系统中的位置、支持的CPU架构以及进行审计所需的最低iOS版本等等。
/private/var/mobile/Containers/Bundle/Application/2E2A51E9-B964-41B6-B360-34AD21CE2BE3/Yelp.app/Yelp
Architectures : armv7, arm64
Platform Version : 9.3
SDK Version : iphoneos9.3
Minimum OS : 8.0
应用加密
[需要越狱] 众所周知,所有在Apple Store上的应用都受到苹果二进制加密方案的保护(这也是为什么大家会说苹果应用比安卓应用好用的地方)。Needle允许对应用进行解密,并拉取本地解密的IPA。
Dumpdecrypted是一个解密iOS应用程序二进制文件的好工具。使用方法如下:
DYLD_INSERT_LIBRARIES=/usr/lib/dumpdecrypted.dylib/private/var/mobile/Containers/Bundle/Application/2E2A51E9-B964-41B6-B360-34AD21CE2BE3/Yelp.app/Yelp
Yelp.decrypted 将会被创建.。为了检查二进制文件支持的架构,我们可以使用lipo命令(lipo是一个在Mac OS X中处理通用程序(Universal Binaries)的工具):
lipo -info Yelp.decrypted
将会得到如下的结果:
Architectures in the fat file: /private/var/mobile/Containers/Bundle/Application/2E2A51E9-B964-41B6-B360-34AD21CE2BE3/Yelp.app/Yelp are: armv7 arm64
在苹果中使用otool命令可以得到相同的效果:
otool -vh Yelp.decrypted
运行otool命令得到的结果(otool可以提取并显示iOS下目标文件的相关信息,包括头部,加载命令,动态库等,是一个强大的分析工具,当然也可以做反汇编工具):
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC ARM V7 0x00 EXECUTE 116 9800 NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES
BINDS_TO_WEAK PIE
/private/var/mobile/Containers/Bundle/Application/2E2A51E9-B964-41B6-B360-34AD21CE2BE3/Yelp.app/Yelp
(architecture arm64):
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 ARM64 ALL 0x00 EXECUTE 116 10584 NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES
BINDS_TO_WEAK PIE
lipo也可以用于提取特定架构的可执行文件。在本例中,将使用armv7:
lipo -thin armv7 -output Yelpv7 Yelp.decrypted
现在,我需要确认新的可执行文件只支持1个架构。
otool -vh Yelpv7
Yelpv7:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC ARM V7 0×00 EXECUTE 116 9800 NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES
BINDS_TO_WEAK PIE
抓取可执行文件到本地机器:
scp root@192.168.2.3:/private/var/root/Yelpv7 .
解密过程可以通过加载应用程序手动完成,将gdb附加到进程并将未加密程序的存储器位置转储到文件夹。
现在,我们已经可以访问未加密的可执行文件,但我们不能用Hopper、IDA或者任何其他的逆向工程工具来检查它。下面是Hopper的几个截图与之前未加密二进制文件的对比。
检查Plist文件
我们知道,应用程序可能会使用Plist文件来存储配置信息。Plist是XML结构的文本文件,当访问iOS应用程序时,要检查事情之一就是存储在plist文件中的硬编码凭证。不需要越狱来访问这类文件。这里我们又要提到另外一个工具——i-funbox,它是一款可以在任何iOS设备的沙盒中嗅探应用数据(包括plist文件)的工具。
对Keychain数据和SQL 数据库的检查
【需要越狱】iOS系统及第三方应用都会使用Keychain来作为数据持久化存储媒介,或者应用间数据共享的渠道,有了keychain以后,应用就可以存储凭证或者是API访问token一类的信息了。Keychain会在数据存储到文件系统前对数据进行加密。它是一个sqlite数据库,位于/private/var/Keychains/keychain-2.db,其保存的所有数据都是加密过的。对设备进行越狱操作,可以让应用对存储在keychain中的数据进行无碍访问。而在所有工具中,Keychain-Dumper无疑是非常出众的。顾名思义,该工具就是将所有的keychain数据转储到越狱设备。
Keychain示例
当我们在对一个应用进行评估时,对app在keychain中存储的信息进行查看是有必要的。建议使用操作系统提供的Keychain顶部的额外加密来加密存储在Keychain中的数据。
我们知道,在iOS中,你可以将数据存储在SQLite数据库中(SQLite是一款轻型的嵌入式数据库),SQLite文件可在应用沙箱中数据目录中进行访问。默认情况下,SQLite数据库是未加密的。但如果你要对这些数据进行加密,怎么办?
SQLcipher就是一个很好的选择。当我们审计一个应用时,一定要弄清楚应用是否在SQLite中保存了数据,保存了什么类型的数据,这些数据是否已经加密了等等。
检查HTTP缓存响应
如果应用程序使用内置的NSURLRequest来执行HTTP请求,则响应可能会被缓存在应用程序的Cache.db SQLite文件磁盘上。它的远程API/Web服务器在响应中不返回Cache-Control头,敏感信息就可能会被存储在设备上。值得注意的是,存储在此文件中的缓存数据并未加密。
MobFS(工具)
【需要越狱】MobFS是一个对iOS和安卓应用进行静态和动态分析的开源工具。
动态分析
动态分析包括对应用程序进程的运行时(运行时是苹果提供的纯C语言的开发库,是一种非常牛逼、开发中经常用到的底层技术)进行操作,以便实现以下目的:
1.绕过越狱检测;
2.窃取加密密钥或敏感数据;
3.加载ViewControllers从而绕过某些控制;
4.攻击本地认证(如果存在认证);
5.访问企业应用程序时可以进入内部网络;
6.检查自定义加密。
Instrumentation(工具)
【需要越狱】存在许多工具来执行所谓的检测,它们主要用于在运行时中修改应用。最常见的工具:
1.Cycript(是大神saurik开发的一个非常强大的工具,可以让开发者在命令行下和应用交互,在运行时查看和修改应用);
2.Frida(Frida是一款基于python + javascript 的hook与调试框架,通杀android\ios\linux\win\osx等各平台,相比xposed和substrace cydia更加便捷);
3.Cydia substrate(Cydia Substrate是一个代码修改平台。它可以修改任何主进程的代码,不管是用Java还是C/C++(native代码)编写的。);
4.GDB;
5.覆盖函数的动态连接(LD_PRELOAD)。
Cycript
Cycript(传送门)是大神saurik开发的一个非常强大的工具,可以让开发者在命令行下和应用交互,在iOS运行时查看和修改应用。 这个工具使用了Objective-C和JavaScript的混合模式,可以实时的和应用交互甚至修改应用。(一种是在越狱的设备上通过MobileSubstrate加装,这样可以在所有的应用里使用;另一种是通过静态库的方式把cycript集成到自己的应用,这样做不要求越狱,当然也只能在自己的应用内使用了。)
Cycript主要是注入你关注的那个应用的线程,然后就可以获得app,获得window,慢慢去获得viewController,逐步逐步拨开UI的面纱。我们可以通过传递应用名称或PID来启动该工具:
cycript -p Yelp
一旦连接到该进程,就可以窥探应用程序的组件了:
cy# UIApp
#"<UIApplication: 0x1667a760>"
cy# [UIApplication sharedApplication]
#"<UIApplication: 0x1667a760>"
cy# UIApp.keyWindow
#"<UIWindow: 0x17bdfd70; frame = (0 0; 768 1024); gestureRecognizers = <NSArray: 0x17f14270>; layer = <UIWindowLayer: 0x17d23150>>"
cy# UIApp.keyWindow.rootViewController
#"<YPUITabBarViewController_iPad: 0x17c30b90>"
cy# UIApp.delegate
#"<YPUIApplicationDelegate_iPad: 0x1667fd30>"
有了这个,我们就可以手动调用某方法,或者修改当前的ViewController(视图控制)等等。
在下面的示例中,我们假设YPUIApplicationDelegate_iPad类实现了一个名为correctCredentials的方法,该方法验证用户输入的凭据,如果凭证正确,则会返回“true”。Cycript允许在运行时中重新定义方法。在这种情况下,我们希望在调用该方法时始终返回“true”:
cy# YPUIApplicationDelegate_iPad.prototype['correctCredentials'] = function(){return true;}
function () {return!0;}
在查看应用程序时,我们可以在运行时中操作进程来检查可以实现什么类型的绕过。如果很轻松就能绕开某些功能,那么这个应用设计肯定是有问题的。
使用Snoop-it分析iOS应用
【需要越狱】Snoop-it允许我们进行运行时分析和对iOS应用进行黑盒安全评估,它可以查看keychain中存储的数据,还可以浏览你手机上App的类的层级,并且可以查看该App中某个文件的属性和方法。它有着相当有好的Web界面和丰富的功能,如下图所示:
Snoop-it文件系统模块
这个模块可以监听应用对文件系统的访问情况。如图:
Snoop-it加密模块
该模块用于跟踪常见的加密API的调用,如图:
Snoop-it地址伪造模块
当应用程序请求设备当前的GPS坐标时,此模块允许提供假的位置。
Snoop-it硬件欺骗模块
Snoop-it支持多种运行时修改,包括修改你的硬件标识符比如Mac地址,UDID,设备模型号等等。
Snoop-it Keychain模块
这个模块主要用于跟踪keychain中的数据访问和存储情况。
Snoop-it方法调用模块
这个模块允许应用程序在运行时调用方法。
Snoop-it方法跟踪模块
这个模块主要是用于跟踪应用执行期间方法的调用情况。
Snoop-it网络模块
这个模块主要跟踪应用对HTTP和HTTPS的调用情况。
Snoop-it敏感API模块
你可以看到应用调用的敏感API。比如在地址簿查找信息,访问camera,或者访问设备的UDID。
Snoop-it URL模式模块
此模块显示哪种URL模式在应用程序中被使用。
IDB
【需要越狱】IDB是另外一款强大的开源工具,用Ruby语言编写而成。虽说不像Snoop-it那样,可以直接调用方法,它还是有着自己的特色功能,比如检查系统日志和粘贴板,模糊URL方案等。
IDB应用信息
追踪分析利器introspy-ios / introspy-analyzer
【需要越狱】Introspy由ISEC partners开发,Introspy由两个单独的模块组成,一个追踪器,一个分析器。它是分析iOS应用程序安全的最强大工具之一。
introspy-ios有助于自动执行应用程序的运行时分析,而且还可以发现潜在的安全威胁。Introspy-ios hook并检查被应用调用的敏感API,它将结果存储在设备的本地SQLite数据库中。
Introspy-Analyzer是一个帮助格式化跟踪器数据并生成HTML报告的工具。下面是将工具嵌入Yelp应用程序的示例。
Snapshot
当应用在后台运行时,只需通过Home键就可以对当前屏幕进行截屏,截屏照片会保存下来。当我们在对应用进行审计时,有必要检查该应用是否会展示敏感信息。如果有显示敏感信息的情况,将程序放置在后台并对iOS的截图进行检查。如果这台设备已经被越狱了,则可以通过前面介绍的Needle来进行相同的测试,并且用Needle会自动下载截图。否则,就只能用i-funbox从应用程序沙盒目录中手动寻找该文件了。
越狱检测
【需要越狱】作为深度的安全测量,应用程序可能会对设备实施越狱检测,如果没有通过越狱检测,则会拒绝运行。如果检测到有敏感数据存储在设备上,应用程序就会清除这些敏感数据(前提是该设备已经被越狱了)。在审查应用程序时,有必要检查是否执行越狱检测以及执行带来的后果。
防调试保护
【需要越狱】作为另一种深度的安全测量,应用程序可能会检测到它正处于调试模式,并且还连接到了调试器(如GDB),并正常停止运行。即使经验丰富的人能绕过这类防护方式,对于经验少甚至无经验的人来说,他们只能望洋兴叹,另寻出路了。
键盘缓存
【需要越狱】我们知道,在iOS应用程序中输入字段时,数据会被缓存并且进行自动更正,当然,密码类型的文件和特定字符串除外。我们在对应用进行审计时,尤其要注意哪些数据存储在缓存中。
缓冲区溢出/格式化字符串/内存损坏
iOS应用很可能会受到内存损坏漏洞攻击,比如缓冲区溢出和字符串格式化等。在我们做审计时,模糊用户输入和检查应用程序崩溃都是值得尝试的,通过这些检查,我们可能会发现这些应用是容易被攻击的。如果测试设备已经越狱,则可以通过调试手段做进一步的崩溃分析。
*参考来源:research,latiaojun含泪编译