iOS 시스템 보안 메커니즘

소개

개발 과정에서 종종 다음과 같은 문제가 발생합니다.

  • 앱 구조 수정 후 실행할 수 없음
  • 다른 응용 프로그램에서 직접 읽을 수 없음
  • 프로그램이 실행될 때마다 주소가 다릅니다.
  • 시스템 업그레이드는 다운그레이드할 수 없습니다.

이러한 질문을 통해 iOS 시스템에서 제공하는 보안 메커니즘에 대해 알아보겠습니다.

iOS 시스템 보안 아키텍처

영상

  위의 그림은 Apple의 공식 iOS 시스템 보안 아키텍처 다이어그램으로 두 부분으로 나뉩니다. 첫 번째 부분은 보안 보증을 제공하는 하드웨어 및 펌웨어 계층이고, 두 번째 부분은 소프트웨어가 제공하는 보안 보증입니다.

  하드웨어 계층 위에 장치 키, 마스터 키 및 Apple의 루트 인증서 를 암호화 하는 암호화 엔진 이 있음을 알 수 있습니다 . 그는 암호화 엔진 외에도 암호화 및 복호화에 사용되는 Secure Enclave 모듈을 보유하고 있습니다.우리의 터치 ID는 사용자의 지문 암호를 저장합니다.

  더 자세히 보면 그의 소프트웨어 계층에 사용자 파티션이 있습니다.전체 사용자 파티션은 완전히 암호화되어 있으며 이 암호화 기능을 끌 수 없습니다.Apple의 암호화 엔진은 하드웨어 수준이며 모든 수신 및 발신 저장 데이터는 통과해야 합니다. Apple 암호화 엔진.암호화 및 암호화 엔진에 의해 암호화된 키는 하드웨어와 관련이 있습니다. 따라서 한 장치에서 암호화된 데이터를 다른 장치로 가져와 해독할 수 없으며 작동하지 않습니다.

  마지막으로 애플리케이션 샌드박스 는 애플리케이션 데이터의 보안을 보호할 수 있는 데이터 보호 클래스에 대한 보안 메커니즘을 제공합니다. 예를 들어 애플리케이션 샌드박스에 쓰는 데이터의 경우 사용자가 데이터 보호 클래스를 통해 장치를 잠금 해제한 후에만 데이터를 읽도록 제한할 수 있습니다.

  다음으로 安全启动链系统, 应用代码签名, 沙盒机制, , , ROPASLR측면 加密和数据保护에서 iOS 시스템 보안 아키텍처를 이해합니다 .

보안 부트 체인 시스템

  在启动过程中,每一步所包含的组件都是通过苹果的签名,只有验证了签名之后才能继续往后面执行。我们来看下系统启动的流程,在iOS设备里面集成了一段名为Boot ROM的代码片段,这段代码被烧制到处理器的一块存储上并且是只读的,在系统启动的时候,它会通过苹果的证书对底层引导加载程序,进行签名验证。如果通过验证的话,那么底层加载引导程序就会对引导加载程序进行验证,如果引导加载程序也通过验证了才会去加载内核。在上面所谓的过程中都会有签名验证,如果某一部发现签名验证失败了,就会进入到恢复和固件升级模式。

  系统软件授权机制是为了避免设备降级为缺少最新安全性更新的早期版本,iOS采用了名为系统软件授权的构成,下面我们通过的刷入固件到手机上面这么一个流程来讲解。

영상

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

영상

  如果苹果关闭了验证,在早期的版本,如果只返回一个验证许可,我们可以通过保存SHSH来欺骗CPU写入我们的固件。但是在后面的版本,苹果除了返回验证许可之外,还返回了一个随机串,这个随机串是和硬件相关的并且只能使用一次,也就保障了,最后数字是不能模拟的,所以我们保存SHSH是没有用。

영상

应用代码签名

  应用代码签名是为了保证所有的应用都是来一致来源,并且没有被篡改,iOS要求所有的可执行代码都是通过苹果颁发的证书进行签名,包括我们的可执行程序,里面的代码或者代码加载的动态库,以及加载的资源,那么可执行代码和动态库,在我们运行的时候会进行签名验证,只有验证通过之后才能正常运行。

영상

沙盒机制

  iOS的还提供了沙盒机制,保证我们所有运行的应用都是在一个沙盒模块里面。从上面这张图,我们可以看到,我们安装一个应用时候,他都是运行在一个隔离的环境,每一个应用都是一个隔离的环境,并且互不干扰,也不能随意去访问其他应用程序的数据。所以沙盒会有这么几个特点:

  • 每个应用程序都有自己的存储空间;
  • 应用程序不能直接去访问别的程序的存储内容。比如说它不能读取其他app文件或者内容;
  • 应用程序所请求的数据都要通过权限的检测。这里所说的请求数据,就是类似于短信,照片等等这些数据,如果我们应用程序要去访问这些数据,那么他会通过一个权限检测,让用户决定是否允许你去访问这个数据;

영상

