Skip to content

Sandbox zh

pawaca edited this page Aug 30, 2026 · 1 revision

沙箱

上游进程沙箱和文件效果策略系统在 Edge 中的适配。

上游参考:Sandbox

上游提供了什么

沙箱子系统将子进程参数包装在文件效果策略中。分三层:

  • dsh-sandbox — 抽象接缝,定义 ctx.sandbox.confine(argv, policy) 和升级词汇表。三种文件效果模式:只读、workspace 写入、危险完全访问。
  • dsh-sandbox-local — 平台实现:Linux bwrap/Landlock、macOS Seatbelt、Windows ACL token。
  • 消费者dsh-bash-sandboxdsh-pwsh-sandbox 在执行前通过沙箱包装 shell 命令。

沙箱还提供 canonicalPath()(通过 node:fs.realpathSync 解析符号链接)和 writableRoots()(计算允许写入的目录,包含 os.tmpdir())。

Edge 改了什么

补丁 移除 Node.js 导入

dsh-sandbox 包导入了 node:fsrealpathSync)和 node:ostmpdir),在 Cloudflare Workers 中不可用。Edge 应用了版本绑定的补丁,做了两处修改:

  • canonicalPath(path) — 直接返回路径,不调用 realpathSync.native()。VFS 没有符号链接,解析即恒等。
  • writableRoots(policy) — 省略 tmpdir() 调用。可写根目录仅为 workspace 根和 /tmp

未安装沙箱服务

Edge 没有安装 ctx.sandbox 服务或任何沙箱后端。补丁的目的是让其他导入 dsh-sandbox 的上游包(如文件系统层)能在不崩溃的情况下加载。

EdgeFileSystem 报告 sandboxModeundefined,表示无沙箱执行。Cloudflare Workers isolate 提供自身的安全边界——代码在 V8 隔离区中运行,除 Computer VFS 外没有文件系统访问,VFS 本身按构造限定在 workspace 范围内。

Edge 没有改什么

  • 沙箱升级词汇表和审批编排
  • SandboxPolicy 解析链
  • ConfinedArgv 结果分类(拒绝签名、运行器失败规则)

安全模型对比

方面 上游(Node.js) Edge(Workers)
进程隔离 每个命令 bwrap/Landlock/Seatbelt/ACL V8 isolate — 无原生进程
文件系统范围 每个子进程的文件效果策略 VFS 按构造限定 workspace 范围
写入限制 通过沙箱模式按命令配置 所有写入通过 VFS — 仅 workspace
符号链接解析 realpathSync.native() 恒等 — VFS 无符号链接

架构总结

组件 分类 Edge 代码
dsh-sandbox 接缝 补丁 移除 node:fs/node:os 导入(6 行补丁)
沙箱服务 未安装 V8 isolate + VFS 提供等效边界
EdgeFileSystem.sandboxMode 覆写 返回 undefined — 无进程级沙箱

关键观察:上游沙箱存在的目的是限制原生子进程。Edge 没有原生子进程——just-bash 在进程内运行,VFS 按构造限定 workspace 范围。补丁仅为防止 node:fs/node:os 导入崩溃而存在,不提供沙箱功能。如果采用 Cloudflare Containers 实现真正的子进程执行,沙箱接缝需要一个 Container 感知的后端,而非当前的无操作。

TODO

**评估 Container 感知的沙箱后端。**如果通过 Cloudflare Containers 实现子进程支持(#98),沙箱接缝应接入 Container 级别的限制后端,而非保持无操作。上游的 ctx.sandbox.confine() API 可以将文件效果策略应用于 Container 中启动的进程。

English

中文

Clone this wiki locally