1 基础知识
1.1 什么是沙盒?
在计算机安全领域,沙盒(英语:sandbox,又译为沙箱)是一种安全机制,为运行中的程序提供的隔离环境。通常是作为一些来源不可信、具破坏力或无法判定程序意图的程序提供实验之用[1]#cite_note-1)。
沙盒通常严格控制其中的程序所能访问的资源,比如,沙盒可以提供用后即回收的磁盘及内存空间。在沙盒中,网络访问、对真实系统的访问、对输入设备的读取通常被禁止或是严格限制。从这个角度来说,沙盒属于虚拟化的一种。
沙盒中的所有改动对操作系统不会造成任何损失。通常,这种技术被计算机技术人员广泛用于测试可能带毒的程序或是其他的恶意代码[2]#cite_note-2)。
— 维基百科,沙盒 (计算机安全)
这样一段话说的已经很清楚了,关于在OS X
系统中沙盒的简单应用,也有文章解释过了,这些不是本文的核心内容,有兴趣的读者可以自行google
。
在OS X
以及IOS
系统中限制了进程对一些资源的访问权限,例如网络、某些特殊路径、文件的读写等等,限定了进程的一些行为,从而保证进程不会做出超越权限的操作。
沙盒听上去的感觉是一个进程在一个有保护的环境中执行,不会做出规定范围内不允许的事情,给人的感觉可能是这样的:
这样的理解对应用开发来说已经够用了,通过理解沙盒的内部实现,发现沙盒的实质其实更像是这样的:
而在OS X
中沙盒也被称作seatbelt
。APP
的一举一动都被TrustedBSD
的HOOK
组件监控,根据沙盒使用的profile
中的配置做出相应的处理。
下面 就通过简单的分析沙盒的工作流程,详细了解沙盒的工作原理。
1.2 沙盒工作流程与相关系统组件
沙盒的大致工作流程入下图所示:
1
进程尝试进行一次系统调用(system call),调用内核功能。2、3
MAC层需要根据该进程的安全策略判断此次系统调用是否可以执行。4、5、6、7、8、9
如果存在策略的话,通过sandbox.kext
(hook函数)和AppleMatch.kext
(沙盒的profile解析)两个内核扩展实现权限的检查。10
返回调用结果
与沙盒系统相关的模块大致如下:
- libSystem.dylib: 提供
sandbox_init
、sandbox_free_error
等函数。 - libSandbox.dylib: 提供解析,编译,生成
*.sb
的沙盒profile
的函数。 - sandbox.kext:提供了system call的hook函数
- AppleMatch.kext:提供了解析
profile
的函数
结构图大致如下:
1.3 小结
沙盒的工作流程大致可以总结为:
通过
sandbox_init
初始化某沙盒策略脚本并编译为二进制文件在进程进行
system call
时,通过TrustedBSD
提供的hook
模块,利用Sandbox.kext
提供的system call hook
函数,结合沙盒策略进行判断,该进程是否有权限执行该system call
。
通过对这些基础知识的了解,可以进入对沙盒的进一步研究了,在下一章通过逆向以及部分源码,从代码实现的层面进行更深一层次的分析。