美文网首页
逆向笔记 - iOS系统安全机制

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

作者: 文瑶906 | 来源:发表于2017-07-03 22:03 被阅读0次

一些经常遇到的问题:

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

iOS 系统官方 安全架构

硬件和固件:

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

软件

  • 文件系统
  • 操作系统分区
  • 用户分区(已加密)
  • 应用沙盒
  • 数据保护类
软件.png

硬件和固件:

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

软件:

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

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

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

安全启动链

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

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

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

系统软件授权

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


开启验证.png

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

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


Snip20170704_7.png

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

Snip20170704_8.png

应用代码签名:

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

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

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

应用代码签名.png

应用沙盒机制(Sandbox)

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

沙盒模块.png

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

沙盒的特点:

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

数据执行保护(DEP)

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

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

数据段.png


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

但是:

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

ROP的含义

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

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

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

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

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

  • image list -o -f

如图:
加载地址是 9dd800


应用模块机地址.png 图片.png

加密和数据保护

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

Snip20170705_7.png

相关文章

  • iOS逆向工程

    一.什么是逆向工程 二.iOS 系统安全机制 1.iOS 系统的安全架构 加载顺序:①.安全启动链--->②.系统...

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

    一些经常遇到的问题: 修改app结构后无法运行? 不能直接读取其他应用程序的文件? 程序每次运行的时候地址都不一样...

  • iOS逆向课程笔记(一)

    iOS逆向课程笔记 [TOC] ==iOS逆向环境介绍== *** 越狱环境:iphone5s iOS 8.3**...

  • iOS 系统相关复习

    沙盒 iOS沙盒详细介绍iOS沙盒篇 沙盒机制介绍 iOS中的沙盒机制是一种安全体系。为了保证系统安全,iOS每个...

  • iOS签名机制

    应用签名的原理iOS APP签名机制详解iOS逆向之旅(基础篇) — App的签名机制【Xcode是如何将App安...

  • iOS逆向分析笔记

    layout: wikititle: iOS逆向分析笔记categories: Reverse_Engineeri...

  • iOS沙盒详细介绍

    沙盒机制介绍 iOS中的沙盒机制是一种安全体系。为了保证系统安全,iOS每个应用程序在安装时,会创建属于自己的沙盒...

  • 一 iOS 逆向工程概述

    1 什么是iOS逆向工程 2 iOS逆向的目的 3 iOS逆向过程以及方法 一 什么是iOS逆向工程 iOS逆向...

  • iOS逆向学习

    Apple保护机制 iOS系统安全架构 软件+ 硬件固件 软件:文件系统->操作系统分区->用户分区(已加密)->...

  • 初识汇编

    逆向课程随堂笔记 001--初识汇编 我们在学习逆向开发之前,我们要了解一个基本的逆向原理.首先我们是逆向iOS系...

网友评论

      本文标题:逆向笔记 - iOS系统安全机制

      本文链接:https://www.haomeiwen.com/subject/badncxtx.html