2、沙箱架构基础:沙箱的隔离原理、系统调用拦截、资源限制机制、权限控制模型
聊沙箱逃逸之前,我觉得有必要先把沙箱本身拆开揉碎了讲清楚。很多朋友一上来就研究逃逸手法,结果连沙箱怎么隔离的都没搞明白——这就像连门锁结构都不清楚,就想学开锁,你说是不是有点悬?
我这些年做安全评估,见过太多因为基础不牢导致的翻车现场。所以这一章,咱们踏踏实实把沙箱的四个核心支柱过一遍:隔离原理、系统调用拦截、资源限制、权限控制。搞懂这些,后面讲逃逸你才能听得通透。
2.1 隔离原理:沙箱到底在隔离什么?
沙箱的核心目标就一个:让进程以为自己活在独立世界里,实际上它被关在笼子里。
隔离主要分三个层面:
- 文件系统隔离:进程只能看到特定目录,比如 /sandbox/xxx。我见过一个案例,攻击者通过符号链接绕过了这个隔离——嗯,后面逃逸章节会细讲。
- 网络隔离:限制进程能访问的IP和端口。有些沙箱直接砍掉网络,有些只允许特定协议。
- 进程/命名空间隔离:Linux下靠namespace实现,Windows下靠Job Object和AppContainer。
关键点:隔离不是绝对的。沙箱本质上是「软隔离」,依赖操作系统机制。一旦这些机制有漏洞,逃逸就发生了。
我个人习惯把隔离比作「监狱」:有围墙(文件系统隔离)、有狱警(系统调用拦截)、有放风时间限制(资源限制)、有分级管理(权限控制)。任何一个环节出问题,犯人就可能越狱。
2.2 系统调用拦截:沙箱的第一道防线
进程想干坏事,最终都得通过系统调用。比如打开文件用open(),创建进程用fork()/execve(),读写网络用socket()。沙箱就在这层做文章。
常见的拦截方式有三种:
| 方式 | 原理 | 性能开销 | 我踩过的坑 |
|---|---|---|---|
| ptrace 劫持 | 父进程跟踪子进程的syscall | 高 | 多线程下容易丢事件 |
| seccomp-bpf | 内核级过滤,白名单/黑名单模式 | 低 | 规则写错直接崩进程 |
| LSM (SELinux/AppArmor) | 内核安全模块,强制访问控制 | 中 | 配置复杂,容易漏规则 |
我最推荐的是seccomp-bpf。为什么?因为它在内核里跑,性能损耗极小,而且规则明确。我曾经在一个项目里用seccomp封掉了execve系统调用,结果业务方抱怨说他们的子进程创建不了——查了半天,原来是白名单漏了clone()。你看,细节决定成败。
避坑指南:写seccomp规则时,记得考虑32位和64位系统调用号不同。我曾经因为这个原因,让一个32位程序在64位沙箱里畅通无阻——嗯,那是个挺尴尬的复盘会。
2.3 资源限制机制:别让沙箱里的程序吃光主机
沙箱不仅要防恶意行为,还得防资源耗尽。你想想看,如果沙箱里的程序疯狂申请内存,把宿主机搞OOM了,那其他服务全得跟着遭殃。
资源限制主要管这几样:
- CPU:用cgroup限制CPU份额,或者直接绑核。我建议给沙箱进程设置CPU配额,别让它独占。
- 内存:设置硬上限和软上限。硬上限到了直接OOM kill,软上限可以触发告警。
- 磁盘:限制写入速度和总容量。我见过一个案例,沙箱里的程序疯狂写日志,把磁盘写满了——宿主机的监控系统都挂了。
- 进程数:限制fork出来的子进程数量。有些逃逸手法就是靠fork炸弹搞崩溃沙箱,然后趁乱跑出来。
注意:资源限制不是设了就完事。你得监控实际使用情况。我曾经遇到一个场景,cgroup配置了内存限制,但程序用了tmpfs绕过了——因为tmpfs不归cgroup管。嗯,后来我加了一条规则:禁止挂载tmpfs。
2.4 权限控制模型:最小权限原则的落地
沙箱里的程序应该拥有什么权限?答案是:能干活的最小权限。说白了,就是只给必需的,多一个都不给。
常见的权限控制模型:
- Capability 机制(Linux):把root权限拆成一个个小单元。比如CAP_NET_RAW允许原始套接字,CAP_SYS_ADMIN允许挂载文件系统。我一般只给CAP_NET_BIND_SERVICE和CAP_DAC_OVERRIDE,其他全砍掉。
- Windows Integrity Levels:分低、中、高、系统四个级别。沙箱进程跑在低完整性级别,写不了系统目录,改不了注册表。
- MAC(强制访问控制):SELinux或AppArmor,定义主体对客体的访问规则。配置起来确实麻烦,但效果最好。
我的经验:权限控制最容易出问题的地方是「过度授权」。很多开发者图省事,直接给CAP_SYS_ADMIN,结果沙箱形同虚设。记住:权限越小,逃逸越难。
举个例子。我之前审计过一个沙箱产品,它给进程加了CAP_NET_RAW,理由是「需要ping测试网络」。结果攻击者利用这个capability构造了原始套接字,直接伪造IP包逃逸出去了。你说冤不冤?其实完全可以用ICMP socket替代,根本不需要CAP_NET_RAW。
2.5 小结:四个支柱缺一不可
隔离原理、系统调用拦截、资源限制、权限控制——这四个东西就像桌子的四条腿。少一条,桌子就稳不住。我见过太多沙箱产品,隔离做得挺好,但系统调用拦截漏了某个关键syscall,结果被一锅端。
嗯,这一章的内容就到这。下一章咱们开始讲具体的逃逸手法,到时候你会感谢今天打下的基础。记住:不懂防御,就做不好攻击;不懂沙箱,就学不会逃逸。