0x00 内容简介
子贡问为仁。子曰:“工欲善其事,必先利其器。居是邦也,事其大夫之贤者,友其士之仁者。”
—《论语·卫灵公》
在开始研究OSX内核以及与OSX相关知识之前,需要对OSX有一个比较全面的认识,将一些简单的概念搞清楚。
0x01 OS X 体系结构
1.1 OS X系统的整体体系结构
- 用户体验( The User Experience layer ):为了研究内核做准备,赞不关心。
- 应用软件开发框架(The Application Frameworks layer):Cocoa, Carbon, Java这些开发的API与运行时。
- 核心开发框架(The Core Frameworks):图形和多媒体一类软件的开发环境。
- Darwin:系统内核。
google了其他一些文章,分层也是基本差不多,可以参考此图:
1.2 Darwin体系结构
主要关心的其实还是Darwin这个模块,他的体系结构大致如下图所示:
这个图暂时看不懂也没关系,需要做到的知识储备有以下几点:
- Darwin是苹果系统的一部分。
- Darwin是一种类似unix的操作系统,他的核心是XNU。
- XNU是一种混合式内核。结合了mach与BSD两种内核。
1.3 XNU的简单概括
有以下4个主要的功能模块:
Mach微内核
BSD内核
libKern
I/O Kit
1.3.1 Mach微内核简介
Mach是作为传统UNIX内核的替代品出现的,因此其间的不同之处值得留意。当时的人们已渐渐感受到了早期UNIX中“一切皆文件”的抽象机制的不足,有限的扩展性使得开发者捉襟掣肘,苦不堪言。虽说贝尔实验室的Plan9在此方向上做了进一步努力,可是效果并不理想。现代操作系统需要更进一步的抽象[1]。
在XNU中主要完成以下几个功能:
- 进程与线程的抽象
- 虚拟内存管理
- 任务调度
- 进程间通信
1.3.2 BSD内核简介
BSD的实现在Mach的上层,这一层提供了一些流行的API,支持了POSIX。在XNU中主要实现了一些高级的API与模块。
- UNIX进程模型
- POSIX线程模型即pthread。以及相关的同步功能。
- UNIX的用户与组管理
- 网络栈(BSD Socket API)
- 文件系统
- 设备系统
1.3.3 libKern
libKern实现了一个C++的子集,为I/O kit 提供C++的实现。
1.3.4 I/O kit
I/O Kit 是XNU不同于其他传统系统的设备驱动框架。
IOKit是一个面向对象的驱动模型框架,它是早期DriverKit的一个翻版,Driver Kit是使用Objective-C写的,而IOKit是一个C++的驱动架构,它在DriverKit的基础上做了很大的改进,比如IOKit可以写在用户空间跑的驱动(虽然大多仍是跑在内核空间上的),因而驱动挂了而系统不会挂。另外IOKit考虑到了计算机发展的趋势,所以在电源管理、即插即用、动态加载上做得更好[2]。
1.4 APPs的文件结构
每一个应用程序都是这样一个大致类似的文件结构。
1.4.1 Info.plist
为了提供更好的用户体验,IOS 和 OS X的每个app或bundle都依赖于特殊的元信息(meta Information).
- 直接向用户展示信息
- 系统内部用来标识你的app或其支持的文档类型
系统框架用来辅助app的加载
每个application都使用Info.plist文件来存储以上的元信息,从名称上也可以判断出Info.plist就是以上提到的“属性列表”[3]。
1.4.2 Resources
就是APP需要的资源。与我们研究内容关系不大不多关注。
1.4.3 MacOS
这里存放的就是可执行文件。
0x02 OS X使用的安全机制
2.1 代码签名
肤浅的理解就是确认APP是通过了苹果审核的,可以认为是没有恶意的。
摘录了一段比较详细的描述:
作为一个 iOS 开发者,在你开发使用的机器上应该已经有一个证书,一个公钥,以及一个私钥。这些是代码签名机制的核心。像 SSL 一样,代码签名也依赖于采用 X.509 标准的公开密钥加密。
在 OS X 上一个应用是否允许被开启是由 Gatekeeper 的选项决定的,你可以在系统设置的安全选项中改变选项。在 Gatekeeper 选项中选择 “受信任的开发者或者来自 Mac App Store” 会要求被打开的应用必须被证书签名,可以是 Mac App Store 开发者的应用发布证书也可以是开发者 ID 证书。这些选项是由一个系统工具 spctl 来管理的,它管理着系统的所有安全评估策略。
在 iOS 上规则是不一样的,无论是用户还是开发者都不能改变应用开启策略,你必须有一个开发者帐号或者应用发布证书才能让应用运行在 iOS 系统上[4]。
2.2 强制访问控制 (Mandatory Access Control)
FreeBSD 5.x最早引入,是OS X隔离机制(Sandboxing,沙盒机制)
和iOS的entitlement机制
基础。
强制访问控制(Mandatory Access Control——MAC),用于将系统中的信息分密级和类进行管理,以保证每个用户只能访问到那些被标明可以由他访问的信息的一种访问约束机制。通俗的来说,在强制访问控制下,用户(或其他主体)与文件(或其他客体)都被标记了固定的安全属性(如安全级、访问权限等),在每次访问发生时,系统检测安全属性以便确定一个用户是否有权访问该文件。
2.3 沙盒(sandbox)
沙盒是一种安全机制,为运行中的程序提供了一个隔离的环境。OS X的沙盒在启动的时候可以设置运行的程序是否可以访问网络、文件、目录等。
图片摘自这里[5]。
参考
[1].Mach — https://zh.wikipedia.org/wiki/Mach
[2].OSX系统编程环境的介绍 — http://www.tanhao.me/talk/440.html/
[3].IOS之Info.plist文件简介 — http://my.oschina.net/hmj/blog/104196
[4]代码签名探析 — http://http://objccn.io/issue-17-2/
[5]《深入解析Mac OS X & iOS操作系统》读书笔记 —http://blog.okeyang.com/blog/2015/07/24/shen-ru-jie-xi-mac-os-x-and-ioscao-zuo-xi-tong--du-shu-bi-ji/