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 设施进行越狱操作,尽管说不越狱也能进行测试,但其功力就降落了很多,甚至还会导致有些审查无奈发展(咱们会对须要越狱的局部加以标注)。
对于越狱,本文不做探讨,有趣味的看官能够参考以下地址:
http://resources.infosecinstitute.com/ios-application-security-part-1-setting-up-a-mobile-pentesting-platform/
近程 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
该工具有如下性能能够失常应用:
容许应用程序二进制文件,存储,动静和动态剖析(前提是,该源代码拜访可用)。
当然,咱们还能够用它将 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.3set PORT 22use metadatarun
运行上述命令的后果,显示了应用程序在设施文件系统中的地位、反对的 CPU 架构以及进行审计所需的最低 iOS 版本等等。
/private/var/mobile/Containers/Bundle/Application/2E2A51E9-B964-41B6-B360-34AD21CE2BE3/Yelp.app/YelpArchitectures : armv7, arm64Platform Version : 9.3SDK Version : iphoneos9.3Minimum 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 flagsMH_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 0x00 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 数据转储到越狱设施。
当咱们在对一个利用进行评估时,对 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 与调试框架,通杀 androidioslinuxwinosx 等各平台,相比 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 的调用状况。
image.gif
Snoop-it 敏感 API 模块
你能够看到利用调用的敏感 API。
比方在地址簿查找信息,拜访 camera,或者拜访设施的 UDID。
image.gif
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 利用很可能会受到内存损坏破绽攻打,比方缓冲区溢出和字符串格式化等。
在咱们做审计时,含糊用户输出和查看应用程序解体都是值得尝试的,通过这些查看,咱们可能会发现这些利用是容易被攻打的。
如果测试设施曾经越狱,则能够通过调试伎俩做进一步的解体剖析。
查看原文