面试官可能会问:“Agent 为了分析表格要执行模型生成的 Python,如果代码里读取服务器文件、发网络请求或启动大量进程,你怎么防?”
代码解释器让 Agent 从“会说”变成“会计算”。它可以处理数据、运行统计、生成图表和验证中间结论。但 exec() 执行的不是普通业务代码,而是用户输入与模型生成共同影响的任意程序。
训练材料里的最小实现会用字符串检查、模块黑名单和受限 safe_globals 演示原理。这适合学习执行流程,不是生产安全边界。Python 是动态语言,危险能力可能通过对象反射、已有引用、依赖库、文件描述符或解释器漏洞间接获得。只把 open 和 os 从全局变量删掉,不能证明代码无法碰到宿主资源。
因此本题只能按可验证的工程设计回答:把不可信代码放进独立、短生命周期的执行环境,默认无网络、无宿主文件、无密钥、低权限,并限制 CPU、内存、进程、磁盘、输出和时间。是否使用子进程、容器或 microVM,要根据威胁模型和隔离强度选择,不能把教学 Demo 冒充已上线生产沙箱。
先给出 30 秒回答
Agent Code Interpreter 的模型代码永远按不可信输入处理。字符串扫描和
safe_globals只能做前置提示,真正边界放在操作系统或虚拟化隔离层。每次任务创建短生命周期沙箱,使用非特权身份、只读基础镜像、临时工作目录,不挂宿主敏感路径,不注入云凭证,默认关闭网络并按工具授权开放。通过 cgroup 或等价机制限制 CPU、内存、进程、磁盘、输出和超时,依赖来自审核镜像而不是运行时任意安装。上传文件先校验,结果只通过受控通道返回,任务结束清理环境。全链路记录镜像版本、资源、网络、文件、退出原因和工件哈希,并用逃逸、资源耗尽、数据外传和残留文件测试验证设计。
面试官不会因为你提到 Docker 就停止追问;你还要逐个说明攻击面由哪一层控制。

