逆向笔记 - iOS系统安全机制

一些经常遇到的问题:

  • 修改app结构后无法运行?
  • 不能直接读取其他应用程序的文件?
  • 程序每次运行的时候地址都不一样?
  • 系统升级了不允许降级?

iOS 系统官方 安全架构

硬件和固件:

  • 设备秘钥、组秘钥、Apple 根证书
  • 加密引擎
  • 内核:
    • Secure、Enclave
    • 安全元件

软件

  • 文件系统
  • 操作系统分区
  • 用户分区(已加密)
  • 应用沙盒
  • 数据保护类
逆向笔记 - iOS系统安全机制_第1张图片
软件.png

硬件和固件:

  • 加密引擎:对 设备密钥、组密钥、Apple 根证书 进行加密
  • Secure Enclave 模块:用来加密和解密
  • 例如:touch ID: 保存用户名和指纹密码

软件:

  • 用户分区: 完全加密的,并且加密功能是不能关闭的。苹果的iOS加密是硬件级别的,所有进出存取的都要通过苹果的 iAS以及 进行加密,而且iAS引擎进行加密的key 是跟硬件相关的。所以说,我不能把一个设备加密的数据拿到另外一个设备上去解密,这样是不能解密的
  • 应用沙盒:提供 数据保护类的 一个 安全机制。
  • 数据保护类: 可以保护应用内数据的安全性,比如我们在应用沙盒里面写入的数据,我们可以通过数据保护类限定,只有在用户解锁了设备之后才能读取这个数据

从 上图可以看出 iOS 安全的几个点:

  • 安全启动链:启动的时候,会保障我们启动的系统是受信任的
  • 系统软件授权机制:能保障我们的系统更新之后就不能退回到原来的老的版本
  • 应用代码签名:所有的运行的代码都要通过苹果的签名才能运行
  • 运行时进程安全性:
    • 沙盒机制(Sandbox): 让应用运行在沙盒里面
    • 数据执行保护(DEP): 能区别哪些是数据,哪些是代码。数据是不能运行的,代码是才可以运行。
    • 地址空间布局随机化(ASLR): 每一次程序加载的时候,他的机地址都是变化的
  • 数据加密保护:保护应用里面的数据的安全性

安全启动链

系统启动过程中每一步包含的所有组件都已经经过 苹果签名,并且只有在验证了信息链后才能继续往后执行。

启动流程:系统启动 -> Boot ROM -> 底层引导加载程序(LLB) -> 引导加载程序(iBoot) -> Kernel

  • Boot ROM: 在iOS 设备里面集成了一段 名为 “Boot ROM” 的代码 片段,这段代码被镶嵌到 处理器的一块存储上并且是只读的。
  • 底层引导加载程序:在系统启动的时候会通过苹果的证书. 对底层引导加载程序,进行签名验证,如果通过验证,底层引导加载程序就会对 引导加载程序进行验证
  • 如果引导加载程序也通过验证,才会去加载内容。
  • 在上面所有加载步骤中,都会有签名验证,如果某一步发现签名验证失败,就会进行到 恢复/固件升级模式。
逆向笔记 - iOS系统安全机制_第2张图片
安全启动链.png

系统软件授权

为避免设备降级为缺少最新安全性更新的早期版本,iOS采用了为名为 “系统软件授权”的过程。
下面的流程是iTunes 刷入固件到手机上面的流程
固件 -> CPU -> iTunes -> 固件签名 -> 服务器 -> 开启验证 -> 验证许可 || 验证许可+随机串 -> 通过验证
如图:


逆向笔记 - iOS系统安全机制_第3张图片
开启验证.png

固件通过 CPU 刷到手机上面去,CPU在写入我们的固件之前,会让 iTunes 把 我们的 固件签名 发送到服务器,如果服务器开启了验证,就返回一个验证许可或者是 验证许可+随机串,拿到验证许可后,通过验证。cpu才会真正把我们的固件刷到手机上去。

如果关闭 开启验证,在早期的版本,只会返回一个验证许可,可以通过保存 SHSH来欺骗cpu刷入我们的固件。
如图:


逆向笔记 - iOS系统安全机制_第4张图片
Snip20170704_7.png

在后面的版本,苹果除了返回验证许可之外,还返回了一个随机串。这个随机串是和硬件相关的,并且只能使用一次。也就保证了这个是不能模拟的,所以保存SHSH无效。
如图:

逆向笔记 - iOS系统安全机制_第5张图片
Snip20170704_8.png

应用代码签名:

为确保所有应用均来自批准的已知来源并且未被篡改,iOS要求所有可执行代码均使用 Apple 颁发的证书进行签名。
包括

  • 可执行代码 : 可执行程序里面的代码
  • 加载的动态库
  • 加载的资源

这三个在我们运行的时候会进行签名验证。
验证通过以后,才能正常运行。
如图:

逆向笔记 - iOS系统安全机制_第6张图片
应用代码签名.png

应用沙盒机制(Sandbox)

/var/mobile/Containers/Data/Application/[GUID]
保证我们所有的应用都是在一个沙盒模块里面,如下图

逆向笔记 - iOS系统安全机制_第7张图片
沙盒模块.png

在这个图片中可以看到:
安装完一个应用后,都是运行在一个隔离的环境,每一个应用都是一个隔离的环境,并且互不干扰,也不能随意去访问其他应用程序的数据。

沙盒的特点:

  • 每个应用程序都有自己的存储空间
  • 应用程序不能直接去访问别的存储空间的内容
  • 应用程序请求的数据都要通过权限检测,如:
    • 短信、照片等

数据执行保护(DEP)

处理器能区分哪部分内存是可执行代码以及哪部分内存是数据。
DEP不允许数据的执行,只允许代码执行。

如图,讲解代码无法再数据段里执行

逆向笔记 - iOS系统安全机制_第8张图片
数据段.png


在上边的图中,恶意代码作为数据,写入到数据段里面去,是不能被执行的,但是如果恶意代码 放在了代码段,就可以执行。

但是:

可以通过ROP创建一块可写入可执行的内存区域

ROP的含义

ROP就是相当于把程序里面不同地方的代码片段组合起来,通过一个指定流程去执行,来达到我们最终的目的

如果我们通过 ROP 写入代码,这个代码是没有被签名的,这个时候代码签名的好处就体现出来了。这段代码是不会被允许执行的

地址空间布局随机化(ASLR)

在 iOS中,二进制文件、库文件、动态链接文件、栈和堆内存地址的位置全部是随机的。

把这些文件加载到内存中的时候,它加载的机地址每次都是随机变化的,可以通过命令来查看应用模块的机地址:

  • image list -o -f

如图:
加载地址是 9dd800


逆向笔记 - iOS系统安全机制_第9张图片
应用模块机地址.png

逆向笔记 - iOS系统安全机制_第10张图片
图片.png

加密和数据保护

文件内容是根据 文件密钥加密的
文件秘钥是 根据 类密钥加密的

逆向笔记 - iOS系统安全机制_第11张图片
Snip20170705_7.png

你可能感兴趣的:(逆向笔记 - iOS系统安全机制)