想象你是一艘豪华邮轮的船长。船上新来了一位才华横溢的 AI 编程顾问——它写代码又快又好,但毕竟是外聘的临时工,你不敢让它进船长室翻航海图、不敢让它碰乘客名单、更不敢让它乱按引擎按钮。你会怎么做?给它一间独立的密室:窗户换成防弹玻璃,桌上只放干活要用的纸笔和计算器,所有对外信件都要先给审查员过目,墙角的监控探头 24 小时亮着红灯。如果它想撬锁逃跑,警报立刻响彻全船。这就是“安全沙箱执行”在现实中的样子:给 AI 的代码一个封闭的“密室工作间”,让它能完成使命,却碰不到、改不了、带不走任何不该碰的东西。本文会用这艘邮轮的比喻,带你走完沙箱的设计、隔离、限制、配额、检测与选型全过程。

岗位关联

学会安全沙箱执行,你就能安全地让 AI 生成并运行代码,避免 AI 应用被恶意代码攻破——这是 AI 应用开发工程师的必备护城河。

目录
  1. 可视化演示
  2. 沙箱环境设计
  3. 进程级隔离
  4. 容器级隔离
  5. 文件与网络限制
  6. 资源配额管理
  7. 逃逸检测加固
  8. 方案对比选型
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

通过隔离架构、资源配额和逃逸检测三个维度,展示AI安全沙箱执行的隔离机制、资源限制与安全监控防护体系。

本节配有交互动效(进入视口后自动加载,约 3KB)。

沙箱隔离架构 沙箱边界隔离AI代码与宿主系统,阻断越权访问 进程/容器/命名空间三层隔离,容器间互相独立 sandbox = namespace + cgroup + seccomp 多层隔离确保AI代码在受限环境中执行,无法影响宿主

沙箱环境设计

船长在规划密室时,脑子里只有三件事:让顾问碰不到不该碰的东西、用不完不该用的资源、逃不出这间屋子。套用到技术上,沙箱执行环境的设计也只回答三个问题:隔离什么、限制什么、监控什么。AI 代码有一个和人类员工完全不同的特点——你没法提前预知它会写出什么。它可能只是算一道数学题,也可能悄悄打开 socket 把船上的乘客名单发出去。因此沙箱的默认姿态永远是“不信任”。

从邮轮回到服务器:我们面对的 AI 代码本质上是一段不可信程序。沙箱的核心设计思想是最小权限原则——只给代码完成当前任务恰好需要的权限,多一分都不给。安全边界模型则画出“信任区”和“非信任区”:宿主机内核、其他服务是信任区;AI 代码及其子进程是非信任区,两者之间由沙箱边界隔开。现实中我们通常组合进程级、容器级、系统调用级三层隔离,一层挡不住就再来一层。

用数学语言描述最小权限原则非常优雅:沙箱最终授予的权限集合,等于系统原始全部权限与任务必需权限的交集。

回到邮轮上,这就像密室里只放纸笔和计算器,绝不放航海图原件和印章。设计沙箱时,先列“必须给什么”,再列“绝对不能给什么”,把交集画清楚,边界就立住了。

Psandbox=Porigin∩PtaskP_{sandbox} = P_{origin} \cap P_{task}
沙箱授予的权限 = 系统原始权限 ∩ 任务必需权限。两者重叠的部分才放行,天生保证“不多给”。
  1. 原始特权集合$P_{origin}$ 表示一段代码原本可能拥有的全部权限,比如读写任意文件、监听端口、直接操作硬件设备等。
    Porigin={p1,p2,…,pn}P_{origin} = \{p_1, p_2, \dots, p_n\}
  2. 任务必需子集$P_{task}$ 是 AI 代码完成当前任务真正需要的权限,例如只读某个数据目录、只允许输出到 stdout。
    Ptask⊆PoriginP_{task} \subseteq P_{origin}
  3. 交集取权最终的 $P_{sandbox}$ 是两个集合的交集,交集之外的权限一律不授予,这就是最小权限的数学表达。
    Psandbox=Porigin∩PtaskP_{sandbox} = P_{origin} \cap P_{task}

进程级隔离

