feat(mcp-py): 代码沙箱落地 —— AST 静态守卫 + Docker 隔离执行(弃用桩)
mcp-py 的 run_code/secure_sandbox 此前全是桩。落地两层防御:
1) 静态守卫 sandbox.SecureSandbox.static_guard(纯 AST,执行前第一道)
- 拦危险导入(os/sys/subprocess/socket/ctypes/pickle/requests…)、危险调用
(eval/exec/compile/__import__/open…)、逃逸属性(__subclasses__/__globals__…)、语法错误。
- 返回 (放行, 原因)。
2) 隔离执行 interpreter.CodeInterpreter.execute(Docker,真隔离)
- network_disabled 禁网;user=65534 非 root + cap_drop=ALL + no-new-privileges;
read_only 根 + /tmp tmpfs;mem/memswap(禁swap)/nano_cpus/pids_limit 限资源;
python -I 隔离模式;wait 超时即 kill;容器一次性 remove。
- 无 Docker SDK/daemon 时 available()=False 优雅降级,不阻断服务。
gateway:run_code(标准档 256m/0.5cpu/10s) 与 secure_sandbox(紧档 128m/5s) 均走
守卫→隔离,结果整理为 stdout/stderr/exit 可读文本。pyproject 启用 docker 依赖。
验证:
- 守卫 6 单测(放行安全码 / 拦危险导入·调用·逃逸属性 / 语法错误)全过。
- 隔离 4 项实跑(真 Docker):sum(range(10))→45 exit0;非root uid=65534;
禁网 urlopen 失败(DNS解析错);while True 超时 3s 被 kill。
- 无 Docker 降级测过。
生产加固:可把执行运行时换 gVisor(runsc)/Kata(已在注释/PROGRESS 标注)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+3
-3
@@ -72,8 +72,8 @@
|
||||
### sundynix-mcp-py(算法型)
|
||||
|
||||
- [ ] 🟡 parse_document(docx/pdf/xlsx 解析器在;MinerU / PaddleOCR 多模态为骨架)
|
||||
- [ ] 代码解释器(docker 隔离执行,TODO)
|
||||
- [ ] 安全沙箱(gVisor / KataVM 强隔离 + AST 静态守卫,全为 TODO 桩)
|
||||
- [x] 代码解释器(Docker 隔离真执行:禁网/非root(65534)/丢能力/只读根+tmpfs/限内存CPU进程/超时kill/一次性;无 Docker 优雅降级)
|
||||
- [x] 安全沙箱 AST 静态守卫(拦危险导入/调用/逃逸属性,6 单测)+ 4 项隔离实跑验证(正常/非root/禁网/超时);gVisor/Kata 作生产加固标注
|
||||
|
||||
## 跨层 / 工程
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
## 未实现的大块(路线图)
|
||||
|
||||
- [x] **真实登录 / 鉴权(JWT)** —— 后端 + 前端闭环已完成 ✅
|
||||
- [ ] **代码解释器 + 安全沙箱**(mcp-py 核心能力,目前全桩)
|
||||
- [x] **代码解释器 + 安全沙箱**(AST 守卫 + Docker 隔离已落地 ✅;生产可换 gVisor/Kata)
|
||||
- [ ] **Harness 余下**:输出护栏(dispatcher token 发射层)(熔断降级 ✅、输入护栏 ✅、LLM 自动化评测 ✅ 已完成)
|
||||
- [ ] **长期记忆抽取** + external_api 工具
|
||||
- [ ] **计费 / 商业化**真实实现
|
||||
|
||||
Reference in New Issue
Block a user