Deno L0 运行时与权限白名单
Portico 将系统运行时刚性锁定在 Deno + TypeScript(L0),这是整个项目的安全架构基石。
为什么选择 Deno L0?
传统 Node.js 运行时的最大软肋在于:一旦引入第三方 npm 依赖包,任何包均默认拥有全量的磁盘读写、子进程拉起和网络发起权限。
在治理多 Agent 的系统中,恶意依赖或投毒包极易直接读取系统私钥或修改底层数据。Deno 提供了与操作系统契合的原生默认拒绝权限沙箱:
- 默认无权:任何未经命令行显式授权的
Deno.readTextFile、fetch或Deno.Command都会直接崩溃抛出安全异常。 - 细粒度白名单:网络连接精确限定到特定的 IP(
--allow-net=127.0.0.1),文件读写精确限定到特定路径。 - 消除第二运行时:禁止把 Node.js 或 Bun 纳入生产依赖或发布产物,消除维护两套包管理器和锁文件的脆弱性。
各组件权限集定义清单
系统各进程的权限声明集中维护在 src/perms.ts,确保 up supervisor、build 编译器与自动化测试执行同一份事实基准:
| 运行产物 | 读权限 (--allow-read) | 写权限 (--allow-write) | 环境变量 (--allow-env) | 网络权限 (--allow-net) |
|---|---|---|---|---|
| Portico CLI | ✅ 允许读取配置文件 | ✅ 允许原子写入数据文件 | ✅ 允许读取 PORTICO_* 变量 | ❌ 严禁发起网络请求 |
| Portal 服务 | ✅ 允许读取静态与数据文件 | ❌ 严格禁止写操作 | ✅ 允许读取 PORTICO_* 变量 | ✅ 允许绑定本地回环端口 |
| MCP 网关 | ✅ 允许读取数据文件 | ✅ 仅限写入 gateway-audit.json | ✅ 允许读取 PORTICO_* 变量 | ✅ 允许绑定本地回环端口 |
| MCP 服务端 | ✅ 允许读取数据文件 | ❌ 严格禁止写操作 | ✅ 允许读取 PORTICO_* 变量 | ✅ 允许绑定本地回环端口 |
Caution
绝对禁止使用
--allow-all:在 Portico 的 CI、测试用例或运行脚本中,任何试图使用-A或--allow-all的修改均会被 CI 静态检查或代码审计直接驳回。