顾问不能亲自操作船舵,他的助手也必须待在小隔间里。进程级隔离就是给 AI 代码安排一个独立小隔间——一个专属进程,并为这个进程套上紧箍咒。紧箍咒的第一道就是系统调用过滤。程序在操作系统里做任何事,都要通过系统调用申请;只要在门口设一道安检,把危险动作挡在门外,程序就“有劲使不出”。

系统调用过滤的经典实现是 Linux 的 seccomp(安全计算模式)。你可以配置一个白名单,只放行 read、write、exit 这类人畜无害的调用,而把 socket、execve、mount 全部拦截。第二道是虚拟内存隔离:每个进程拥有独立的地址空间,AI 代码无论怎么乱写指针,都只能在自己的“隔间”里打转,碰不到宿主机其他进程的内存。第三道是权限降级:让沙箱进程以 nobody 这种低权限用户运行,就算它找到了系统漏洞,也没有足够权限造成大破坏。

把这道安检写成公式,就是“只保留策略判定为允许的系统调用”:

小隔间的门锁、单间记忆、普通员工工牌——进程级隔离把这三样配齐,AI 代码就像被关在独立工位上的临时工,能打字,但抽屉里没有公司印章。

Sallow={s∈Sall∣policy(s)=1}S_{allow} = \{s \in S_{all} \mid \text{policy}(s) = 1\}
允许执行的系统调用集合,是从全部系统调用中筛选出 policy 判定为 1 的那部分。policy 就是你的安检规则。
  1. 全部调用集合$S_{all}$ 是内核提供的所有系统调用,数量有几百个,包括文件、网络、进程、设备等类型。
    Sall={read,write,socket,execve,mount,… }S_{all} = \{read, write, socket, execve, mount, \dots\}
  2. 策略判定函数$\text{policy}(s)$ 是沙箱定义的规则,输入一个系统调用,输出 1 表示放行、0 表示拒绝。
    policy(s)∈{0,1}\text{policy}(s) \in \{0, 1\}
  3. 筛选允许集只有通过策略判定的调用才会进入 $S_{allow}$,其余全部被拦在门外。
    Sallow⊆SallS_{allow} \subseteq S_{all}

容器级隔离

如果把进程级隔离比作给临时工的工位装上挡板,那容器级隔离就是给他一间独立客房:门一关,自成天地。容器是操作系统层面的虚拟化技术,主要通过两大内核机制实现:Namespace 负责“看不见”——让容器里的进程以为自己是全世界的唯一主人;Cgroups 负责“用不完”——限制它能吃多少 CPU 和内存。

Namespace 一共管六件事:进程 PID、文件挂载点、网络栈、进程间通信、主机名、用户 ID。容器里的进程看到的是独立世界:自己的 PID 1、自己的网络接口、自己的文件系统视图。与此同时,Cgroups 把资源按住:你最多用 0.5 个 CPU 核心、最多 256MB 内存。镜像精简和只读根文件系统则进一步压缩攻击面——镜像里只装运行所需的库,根目录设为只读,AI 代码想往根目录写文件?门都没有。

六个命名空间集齐,才能召唤一个完整的容器隔离世界:

客房虽好,但别忘了邮轮常识:客房和船长室共用船体结构。容器与宿主机共享同一个内核,这既是它轻量的原因,也是它不够安全的软肋——这正是后续要讲的“逃逸检测”存在的理由。

Nct={Npid,Nmnt,Nnet,Nipc,Nuts,Nuser}N_{ct} = \{N_{\text{pid}}, N_{\text{mnt}}, N_{\text{net}}, N_{\text{ipc}}, N_{\text{uts}}, N_{\text{user}}\}
容器隔离 = PID 隔离、挂载点隔离、网络隔离、IPC 隔离、主机名隔离、用户隔离,六者合一才构成完整的“客房”。
  1. PID 与挂载$N_{\text{pid}}$ 让容器内进程看不到宿主机的其他进程;$N_{\text{mnt}}$ 让容器拥有独立的文件系统挂载视图。
    Npid:只见自己Nmnt:各自挂载N_{\text{pid}}: \text{只见自己} \quad N_{\text{mnt}}: \text{各自挂载}
  2. 网络与通信$N_{\text{net}}$ 给容器独立的网络栈和 IP;$N_{\text{ipc}}$ 隔离进程间通信的队列和信号量。
    Nnet:独立 IPNipc:消息隔离N_{\text{net}}: \text{独立 IP} \quad N_{\text{ipc}}: \text{消息隔离}
  3. 主机名与用户$N_{\text{uts}}$ 隔离主机名;$N_{\text{user}}$ 让容器内的 root 在宿主机看来只是个普通用户。
    Nuts:各起其名Nuser:伪 rootN_{\text{uts}}: \text{各起其名} \quad N_{\text{user}}: \text{伪 root}

