跳转至

沙箱隔离与安全防御

三级权限模式、OS 原生隔离(Landlock / sandbox-exec)、Fs 观察守卫与动态提权。

在生产环境中运行 Coding Agent 最令人担忧的就是安全性:如何防止 Agent 误删根目录、泄露私钥或执行恶意提权命令?DSH 提供了业界顶级的 纵深防御(Defense-in-Depth)安全架构


核心文件速查

路径 职责 重要度
packages/sandbox/sandbox/src/index.ts 沙箱服务定义与三级权限模式 ⭐⭐⭐
packages/fs/fs-observation-policy/src/index.ts 文件系统前置观察策略(Fs Observation Guard) ⭐⭐⭐
native/landlock/ Linux 原生 Landlock LSM 沙箱绑定 ⭐⭐⭐
packages/interaction/user-approval/ 用户授权与审批服务 ⭐⭐

三级沙箱权限模式(Sandbox Modes)

DSH 定义了三种明确的权限模式:

┌────────────────────────────────────────────────────────────┐
│ 1. read-only (只读模式)                                     │
│    - 仅允许读取文件与查询状态                               │
│    - 禁止任何写文件、重命名、删除或写外部设备操作           │
└─────────────────────────────┬──────────────────────────────┘
                              │
┌─────────────────────────────▼──────────────────────────────┐
│ 2. workspace-write (工作区写入模式 - 推荐默认)              │
│    - 允许读取全系统(受限)                                 │
│    - 仅允许在当前会话的 Workspace 根目录及特定临时目录写入   │
│    - 严格禁止向工作区外(如 /etc、~/.ssh、/var)写入         │
└─────────────────────────────┬──────────────────────────────┘
                              │
┌─────────────────────────────▼──────────────────────────────┐
│ 3. danger-full-access (全量宿主访问模式)                    │
│    - 绕过一切沙箱限制                                       │
│    - 仅用于完全受信任的环境或用户显式授权的一锤子提权       │
└────────────────────────────────────────────────────────────┘

操作系统级原生隔离:Landlock 与 sandbox-exec

与大部分仅仅在 Node.js 代码层做字符串路径检查的 Agent 不同,DSH 深入到操作系统内核层:

  • Linux 环境:通过 native/landlock 调用 Linux 5.13+ 的 Landlock LSM(Linux Security Module) 内核 API。在子进程派生时,直接在内核空间锁定文件读写规则,即使用户在 Bash 里写 rm -rf /,内核也会直接返回 EACCES (Permission Denied)
  • macOS 环境:调用 macOS 底层的 sandbox-execSeatbelt 策略配置文件,在系统调用级别封禁未授权路径。

文件前置观察策略(Fs Observation Policy)

大模型常常会犯"幻觉式覆写"的错误:在没有读过现有代码的情况下,凭空生成一个全新的文件并把旧文件完全覆盖。

为了防止这种灾难,DSH 设计了 Fs Observation Policy: 1. 系统在内存中维护一张 ObservedStateGate 弱引用映射表; 2. 当 Agent 尝试调用 editwrite 修改某个已有文件时,系统会先检查当前会话中是否已经成功 read该文件; 3. 如果未曾读取,操作直接被拦截并报错:[fs-observation-policy: file must be read before edit]; 4. 这一策略强迫大模型先观察现状,再做出精确修改。


动态提权协商机制(Escalation Protocol)

当 Agent 确实需要修改工作区外的文件时,DSH 支持优雅的提权流程: 1. Agent 第一次执行命令被沙箱拦截,返回统一格式的标记:[sandbox: file access denied under workspace-write mode]; 2. 系统在系统提示词中告知 Agent:若确需提权,可以重试同一命令并附加 sandbox_permissions: "danger-full-access" 及一句话中文理由 justification; 3. DSH 捕获到提权请求后,通过 ctx.approval 弹窗向用户请求单次批准。


本章思考与自测

  1. 思考题:为什么纯 Node.js 的 path.resolve() 检查无法完全防御路径穿越攻击(例如软链接攻击 Symlink Race Condition)?OS 级别的 Landlock 是如何解决这个问题的?
  2. 自测题Fs Observation Policy 是通过修改 fs.writeFile 底层 API 实现的,还是作为独立插件挂载在 tools/pre-execute 上?为什么这种设计体现了 Cordis 微内核的优势?