Model Shell Protocol 与 pi-shell 沙箱内核 (MSP & pi-shell Sandbox Kernel)
2026-08-19 整理。背景:connectedGraph/pi(fork 自最上游 earendil-works/pi)把 Model Shell Protocol 内核嵌入开源 coding agent Pi,构建自包含pi-shell。
核心概念
Model Shell Protocol(MSP) = "一切皆命令"的模型操作系统语义层:把应用数据/领域对象投影成工作区文件、把操作注册成命令、权限归策略引擎、执行留审计。不是 /bin/sh 的包装,而是把 Unix 的"一切皆文件"推广到 AI 原生软件——模型面对一个统一 bash 工具,而不是一堆工具 schema。
一句话:普通沙箱把"不可信的东西"关起来;MSP 把"可信的东西"造出来。 普通沙箱靠 OS 边界防御(命名空间/seccomp/VM),MSP 靠语义级构造:应用没投影的路径对模型"根本不存在",谈不上越权。
pi-shell 架构
- MSP(Swift)裁掉 MSPGit/Cgit2 后 vendored 进 pi 仓库
packages/msp-kernel/,加 C ABI shim(msp_run_json/msp_free_json),编译成libMSPKernel.so。 - Pi 侧
msp-runtime.ts用 Bun FFIdlopen进程内加载(无外部 msp-shell 进程),bash 工具改走mspRunJson(workspace, command)。 - 回喂协议:
{"stdout","stderr","exit_code"}+cwd,JSON 只是 FFI 信封,字段是 MSP 原生结果。
沙箱的"虚拟表面"(模型看到的真相)
实测(直接用内核跑):干净工作区虚拟根只有 tmp/ + 你创建的文件,无 /usr、/bin、/etc。命令走注册表(type python3 → /usr/bin/python3 是注册路径,不映射到虚拟树文件);文件系统走虚拟树。两套独立命名空间,所以"which python3 给出 /usr/bin/python3、ls /usr/bin 却不存在"不矛盾。
- 工作区外路径 =
No such file or directory(不是 permission denied)→ 模型常误读成"容器/权限拒绝"叙事,会浪费轮次"调查环境"。 - 导出环境
PATH=/usr/bin:/bin,但 shell 自身$PATH变量可能为空(割裂是 MSP shell 细节)。
命令事务模型(最重要的使用边界)
MSP 无持久进程/无持久会话。 每条命令跑完即焚。因此:
- 起不了常驻服务:python 里
bind/listen挂的端口,命令一结束就没了(实测:运行期间可连,结束后Connection refused)。 - 跨命令无状态:全局变量、线程、
sys.modules、打开的文件/socket 都不保留。 - 想跑长驻服务需新机制(如引擎内保留长命子解释器的"后台会话"),当前不支持。
网络
全放——不建虚拟网段、不拦流量,python 的 socket/urllib 走宿主网络栈,DNS/公网 HTTPS 实测通。但 shell 命令层没有 curl/wget/ping(fake POSIX 未注册),模型联网只能走 python。
安全洞教训(已修)
早期实现曾用宿主 existsSync 解析 cd <目标> 并把沙箱根重定到任意真实宿主目录——cd /etc && cat passwd 越狱。修复:沙箱根固定为会话工作区,cd 全交给 MSP 虚拟 FS。 沙箱根绝不能由宿主 FS 决定;要支持多目录用会话/配置级 allowlist。
相关
- 嵌入式 CPython 的拦截机制与捆绑坑 → 嵌入式 CPython 沙箱拦截 (Embedded CPython Sandbox Interception)
- 用真运行时替代手写命令的实验 → MSP++ 统一桥接实验 (MSP++ Unified Bridge Experiment)
本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/AI apps