文件与网络限制

密室里的书架是固定的,顾问只能从指定书架上取书;密室的信件也要先交给审查员。文件与网络限制做的是同一件事:把 AI 代码和外界的数据通道逐个拧紧。文件系统方面,根文件系统设为只读,可写区域只有一个随机命名的临时目录;网络方面,默认策略是“禁一切网络”,如果任务确实需要联网,也要经过白名单代理转发,目标域名和端口全部受限。

很多人忽略的一个细节是环境变量清理。环境变量里往往藏着 API Key、数据库密码,AI 代码只需要一条 print(os.environ) 就能把全船乘客名单背出去。所以沙箱启动时要清空或白名单化环境变量。临时目录映射则专门解决 AI 代码“想存中间结果”的需求:给一个仅属于自己的 /tmp 小抽屉,容量和可写时长都受控,任务结束立刻销毁。

一次文件访问是否被允许,本质上是一个二元判定:

这就像书架上每一本书都盖了章,每封信都要过目。审查员的铁律是:没有盖章的书,一页都不能看;没有写清收件人的信,一封都不能寄。

Access(f,op)={1f∈Fok∧op∈Ook0otherwiseAccess(f, op) = \begin{cases} 1 & f \in F_{ok} \land op \in O_{ok} \\ 0 & \text{otherwise} \end{cases}
对文件 f 执行操作 op 是否放行:只有文件在允许列表、操作也在允许列表时才返回 1,其余全部返回 0。默认拒绝,白名单放行。
  1. 允许文件集$F_{ok}$ 是沙箱允许访问的文件路径集合,比如只读的 /data 和可写的 /tmp/sandbox-xxx。
    Fok={/data,/tmp/随机目录}F_{ok} = \{/data, /tmp/随机目录\}
  2. 允许操作集$O_{ok}$ 是允许的操作类型,比如 read、write,但绝不允许 mknod、chown 这种可改设备权限的操作。
    Ook={read,write}O_{ok} = \{read, write\}
  3. 交集判定文件必须属于 $F_{ok}$ 且操作属于 $O_{ok}$ 才放行,任一条件不满足就返回 0。
    f∈Fok∧op∈Ookf \in F_{ok} \land op \in O_{ok}

资源配额管理

邮轮上的食水是配给的:顾问一天三顿饭、十度电,多了不供。资源配额管理的目标一模一样——防止 AI 代码把宿主机资源吃干抹净。现实中最常见的场景是:给 AI 一段“计算 π 到小数点后一亿位”的代码,它立刻把所有 CPU 核占满;或者代码里出现 while True: 开新进程,瞬间 fork 出上千个进程把船压垮。这些不是恶意攻击,只是失控,但伤害和攻击一样大。

资源配额的四根支柱是:CPU 时间配额(最多用几核、用几秒)、内存上限(超过即触发 OOM Killer 直接杀掉进程)、磁盘配额(可写目录最大多少 MB)、进程数与文件描述符限制(最多开几个子进程、开几个文件句柄)。配额不是拍脑袋定的,而是根据 AI 任务的历史资源画像动态配置:正常任务用 256MB 内存,就配 512MB 上限,留出余量又不给浪费空间。

当内存用量越过红线时,沙箱必须冷酷地执行“击杀”决策:

配给制的冷酷背后是公平:AI 代码可以放开手脚算题,但绝不能因为它的一时贪婪,让全船乘客断电断水。

OOM=1[Mused>Llimit∨Cused>Climit]OOM = \mathbf{1}\bigl[M_{used} > L_{limit} \lor C_{used} > C_{limit}\bigr]
OOM 判定 = 内存用量超限或 CPU 用量超限时取值为 1,触发沙箱的强制终止动作。这不是惩罚,是保护整艘船。
  1. 内存超限判定$M_{used}$ 是当前进程组内存占用,$L_{limit}$ 是配额上限,前者大于后者时该条件为真。
    Mused>LlimitM_{used} > L_{limit}
  2. CPU 超限判定$C_{used}$ 是累计消耗的 CPU 时间,$C_{limit}$ 是 CPU 配额上限,防止死循环或挖矿程序无限燃烧。
    Cused>ClimitC_{used} > C_{limit}
  3. 击杀信号$\mathbf{1}[\cdot]$ 是指标函数,方括号内任一条件为真就返回 1,沙箱收到 1 后立即强制终止任务。
    1[A∨B]={1A 或 B 为真0否则\mathbf{1}[A \lor B] = \begin{cases} 1 & A \text{ 或 } B \text{ 为真} \\ 0 & \text{否则} \end{cases}

逃逸检测加固

再坚固的保险库也不敢说自己绝对安全。邮轮上的监控探头和警报器,对应的是沙箱的逃逸检测与加固。安全界有一条铁律:不要问“沙箱会不会被攻破”,要问“被攻破后多久能发现”。AI 代码可能会利用内核漏洞把容器隔离击穿,从而碰到宿主机文件——这叫沙箱逃逸。防御方必须假设逃逸可能发生,并做好监控、告警、止损。

检测手段主要有三类:异常行为监控——记录系统调用序列,AI 代码突然调用了一串从未出现过的操作,立刻报警;黑白名单告警——命中黑名单(如尝试 mount、加载内核模块)直接中断任务;纵深防御体系——进程沙箱套容器、容器外再套网络隔离和入侵检测,一层被突破还有第二层。此外还要及时给宿主机内核打补丁,因为绝大多数逃逸都依赖内核漏洞。

把这些检测信号汇总成一个可量化的风险分,是工程上最务实的做法:

警报器不会阻止小偷撬锁,但它能让小偷知道:撬锁的声响,全船都会听见。监控、告警、阻断环环相扣,才是沙箱真正的底气。

Score=∑k=1nwk⋅1k,alert if Score>θScore = \sum_{k=1}^{n} w_k \cdot \mathbf{1}_k, \quad \text{alert if } Score > \theta
风险分 = 各检测项加权求和,超过阈值 θ 就触发告警。每个检测项像一个传感器,权重代表它有多重要。
  1. 传感器信号$\mathbf{1}_k$ 是第 k 个检测项的触发标志,比如“尝试访问 /etc/shadow”触发就为 1,没触发为 0。
    1k∈{0,1}\mathbf{1}_k \in \{0, 1\}
  2. 加权求和$w_k$ 是每个检测项的权重,危险行为权重高,可疑行为权重低,求和得到总风险分。
    Score=∑k=1nwk⋅1kScore = \sum_{k=1}^{n} w_k \cdot \mathbf{1}_k
  3. 阈值告警$\theta$ 是预设阈值,风险分超过它,系统自动隔离进程、冻结任务并通知安全人员。
    Score>θ⇒alertScore > \theta \Rightarrow \text{alert}

方案对比选型

不同客人配不同房间:普通乘客住标准间,贵宾住套房,绝密文件则锁进金库。沙箱方案选型同样要按任务的安全等级来定。四个主流方案各有性格:Docker 胜在生态成熟,适合中等安全需求的常规任务;Firecracker 是微虚拟机,轻量且隔离强,适合多租户场景;gVisor 在用户态拦截系统调用,相当于给每个容器配了贴身保镖;自研库形态(如 WASM 沙箱、语言级隔离)最轻,但隔离能力有限,适合低风险计算。

选型没有银弹,只有权衡。你需要先列出自己关心的维度:隔离强度、性能损耗、启动速度、运维成本,然后给每个维度打权重。比如高并发代码执行服务,启动速度权重高,选 Firecracker 或 gVisor;内部数据处理,隔离强度最重要,选 Docker 套 seccomp;给 AI 写的小工具,自研 WASM 沙箱就够用。

把选型变成明确的数学问题,就是加权打分取最高分:

金库级别越高,造价和通行效率就越低。选型的智慧不是选“最安全”的,而是选“刚刚好”的——让安全等级与业务价值匹配,才是邮轮运营的老船长之道。

Vbest=max⁡s∈Solutions∑j=1mwj⋅vs,jV_{best} = \max_{s \in Solutions} \sum_{j=1}^{m} w_j \cdot v_{s,j}
最优方案 = 在所有备选方案中,对每个方案按各维度得分与权重加权求和,得分最高者胜出。
  1. 方案得分矩阵$v_{s,j}$ 是方案 s 在维度 j 上的得分,比如 gVisor 在隔离强度得 9 分,在启动速度得 6 分。
    vs,j∈[0,10]v_{s,j} \in [0, 10]
  2. 权重向量$w_j$ 是第 j 个维度的权重,所有维度权重之和为 1,代表你对各维度的重视程度。
    ∑j=1mwj=1\sum_{j=1}^{m} w_j = 1
  3. 取最大值$\max_{s}$ 遍历所有方案,算出每个方案的加权总分,选分数最高的那个。
    Vbest=max⁡{ScoreDocker,ScoreFirecracker,ScoregVisor,ScoreWASM}V_{best} = \max \{Score_{Docker}, Score_{Firecracker}, Score_{gVisor}, Score_{WASM}\}

AI 应用场景

AI 编程助手的代码执行器

阶段:模型推理后的工具调用与代码执行

解决的问题:AI 编程助手(如智能 IDE 插件)会生成并运行 Python 代码。如果这段代码直接跑在用户电脑上,一旦模型被提示词注入诱导生成恶意代码,用户的文件、密钥、网络全部暴露。沙箱让 AI 代码在一个隔离的容器里执行,销毁后不留痕迹。

具体案例:某 AI 代码助手收到用户指令“运行这段脚本计算数据”。后台将脚本放入临时容器,只挂载用户选中的数据文件,禁网、限时 10 秒、限内存 512MB。脚本执行完只输出结果文本,任何试图访问用户主目录的操作都被 seccomp 拦截。

多智能体 Agent 的工具调用沙箱

阶段:Agent 决策后的工具执行

解决的问题:多智能体系统中的 Agent 需要调用浏览器、Shell、文件系统等外部工具,但工具即权力——给 Agent 直接开 Shell 等于把船钥匙交给临时工。通过沙箱统一封装工具执行层,所有工具调用都走受限环境。

具体案例:一个负责市场调研的 Agent 需要搜索网页。沙箱为其启动无头浏览器容器,网络出口走代理白名单,只允许访问指定搜索域名;下载的每个文件先进病毒扫描区;Agent 的每次 Shell 命令都被记录并做异常检测。

数据管道中的不可信文件解析

阶段:数据预处理与特征提取

解决的问题:AI 数据管道经常要解析来自外部的不可信文件(PDF、图片、压缩包),解析库本身可能存在漏洞。若解析过程不隔离,恶意文件可能直接攻破数据服务。将解析任务放进轻量沙箱,即使解析器被攻破,攻击者也只是困在沙箱里。

具体案例:某 AI 简历筛选系统接收求职者上传的 PDF。系统先把 PDF 交给 Firecracker 微虚拟机解析成纯文本,微虚拟机只有 128MB 内存、无网络权限,解析完成立即销毁。有一次攻击者利用 PDF 解析器漏洞尝试写文件,被只读根文件系统挡住,任务自动终止。

Python 演示

python43 行
class SyscallSandbox:    def __init__(self, allowed, mem_limit_mb=64):        self._allowed = set(allowed)        self._mem_limit = mem_limit_mb        self._mem_used = 0        self._call_count = 0     def check_syscall(self, name):        self._call_count += 1        if name in self._allowed:            return (True, "allow")        return (False, "deny")     def allocate_mem(self, mb):        if self._mem_used + mb > self._mem_limit:            raise MemoryError("OOM: over memory limit")        self._mem_used += mb        return self._mem_used     def run_program(self, program):        for syscall, size in program:            ok, action = self.check_syscall(syscall)            print("[%s] %s" % (action, syscall))            if syscall == "mmap" and ok:                self.allocate_mem(size)        return self._mem_used  if __name__ == "__main__":    sandbox = SyscallSandbox(allowed={"read", "write", "mmap", "exit"}, mem_limit_mb=64)    program = [        ("read", 0),        ("mmap", 20),        ("socket", 0),        ("write", 0),        ("mmap", 50),        ("exit", 0),    ]    try:        final_mem = sandbox.run_program(program)        print("finish OK, memory used:", final_mem)    except MemoryError as e:        print("sandbox killed:", e)
目的:用纯 Python 模拟一个最小沙箱,演示系统调用白名单过滤与内存配额(OOM 击杀)两个核心机制。
  1. class SyscallSandbox定义一个沙箱类,内部维护允许的系统调用集合和内存配额。
  2. self._allowed = set(allowed)用集合存储白名单,查询复杂度为 O(1),也便于去重。
  3. check_syscall(name)模拟 seccomp 的系统调用安检:在白名单返回 allow,否则返回 deny。
  4. allocate_mem(mb)模拟内存分配,超过 self._mem_limit 就抛出 MemoryError,对应 OOM Killer。
  5. ("mmap", 20)程序中的 mmap 调用会触发内存分配,20 表示申请 20MB。
  6. ("socket", 0)socket 不在白名单中,被沙箱拒绝,对应默认禁网策略。
  7. try...except MemoryError沙箱捕获内存超限异常后强制终止任务,输出 "sandbox killed"。

常见误区

误区很多初学者以为把 AI 代码放进 Docker 容器就安全了,因为容器提供了“隔离环境”。他们会说:“容器里的进程看不到宿主机,这不就是沙箱吗?”

正解容器是资源共享与打包工具,不是严格意义上的安全边界。容器与宿主机共享同一个内核,一旦 AI 代码利用内核漏洞(如 CVE-2022 系列脏管道漏洞),就能从容器内逃逸到宿主机。生产环境中必须在容器上叠加 seccomp、只读根文件、capabilities 裁剪、资源限制,容器才勉强算“沙箱”。

为何常见:Docker 官方文案强调“隔离”,让人误以为隔离等同于安全;而“逃逸”这个概念,对没做过安全的人来说确实很反直觉。

误区有人觉得“既然怕数据泄露,那把沙箱的网络完全禁掉不就行了?”于是把所有注意力放在网络隔离上,忽略了文件和进程层面的风险。

正解断网只是堵住了外传通道,但文件系统、内存、环境变量里可能本来就躺着敏感数据。若沙箱根目录可写、AI 代码能读取宿主机挂载的密钥文件,就算没网络,数据也被读了。真正安全的做法是三层同时堵:只读文件系统、白名单环境变量、默认禁网,缺一不可。

为何常见:网络是现代人最直观的“出口”,人们本能地以为关掉出口就安全了,却忘了“内鬼”本身就在屋里。

误区开发 AI 代码执行功能时,为了方便,把几十个系统调用全部加进白名单,觉得“反正都是合法调用,多放行几个无妨”。

正解每多放行一个系统调用,就多一个攻击面。比如放行 ptrace,恶意代码就能调试其他进程;放行 mount,可能挂载敏感目录。正确做法是从最少权限开始,按任务需求逐步“挤牙膏”式放行,并且每个白名单项都要过安全评审。

为何常见:工程师思维天然倾向“不要限制功能,避免误伤”,但安全思维恰恰相反:默认拒绝,按需放行。两种思维的冲突是这类误区频发的根源。

误区有人认为沙箱只要配好 CPU 和内存上限就够了,“程序跑不动自然不会造成危害”。于是没有日志、没有监控、没有告警。

正解资源限制只能防“失控”,不能防“入侵”。恶意代码可以在配额内悄悄遍历文件、尝试提权、一步步探测漏洞。如果缺乏行为监控,攻击完成也可能无人察觉。纵深防御要求:资源配额是“刹车”,行为检测是“行车记录仪”,两者配合才能真正定位和止损。

为何常见:资源配额配置起来简单直观,能看到数字;而行为检测需要学习系统调用、威胁模型等知识,门槛高,容易被忽视。

面试题

Q1. 安全沙箱执行的核心目标是什么?

单选题 · easy

  • A.提升代码运行速度
  • B.隔离并限制程序行为← 正确答案
  • C.替代操作系统内核
  • D.增加网络访问能力

答案:B。沙箱的本质是把不可信代码关进受限环境,核心是隔离和限制。A 是性能问题与沙箱无关;C 错在沙箱依赖内核而非替代内核;D 恰恰相反,沙箱通常限制网络而非增加网络能力。

Q2. 下列哪一项属于进程级隔离手段?

单选题 · easy

  • A.使用 Docker 镜像
  • B.白名单过滤系统调用← 正确答案
  • C.建立虚拟局域网
  • D.配置负载均衡器

答案:B。系统调用过滤(如 seccomp)是典型的进程级隔离手段。Docker 属于容器级,虚拟局域网属于网络层,负载均衡属于流量调度,都与进程级隔离无关。

Q3. seccomp 在 Linux 沙箱中的主要作用是什么?

单选题 · mid

  • A.限制进程可用的系统调用← 正确答案
  • B.加密磁盘上的文件
  • C.监控网络流量内容
  • D.调度 CPU 的时间片

答案:A。seccomp 是 Linux 内核的安全计算模式,核心功能就是限制进程能调用的系统调用集合。B 是文件加密,C 是网络监控,D 是 CPU 调度器职责,均与 seccomp 无关。

Q4. 容器级隔离依赖下列哪些内核机制?

多选题 · mid

  • A.Namespace 命名空间← 正确答案
  • B.Cgroups 资源控制← 正确答案
  • C.只读根文件系统挂载← 正确答案
  • D.TLS 证书体系

答案:ABC。Namespace 提供视图隔离,Cgroups 提供资源限制,只读根文件系统是容器镜像常见的加固手段,这三者都是容器隔离的基础。TLS 是传输加密协议,与容器隔离机制无关。

Q5. 在 AI 沙箱中配置临时目录时,正确做法是?

单选题 · mid

  • A.挂载宿主机全部数据目录
  • B.分配随机命名的一次性目录← 正确答案
  • C.直接暴露系统配置文件
  • D.禁止一切文件读写操作

答案:B。一次性随机目录既能满足 AI 代码写中间结果的需求,又能在任务结束后销毁,避免数据残留。挂载全部目录和暴露系统配置都会造成越权读取;完全禁止读写则会让很多 AI 任务无法运行。

Q6. AI 沙箱的网络限制通常采用哪种策略?

单选题 · easy

  • A.默认放行并记录日志
  • B.默认拒绝按需放行← 正确答案
  • C.只限制 UDP 流量
  • D.放行所有加密流量

答案:B。沙箱网络策略遵循最小权限原则,默认拒绝一切连接,只有任务明确需要时才通过代理白名单放行特定域名。默认放行会让恶意代码有机可乘,只限制 UDP 或放行加密流量都挡不住攻击。

Q7. 资源配额管理主要防范哪些风险?

多选题 · hard

  • A.fork 炸弹耗光进程数← 正确答案
  • B.挖矿程序抢占 CPU← 正确答案
  • C.内存泄漏拖垮宿主机← 正确答案
  • D.SQL 注入篡改数据库

答案:ABC。fork 炸弹靠进程数上限拦截,挖矿靠 CPU 配额限制,内存泄漏靠内存上限触发 OOM 击杀,这三者都是资源配额管的范畴。SQL 注入属于应用层注入攻击,需要参数化查询来防御,资源配额管不到。

Q8. 检测沙箱逃逸最核心的监控对象是什么?

单选题 · mid

  • A.用户登录频率
  • B.异常的系统调用序列← 正确答案
  • C.磁盘剩余空间大小
  • D.进程启动速度快慢

答案:B。逃逸通常需要利用内核漏洞发起一系列非正常系统调用,因此系统调用序列是最核心的检测信号。登录频率与逃逸无关,磁盘空间和启动速度都不是逃逸行为的关键特征。

Q9. 纵深防御体系包含以下哪些思想?

多选题 · hard

  • A.多层隔离相互叠加← 正确答案
  • B.检测与阻断联动← 正确答案
  • C.假设攻击已经发生← 正确答案
  • D.只依赖单层防护

答案:ABC。纵深防御 = 进程隔离、容器隔离、网络隔离层层叠加;每次检测都联动阻断动作;并且心态上默认“已经被攻破”来设计监控。只依赖单层防护恰恰是纵深防御要反对的。

Q10. gVisor 相比传统容器的核心优势是什么?

单选题 · extreme

  • A.用户态拦截系统调用← 正确答案
  • B.减小最终镜像体积
  • C.缩短容器启动时间
  • D.简化容器网络模型

答案:A。gVisor 在用户态实现了应用与内核之间的系统调用代理层,即便容器内代码恶意构造系统调用,也不会直达宿主机内核,隔离显著增强。减小镜像体积、缩短启动时间、简化网络模型都不是它的核心卖点。