沙箱隔离与安全防御¶
三级权限模式、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-exec与Seatbelt策略配置文件,在系统调用级别封禁未授权路径。
文件前置观察策略(Fs Observation Policy)¶
大模型常常会犯"幻觉式覆写"的错误:在没有读过现有代码的情况下,凭空生成一个全新的文件并把旧文件完全覆盖。
为了防止这种灾难,DSH 设计了 Fs Observation Policy:
1. 系统在内存中维护一张 ObservedStateGate 弱引用映射表;
2. 当 Agent 尝试调用 edit 或 write 修改某个已有文件时,系统会先检查当前会话中是否已经成功 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 弹窗向用户请求单次批准。
本章思考与自测¶
- 思考题:为什么纯 Node.js 的
path.resolve()检查无法完全防御路径穿越攻击(例如软链接攻击 Symlink Race Condition)?OS 级别的 Landlock 是如何解决这个问题的? - 自测题:
Fs Observation Policy是通过修改fs.writeFile底层 API 实现的,还是作为独立插件挂载在tools/pre-execute上?为什么这种设计体现了 Cordis 微内核的优势?