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,结果被一锅端。

嗯,这一章的内容就到这。下一章咱们开始讲具体的逃逸手法,到时候你会感谢今天打下的基础。记住:不懂防御,就做不好攻击;不懂沙箱,就学不会逃逸。