ROP

  处理器能区分哪部分内存是可执行代码哪部分内存是数据,他不允许数据的执行,只允许代码的执行,下面我们看一个简单的例子。假设这是一个目标程序,它上面是数据段,下面是代码的,如果我们把恶意代码作为数据写到数据段里面去,他是没有办法执行的,只有在代码段里面的内容才能执行,在数据段里面的内容是无法执行。

  我们可以通过ROP创建一块可写入可执行的内存时。首先我们来解释一下什么叫ROP,就是相当于把我们程序里面不同地方的代码片段组合起来,通过一个指令流程去执行,来达到我们最终的目的,那么如果我们通过ROP创建一块可写入可执行的内存区域,往里面写入我们自己的一些代码,但是这些代码是我们自己写入的,他是没有通过签名的,这个时候代码签名的作用就体现出来了,他是不会允许这块代码的执行,当然,我们可以只通过ROP把目标的一些代码片段连接起来,执行我们自己想要的一些功能。

영상

ASLR

  再来看一下地址空间布局随机化这个特性,也是为了避免ROP攻击。因为ROP攻击必须知道一个指定的地址才能拿到我们想要的代码片段,然后再来执行,那么地址空间的随机化,就是说在二进制文件、库文件、动态库文件和堆栈内存地址的位置都是随机的,我们把这些文件加载到内存中的时候,它加载的基地址每次都是变化的。我们可以通过这么一个命令image list -o -f来查看我们应用程序中加载的模块的基地址。

  下面我们来演示一下,这是我们编写的一个简单Demo,我们在程序执行的入口下一个断点:

영상

  然后,让程序跑起来。跑起来之后,他会断到这个断点上面,这个时候我们用刚才的命令是查看他加载的模块以及模块的地址。我们可以看到,现在这个可执行文件加载的基地址是ef9e000

영상

  我们再来运行一次,再通过的命令去查看他加载的模块,我们看到这个可执行文件加载的基地址变为2f1e000,所以说他每次在加载的时候,他的地址都是随机的。

영상

  通过刚刚的实验,我们看到我们的可执行程序,在加载的时候,他每次加载在内存中,他的基地址都是变化的。

加密和数据保护

  我们文件中的内容是通过文件密钥加密的,当然,文件密钥是通过类密钥加密,并且保存在文件元素之中。而文件原数据是通过文件系统密钥来加密的,那么此时如果我们要去读取一个文件的内容,只有硬件和密码密钥同时拥有,这个加密文件才能被解密。如果我们把加密的文件内容放到其他的硬件上面去解密,由于硬件密钥在每一个设备上面都是不一样的,所以它不能正确的解密出来。如果我们用户没有输入密码密钥,那么这个文件内容也不能解密出来。当然,这里我们看到一个文件系统密钥,这个文件系统密钥可以实现快速抹除的功能,我们只要删除了这个文件系统密钥,那么所有的文件都不能访问,所以就能快速入抹除设备的数据。

영상

总结

  • 安全启动的安全启动链,在系统启动的时候会保障我们启动的系统是受信任的;
  • 업데이트 후 시스템을 원래의 이전 버전으로 되돌릴 수 없도록 하는 시스템 소프트웨어 인증 메커니즘
  • 응용 프로그램 코드 서명, 실행 중인 모든 코드는 실행하려면 Apple에서 서명해야 합니다.
  • 런타임 시 보안은 주로 3가지 포인트를 포함합니다: 첫 번째는 샌드박스 메커니즘입니다.Apple은 샌드박스 메커니즘을 제공하여 애플리케이션을 샌드박스에서 실행할 수 있습니다. 또 하나는 데이터와 코드를 구분할 수 있는 데이터 실행 보호로, 코드가 실행될 때까지 데이터를 실행할 수 없습니다. 마지막으로 주소 공간 레이아웃은 무작위로 지정되며 프로그램이 로드될 때마다 기본 주소가 무작위로 변경됩니다.
  • Apple은 당사 애플리케이션의 데이터 보안을 보호하기 위해 데이터 암호화 보호 클래스를 제공합니다.

  iOS 시스템은 우리 애플리케이션의 보안을 보장하기 위해 많은 보안 보장을 제공하지만 여전히 많은 문제가 있습니다. 예를 들어, XcodeGhost의 이전 문제에서는 개발자가 타사 개발 도구를 사용하고 악성 코드가 타사 개발 도구에 내장되어 있기 때문에 애플리케이션을 작성할 때 악성 코드를 직접 애플리케이션에 작성했습니다. 또한 모든 코드가 서명 확인되고 시스템에서 실행되기 때문에 감지할 수 없습니다.

  타사 도구로 인한 피해 외에도 탈옥으로 iOS 시스템 자체의 보안을 파괴할 수도 있습니다. 탈옥 후에는 많은 iOS 시스템 권한이 손상되고 루트 권한으로 일부 응용 프로그램을 직접 실행할 수 있으므로 이러한 응용 프로그램이 시스템의 일부 파일을 마음대로 읽을 수 있습니다.

추천

출처juejin.im/post/7077942169016729607