云沙箱常用于运行 AI 生成代码、用户上传脚本、自动化测试、数据分析和第三方依赖。这类代码应默认不可信。Sandbox 可以降低执行风险,但不能替代输入校验、最小权限、网络控制、资源限制和输出审查。
先判断风险等级
接入前先判断任务属于哪类风险:
低风险:运行内部固定脚本,输入来自可信系统,不访问敏感数据。
中风险:运行 AI 生成代码或用户上传文件,但只处理脱敏数据,访问范围可控。
高风险:运行外部用户代码、安装第三方依赖、访问公网或处理生产数据。
禁止默认放行:需要高权限云账号凭证、生产数据库写权限、内网管理地址访问或跨租户共享可写目录的任务。
风险越高,越应该使用独立 Sandbox、短超时、短期凭证、受控网络、独立工作目录和更严格的输出审查。
输入与命令执行
不要把用户输入直接拼接进 shell 命令。用户输入可能包含命令分隔符、路径穿越、重定向、变量展开或恶意参数。
不推荐:
await sandbox.commands.run(`python3 analyze.py ${userInput}`);推荐:
await sandbox.files.write("/tmp/input.txt", userInput);
await sandbox.commands.run("python3 analyze.py /tmp/input.txt");如果必须传递参数,应使用结构化参数、白名单枚举或转义库,并记录允许的参数范围。不要让模型生成的命令绕过业务侧校验直接执行。
文件访问控制
为每个任务创建独立工作目录,只允许读写必要路径。
const taskId = "task-001";
const workdir = `/tmp/tasks/${taskId}`;
await sandbox.files.makeDir(workdir);
await sandbox.files.write(`${workdir}/input.txt`, userInput);建议:
文件路径由业务系统生成,不直接使用用户传入的完整路径。
删除文件前校验路径前缀,避免误删系统目录、共享目录或其它任务目录。
解压文件前限制格式、大小、层数和总展开体积。
下载文件前校验来源、大小、类型和落盘路径。
对输出文件做扫描和脱敏后再返回给用户。
网络访问控制
不可信代码的网络能力应按最小必要原则开放。
建议:
默认不向不可信代码暴露内网管理地址、数据库地址、元数据服务、CI/CD 服务和企业内部 API。
需要访问外部数据源时,优先通过业务侧代理转发,并在代理层做鉴权、审计、限速和目标白名单。
不把 Sandbox 公网端口作为长期服务入口。临时预览服务应设置鉴权、过期和访问范围。
对爬虫、浏览器自动化、依赖安装和模型下载任务设置网络目标、带宽、时间和输出限制。
如果当前产品能力没有提供细粒度出站网络策略,应通过 VPC、安全组、代理服务、数据源权限和业务网关共同约束访问范围。
凭证与数据最小化
不要让不可信代码接触它不需要的数据和凭证。
建议:
输入数据尽量脱敏、裁剪,只提供当前任务需要的最小字段。
使用任务级短期凭证,不注入主账号凭证、生产数据库密码或长期第三方 Token。
不在
envs、metadata、命令参数、文件名、日志和异常堆栈中放敏感正文。对 stdout、stderr、异常、生成文件和下载链接做敏感信息过滤。
环境变量不是安全边界。运行在 Sandbox 内的代码可能读取并输出环境变量,因此不要把高权限长期凭证交给不可信代码。
资源与生命周期控制
不可信代码可能死循环、创建大量文件、启动后台进程或持续访问网络。业务侧必须设置资源和生命周期边界。
建议始终使用 try/finally 或等效清理逻辑:
const sandbox = await Sandbox.create("code-interpreter-v1", {
timeoutMs: 300_000,
apiKey: process.env.E2B_API_KEY,
apiUrl: process.env.E2B_API_URL,
domain: process.env.E2B_DOMAIN,
});
try {
await sandbox.commands.run("python3 /tmp/task.py", { timeoutMs: 60_000 });
} finally {
await sandbox.kill();
}同时建议:
设置 Sandbox 超时和命令超时。
限制输出大小、文件数量和下载体积。
对后台进程进行跟踪和终止。
对异常、超时、取消任务和用户关闭页面都执行清理逻辑。
对高风险任务设置并发和成本上限。
上线前检查
上线前至少确认:
不可信代码不能读取生产密钥、其它租户文件或无关外部存储。
用户输入不能触发命令注入、路径穿越、任意文件覆盖或任意文件删除。
Sandbox 公网端口没有暴露未鉴权管理接口。
日志和输出不会泄露 API Key、AccessKey、Token、用户隐私和下载地址。
任务失败、超时和取消后,Sandbox、后台进程和临时凭证都会被清理。
如果以上任一项无法验证,不建议把该能力作为生产链路对外开放。