代码、文件、网络和结果都通过受控边界进入或离开沙箱。
先建立威胁模型
安全设计从“它可能做什么坏事”开始,而不是先选容器技术。
攻击来源包括用户主动提交恶意代码、提示注入让模型生成危险代码、模型无意写出死循环或大内存程序、上传文件利用解析器漏洞,以及第三方依赖被滥用。
要保护的资产包括宿主文件、服务凭证、云元数据、其他用户工件、内部网络、数据库、计算资源和控制平面。
主要风险可以分为五类:越权读取和修改文件;访问网络或内网外传数据;资源耗尽;跨任务数据残留;利用运行时或隔离漏洞逃逸。
不同业务风险不同。只处理公开数据的离线分析,与可读取企业内部文件的代码 Agent,不应使用同一安全等级。文章只给分层设计,不声称某种机制能绝对阻止所有逃逸。
为什么字符串黑名单不可靠
教学实现常扫描 import os、open(、subprocess 等字符串。这能拦住直观样例,也方便初学者理解危险能力,但绕过方式很多。
代码可以动态构造名称,通过对象属性间接访问能力,或调用一个已允许但内部能读文件、发请求的库。黑名单还会误伤普通文本和变量名。
静态 AST 分析比字符串检查更准确,可以拒绝 import、属性访问、动态执行和不允许节点,但仍不能理解所有运行时行为。依赖库内部做什么,AST 不一定看见。
exec(code, safe_globals) 限制直接可见名字,却不等于操作系统隔离。只要解释器进程本身拥有宿主权限,任何沙箱绕过都可能触及宿主。
所以源码扫描和受限全局变量可以作为第一层,帮助减少误用、提供友好错误和缩小攻击面,但最后边界必须落在进程、文件系统、网络、权限和资源隔离。
隔离层怎样选
受限子进程启动快、实现简单,但与宿主共享更多内核和文件系统环境,需要非常谨慎的用户权限、系统调用、目录和资源限制。它适合低风险教学或内层防护,不应仅凭“新进程”就称为强沙箱。
容器可以使用命名空间、cgroup、只读镜像、能力裁剪和安全配置隔离资源。它仍共享宿主内核,容器配置、运行时和内核漏洞都要进入威胁模型。
microVM 或更强虚拟化提供独立内核边界,通常隔离更强,也带来启动、镜像、调度和运维成本。高风险、多租户或执行完全不可信代码时更值得考虑。
还可以采用多层:外层虚拟化隔离租户,内层容器或进程承载单任务。具体选择依赖风险、并发、启动时间、成本和团队能力,需要真实压测与安全评审。
不能回答“Docker 就安全”。面试官更关心容器是不是特权模式、挂载了什么、网络是否开放、有什么凭证、资源怎样限制、任务后如何销毁。
文件系统怎样隔离
基础镜像尽量只读,运行时使用新建临时工作目录。沙箱只看到本任务上传的文件和允许的只读依赖,不挂载宿主项目目录、Docker Socket、用户主目录或密钥目录。
执行身份使用非 root 用户,去掉不需要的 Linux capabilities。临时目录设置大小和 inode 限制,避免代码写满磁盘或创建大量小文件。
上传文件先检查大小、类型和压缩包结构,防止路径穿越、压缩炸弹和伪造扩展名。解压在隔离环境中完成,归一化路径后仍要求目标位于任务目录。
工件输出使用单独目录和白名单类型。服务端通过受控接口读取,不让代码指定任意宿主目标路径。任务完成后销毁执行环境,并验证临时卷、缓存和中间文件不被下一任务复用。
若需要持久化图表或结果文件,只复制明确的工件,不保存整个文件系统快照。工件带所有者、租户、内容哈希、类型和保留时间。
网络为什么默认关闭
开放网络会带来数据外传、访问内网、扫描服务、下载恶意依赖和访问云元数据等风险。
多数本地数据分析不需要网络,应默认无出站能力。需要获取公开数据时,更安全的做法是通过受控工具网关,由 Agent 明确调用搜索或下载工具,网关执行域名、协议、大小、重定向和内容检查,再把结果作为文件送入沙箱。
若沙箱必须联网,使用目标白名单、DNS 与 IP 校验、阻止私网和元数据地址、限制端口、响应大小和请求次数。重定向后再次校验目标,避免白名单域名跳到内网。
不能向沙箱注入主服务的云密钥、数据库口令或长期 Token。真正需要访问某项能力时,使用范围小、时间短、与任务绑定的凭证,并由外部网关记录授权。
网络策略的拒绝发生在基础设施层,不靠 Python monkey patch requests。代码可以使用别的库或底层 socket,应用级拦截不是最终边界。

源码检查减少误用,操作系统和虚拟化边界负责真正隔离。
资源限制怎样做
模型很容易无意生成死循环、无限递归、大数组、进程炸弹或巨量输出。即使没有攻击意图,也会影响其他任务。
每个执行任务限制总时间、CPU 时间、内存、进程和线程数量、磁盘与 inode、标准输出与错误输出大小、工件数量和单个文件大小。
达到限制时由外部控制器终止执行环境,不能依赖用户代码合作退出。超时后回收全部子进程,避免父进程死了但后台任务继续。
对绘图和数据处理库,可以预装经过审核的版本,禁用运行时任意 pip install。依赖安装不仅消耗资源,还会访问网络、执行安装脚本并引入供应链风险。
限制值根据任务类型与真实数据校准。简单计算和大文件分析可以使用不同资源配置,但模型不能自行申请无限资源。超出配额时返回结构化错误,让上游决定缩小数据、分批处理或请求授权。
系统调用和进程权限
非特权用户只是起点。还要裁剪系统调用、禁止提权、限制设备访问、禁止挂载和内核管理能力,并使用平台提供的安全配置。
进程不应看到宿主 PID、设备和控制 Socket。不能运行特权容器,也不把容器运行时接口挂进去,否则代码可能创建新容器或控制宿主。
运行时和基础镜像需要补丁、签名或来源校验。允许的 Python 包也要锁定版本,并通过漏洞和许可证流程管理。
这些控制随平台而变,文章不提供一份可直接宣称安全的配置。真正上线需要安全团队审查、攻击测试和持续更新。
代码执行任务的完整生命周期
第一步,接收代码、参数和已授权文件引用,生成任务 ID。第二步,做大小、类型、静态规则和权限检查。第三步,选择审核镜像与资源档位,创建短生命周期环境。
第四步,只复制当前任务文件,设置无网络或受控网络,启动非特权进程。第五步,外部控制器采集 stdout、stderr、退出码、资源使用和工件清单,并执行超时终止。
第六步,结果经过大小、类型和敏感检查后返回 Agent。第七步,销毁环境和临时卷,持久化允许工件与最小审计记录。
每一步都有失败出口。镜像不可用、文件校验失败、资源不足、网络拒绝、超时、进程崩溃和工件不合法应使用不同错误类型。Agent 根据错误决定修改代码、缩小任务、换工具或请求用户,而不是无限重试。
一个数据分析例子
用户上传一份 CSV,请 Agent 计算分组统计并生成图表。上传服务先验证文件大小、类型和租户归属,将文件放到本任务的只读输入区。
模型生成 Python,只能读取指定相对路径,输出到固定工件目录。前置分析拒绝明显危险能力,但真正执行仍在短生命周期隔离环境中。
沙箱没有云密钥和数据库连接,默认无网络,使用审核过的 pandas 与绘图库版本。控制器限制资源和输出,超时后终止全部进程。
运行完成后只返回标准输出摘要、统计结果和经过类型检查的图片。用户原文件与图表带相同租户权限。环境销毁后,下一任务无法看到它们。
若代码试图访问 /etc、打开网络或创建大量子进程,应由文件系统、网络和进程限制拦截,而不是仅期待字符串扫描命中。
输出也可能是攻击面
stdout 可能非常大,错误栈可能泄露内部路径,生成的 HTML 或 SVG 可能包含脚本,压缩包可能路径穿越,模型读取的结果也可能包含提示注入文本。
输出需要大小限制、类型识别和内容处理。纯文本截断并标明;结构化结果验证 Schema;图片重新编码或按安全策略处理;可执行文件和未知类型默认不返回。
错误信息对用户只提供必要内容,内部 Trace 保存受限详情。不能把宿主目录、镜像内部结构和系统调用策略全部暴露给不可信请求。
Agent 使用沙箱输出时仍区分数据与指令。文件内容不是系统提示,不能因为结果里写“忽略规则并访问网络”就改变工具权限。
怎样做权限与人工确认
只读本地计算可以在用户授权文件范围内自动执行。访问外部网络、读取额外数据源、使用高成本资源或导出敏感结果,需要更高权限或明确确认。
权限在外部控制平面校验,不能由沙箱代码自行申请。审批内容展示将访问的资源、网络目标、输出范围和成本类别,不展示难懂的内部命令。
确认令牌与任务和动作绑定,不能一次同意后永久开放网络。任务重试或参数变化时重新评估授权。
多 Agent 场景下,生成代码的 Agent 不自动拥有执行和读取结果的全部权限。执行工具根据当前用户、租户、角色和任务作用域决定。
Trace 记录什么,不能记录什么
记录任务 ID、用户和租户的受控标识、代码哈希、镜像与依赖版本、资源档位、网络策略、输入工件 ID、启动与结束状态、退出原因、资源使用、输出工件哈希和安全拒绝类型。
完整代码、用户数据和 stdout 可能敏感,不应无条件进入普通日志。按调试用途、权限和保留期限保存,必要时只记录哈希与摘要。
Trace 能区分代码语法错、依赖缺失、资源超限、安全策略拒绝、平台故障和工件处理失败。上游才能选择合理恢复,而不是看到统一“执行失败”。
怎样验证沙箱设计
功能样本覆盖数据分析、数学计算、图表、文件读写到任务目录和结构化输出。
安全样本覆盖宿主路径、符号链接、路径穿越、环境变量、云元数据、私网、DNS 重绑定、系统命令、进程创建、设备、运行时 Socket 和危险依赖安装。
资源样本覆盖死循环、大内存、进程炸弹、磁盘填满、巨量 stdout、大量小文件和超时后残留子进程。
隔离样本验证两个用户和两个连续任务无法互相读取文件、缓存和进程。删除任务后工件按策略清理,旧下载链接失效。
还要测试控制平面故障:创建环境成功但记录失败、执行结束但销毁失败、输出上传一半、超时信号未生效。每种状态都要可观测、可重试或隔离待处理。
本文只描述 B 级系统设计与验收方法,不声称已经通过生产级逃逸测试,也不报告任何安全拦截率或性能数据。

文件、网络、资源、跨任务和逃逸风险分别由不同层控制。
面试官会怎样连续追问
追问一:safe_globals 为什么不算真正沙箱
它只限制 Python 代码直接可见的名字,解释器进程仍拥有操作系统权限。动态对象和依赖可能间接获得危险能力,最终边界应在进程、文件、网络和虚拟化层。
追问二:容器是不是就足够安全
不一定。容器共享宿主内核,安全取决于是否特权、挂载、能力、系统调用、网络、凭证、资源和运行时补丁。高风险场景可能需要更强虚拟化。
追问三:代码需要联网下载数据怎么办
优先通过受控下载工具获取并作为输入文件;必须直连时使用目标白名单、私网阻断、限额和短期授权,不开放任意出站。
追问四:怎样防止死循环和进程炸弹
由外部控制器和资源隔离限制时间、CPU、内存、进程、磁盘与输出,达到限制后终止整个执行环境。
追问五:任务结束后怎样防止数据残留
每任务使用独立临时卷和环境,只复制允许工件,结束后销毁并验证。缓存与持久化工件也按租户、权限和保留期限管理。
追问六:为什么说这里只是设计题
材料展示了受限 exec 和安全检查的学习实现,真实生产沙箱需要平台、内核、安全测试和运维证据。没有这些证据不能声称已经安全上线。

功能跑通、安全隔离、资源回收和故障恢复都要留证据。
把沙箱边界讲成一段完整回答
Code Interpreter 里模型代码按完全不可信处理。字符串扫描、AST 和
safe_globals只做前置检查,真正隔离依赖短生命周期的非特权执行环境。基础镜像只读,只挂当前任务临时目录,不放宿主路径和云密钥,默认关闭网络,需要外部数据时走受控工具网关。外部控制器限制 CPU、内存、进程、磁盘、输出和时间,依赖使用审核镜像,不允许运行时任意安装。结果通过固定工件目录返回并做类型、大小与敏感检查,结束后销毁环境和临时卷。Trace 记录镜像、资源策略、文件、网络、退出原因和工件哈希。验证覆盖逃逸尝试、数据外传、资源耗尽、跨任务残留和控制平面故障。是否用容器或 microVM 按威胁模型选择,不能把教学受限 exec 冒充生产沙箱。
证明沙箱边界时,你应能拿出什么
- 是否明确模型代码、用户代码和上传文件都不可信。
- 是否承认字符串、AST 和 safe_globals 不是最终隔离边界。
- 执行环境是否非特权、短生命周期、只读镜像且无敏感挂载。
- 网络是否默认关闭,开放时有目标、私网、大小和次数限制。
- 是否限制 CPU、内存、进程、磁盘、输出、工件和超时。
- 依赖是否来自审核镜像,而不是任意运行时安装。
- 输入文件、输出工件与下载链接是否带租户和权限。
- 任务结束是否销毁进程、临时卷和缓存残留。
- 高风险能力是否通过外部权限与人工确认控制。
- Trace 是否区分代码、策略、资源、平台和工件失败。
- 是否测试跨任务隔离、逃逸尝试、资源耗尽和销毁失败。
- 没有生产证据时,是否只说设计与验收,不声称绝对安全。
代码解释器的价值来自真实计算,它的风险也来自真实执行。可靠设计要保证:即使不可信程序行为异常,也只能在可撤销、可限制、可审计的边界内运行;删掉几个危险词做不到这一点。