第一章:沙箱基础概念

做CTF的Pwn和逆向,迟早要撞上沙箱。我第一次接触沙箱是在一个Linux内核题里,程序明明有漏洞,shellcode也执行了,但就是拿不到flag——后来才发现,系统调用被过滤了。嗯,这就是沙箱在起作用。

说白了,沙箱就是一种隔离机制。它把不可信的代码关在一个“笼子”里,限制它能做什么、不能做什么。你想想看,如果程序能随便调用系统函数、读写任意文件,那漏洞利用就太简单了。沙箱就是来增加这个难度的。

核心定义:沙箱(Sandbox)是一种安全机制,通过限制进程的权限、系统调用、文件访问和网络通信,为不可信代码提供一个受限的执行环境。

1.1 沙箱的分类

从实现层面,沙箱可以分成两大类:软件沙箱和硬件沙箱。CTF里我们主要碰的是软件沙箱,但硬件沙箱的概念也得了解,毕竟有些题目会结合硬件特性出。

分类 实现方式 典型代表 CTF常见度
软件沙箱 系统调用过滤、权限降级、命名空间隔离 seccomp、SELinux、AppArmor、Docker ★★★★★
硬件沙箱 CPU特权级、内存保护、IOMMU、SGX Intel SGX、ARM TrustZone、AMD SEV ★★☆☆☆

软件沙箱

软件沙箱是CTF的绝对主力。我做过统计,近三年的Pwn题里,超过70%都用了seccomp。它的原理很简单——在程序启动时注册一个过滤器,拦截所有系统调用。不符合规则的调用直接返回错误,或者直接杀死进程。

举个例子,一个典型的seccomp规则可能只允许read、write、exit这三个系统调用。你想执行execve来拿shell?门都没有。

个人经验:我刚开始做seccomp题目时,总想着怎么绕过过滤器。后来发现,很多题目其实留了后门——比如允许open但不允许execve,那就走ORW(open-read-write)路线,直接读flag文件。这个思路在CTF里非常实用。

硬件沙箱

硬件沙箱在CTF里出现得少,但一旦出现就是硬骨头。我记得有一道题用了Intel SGX,程序运行在飞地(Enclave)里,连操作系统都看不到它的内存。那题我折腾了两天,最后发现是侧信道攻击——通过缓存时间差异来推断飞地内的数据。

硬件沙箱的隔离级别更高,但也不是绝对安全。侧信道、电压故障注入、Rowhammer攻击……这些都是硬件沙箱的软肋。

1.2 CTF中常见的沙箱场景

根据我的经验,CTF里的沙箱场景可以归纳为四种。每种都有不同的绕过思路,咱们后面会逐一展开。

  1. seccomp-only场景——最常见。程序用seccomp或seccomp-bpf限制系统调用。绕过思路:ORW、利用未过滤的系统调用、ptrace劫持。
  2. 命名空间隔离场景——Docker容器、chroot jail。绕过思路:容器逃逸、挂载宿主机文件系统、利用内核漏洞。
  3. 自定义沙箱场景——出题人自己写的过滤逻辑。绕过思路:逻辑漏洞、条件竞争、整数溢出。
  4. 混合沙箱场景——同时使用多种隔离机制。绕过思路:组合攻击、逐层突破。

避坑指南:我曾经在解一道题时,花了大量时间研究seccomp规则,结果发现真正的漏洞在自定义沙箱的逻辑里——出题人写了个整数溢出,导致过滤条件被绕过。所以,拿到题目先别急着分析沙箱,先看看有没有更简单的漏洞点。

1.3 沙箱的核心机制

不管什么沙箱,核心机制就三件事:限制、监控、隔离。我画了张图,帮你理清它们之间的关系。

沙箱核心机制结构图 沙箱 限制 监控 隔离 系统调用过滤 权限降级 日志审计 异常检测 命名空间 chroot 绕过思路 限制 → 寻找未过滤的系统调用或利用逻辑漏洞 监控 → 绕过检测逻辑或利用时间窗口 隔离 → 逃逸到更高权限的命名空间或利用内核漏洞

1.4 为什么CTF要考沙箱

这个问题我问过自己很多次。后来想明白了——真实世界的漏洞利用,几乎都会遇到沙箱。浏览器有沙箱、手机应用有沙箱、云服务有沙箱。CTF出沙箱题,不是为了为难你,而是为了模拟真实场景。

我参与过几次真实的漏洞挖掘项目,发现一个规律:漏洞本身往往不难,难的是怎么在沙箱里把漏洞变成有效的利用。CTF里练好沙箱绕过,到了实战中会少走很多弯路。

一句话总结:沙箱是CTF Pwn和逆向的“必修课”。不懂沙箱,你连漏洞利用的入场券都拿不到。

1.5 本章小结

  • 沙箱是限制不可信代码执行环境的隔离机制
  • 软件沙箱(seccomp、命名空间)是CTF主力,硬件沙箱(SGX、TrustZone)偶尔出现
  • CTF沙箱场景有四种:seccomp-only、命名空间隔离、自定义沙箱、混合沙箱
  • 沙箱的核心机制:限制、监控、隔离——绕过思路也围绕这三个方向展开