iOS安全审计入门

2024-08-29 02:58
文章标签 入门 安全 ios 审计

本文主要是介绍iOS安全审计入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

此前有人统计过2015年漏洞最多的产品,苹果的OSX与iOS系统分别占据第一二名,虽有人怀疑统计数据可能存在重复的不准确情况,但相信大趋势是不会变的。而今年国内一家机构发布的手机安全报告指出,32.3%的用户明确表示自己曾经在手机上遭受过风险危害,而遭遇安全威胁的iPhone用户比例达23.9%。iOS的安全形势不容乐观,因此对iOS应用进行安全审计也变得更为迫切。

本文旨在提供iOS应用程序安全审核方法的概述,并介绍一些可用于执行分析的工具。首先是iOS沙盒介绍:

IOS沙盒

ios沙盒机制示意图.png

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

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的几个截图与之前未加密二进制文件的对比。

hopper_strings.pnghopper_viewcontrollers.png 
hopper_pseudo_code.png

检查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存储位置.JPEG 

Keychain示例

当我们在对一个应用进行评估时,对app在keychain中存储的信息进行查看是有必要的。建议使用操作系统提供的Keychain顶部的额外加密来加密存储在Keychain中的数据。

我们知道,在iOS中,你可以将数据存储在SQLite数据库中(SQLite是一款轻型的嵌入式数据库),SQLite文件可在应用沙箱中数据目录中进行访问。默认情况下,SQLite数据库是未加密的。但如果你要对这些数据进行加密,怎么办?

SQLcipher就是一个很好的选择。当我们审计一个应用时,一定要弄清楚应用是否在SQLite中保存了数据,保存了什么类型的数据,这些数据是否已经加密了等等。

检查HTTP缓存响应

如果应用程序使用内置的NSURLRequest来执行HTTP请求,则响应可能会被缓存在应用程序的Cache.db SQLite文件磁盘上。它的远程API/Web服务器在响应中不返回Cache-Control头,敏感信息就可能会被存储在设备上。值得注意的是,存储在此文件中的缓存数据并未加密。

MobSF(工具)

【需要越狱】MobSF是一个对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文件系统模块

这个模块可以监听应用对文件系统的访问情况。如图:

snoopit_filesystem.png

Snoop-it加密模块

该模块用于跟踪常见的加密API的调用,如图:

snoopit_common_crypto.png

Snoop-it地址伪造模块

当应用程序请求设备当前的GPS坐标时,此模块允许提供假的位置。

snoopit_fake_location.png

Snoop-it硬件欺骗模块

Snoop-it支持多种运行时修改,包括修改你的硬件标识符比如Mac地址,UDID,设备模型号等等。

snoopit_hardware_spoof.png

Snoop-it Keychain模块

这个模块主要用于跟踪keychain中的数据访问和存储情况。

snoopit_keychain.png

Snoop-it方法调用模块

这个模块允许应用程序在运行时调用方法。

snoopit_method_invoke.png

Snoop-it方法跟踪模块

这个模块主要是用于跟踪应用执行期间方法的调用情况。

snoopit_method_tracing.png

Snoop-it网络模块

这个模块主要跟踪应用对HTTP和HTTPS的调用情况。

snoopit_network.png

Snoop-it敏感API模块

你可以看到应用调用的敏感API。比如在地址簿查找信息,访问camera,或者访问设备的UDID。

snoopit_sensitive_api.png

Snoop-it URL模式模块

此模块显示哪种URL模式在应用程序中被使用。

snoopit_url_schemas.png

IDB

需要越狱】IDB是另外一款强大的开源工具,用Ruby语言编写而成。虽说不像Snoop-it那样,可以直接调用方法,它还是有着自己的特色功能,比如检查系统日志和粘贴板,模糊URL方案等。

IDB应用信息

idb_app_info.png

追踪分析利器introspy-ios / introspy-analyzer

【需要越狱】Introspy由ISEC partners开发,Introspy由两个单独的模块组成,一个追踪器,一个分析器。它是分析iOS应用程序安全的最强大工具之一。

introspy-ios有助于自动执行应用程序的运行时分析,而且还可以发现潜在的安全威胁。Introspy-ios hook并检查被应用调用的敏感API,它将结果存储在设备的本地SQLite数据库中。

Introspy-Analyzer是一个帮助格式化跟踪器数据并生成HTML报告的工具。下面是将工具嵌入Yelp应用程序的示例。

introspy_trace.png

Snapshot

当应用在后台运行时,只需通过Home键就可以对当前屏幕进行截屏,截屏照片会保存下来。当我们在对应用进行审计时,有必要检查该应用是否会展示敏感信息。如果有显示敏感信息的情况,将程序放置在后台并对iOS的截图进行检查。如果这台设备已经被越狱了,则可以通过前面介绍的Needle来进行相同的测试,并且用Needle会自动下载截图。否则,就只能用i-funbox从应用程序沙盒目录中手动寻找该文件了。

越狱检测

【需要越狱】作为深度的安全测量,应用程序可能会对设备实施越狱检测,如果没有通过越狱检测,则会拒绝运行。如果检测到有敏感数据存储在设备上,应用程序就会清除这些敏感数据(前提是该设备已经被越狱了)。在审查应用程序时,有必要检查是否执行越狱检测以及执行带来的后果。

防调试保护

需要越狱】作为另一种深度的安全测量,应用程序可能会检测到它正处于调试模式,并且还连接到了调试器(如GDB),并正常停止运行。即使经验丰富的人能绕过这类防护方式,对于经验少甚至无经验的人来说,他们只能望洋兴叹,另寻出路了。

键盘缓存

需要越狱】我们知道,在iOS应用程序中输入字段时,数据会被缓存并且进行自动更正,当然,密码类型的文件和特定字符串除外。我们在对应用进行审计时,尤其要注意哪些数据存储在缓存中。

缓冲区溢出/格式化字符串/内存损坏

iOS应用很可能会受到内存损坏漏洞攻击,比如缓冲区溢出和字符串格式化等。在我们做审计时,模糊用户输入和检查应用程序崩溃都是值得尝试的,通过这些检查,我们可能会发现这些应用是容易被攻击的。如果测试设备已经越狱,则可以通过调试手段做进一步的崩溃分析。


转载来源:

http://www.freebuf.com/articles/terminal/123098.html

英文版:

http://www.droidsec.cn/ios-app%E5%AE%89%E5%85%A8%E5%AE%A1%E8%AE%A1%E6%96%B9%E6%B3%95%E4%B8%8E%E5%B7%A5%E5%85%B7/


这篇关于iOS安全审计入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116650

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就