安全:动作授权与执行约束
工具消费者按需请求一次动作审批、解析本次文件策略并调用执行沙箱。凭据逐操作读取,业务所有权另行核验;各插件分别承担授权、文件约束与秘密解析责任。
箭头表示标注的调用或依赖关系;点击组件定位正文。完整关系见下方文字说明。
审批服务只授予一次动作
dsh-user-approval 接收动作请求,并经回答链取得 allowed-once、rejected、cancelled 或 unavailable。只有 allowed-once 授权;缺少回答者、非拥有者回应或回答者抛错都不能视为默认同意。
// 请求一次动作审批并记录审计,只有 allowed-once 授权执行。
async request(req: ApprovalRequest): Promise<ApprovalOutcome>ask 策略进入链条,never 策略直接拒绝而不派发。决策可采用最近日志状态,否则使用配置;approval/asked 与 approval/decided 留下仅用于记录的审计对,取消后到达的迟到答案被丢弃。
策略解析绑定本次执行
dsh-sandbox 定义 read-only、workspace-write、danger-full-access 等执行策略,sandbox-local 在本机实施,shell 等消费者把策略交给实际执行器。
dsh-sandbox · 接口摘录,省略上下文 · ctx.sandbox.confine · docs/subsystems/sandbox.md// 将原始 argv 包装为受约束执行参数,同时报告后端约束完整度。
abstract confine(argv: readonly string[], policy: SandboxPolicy, signal?: AbortSignal): Promise<ConfinedArgv>每次调用根据 Session 不可变 cwd 确定根目录,路径要在执行环境里规范化;经过明确批准的覆盖只应用于对应调用。danger-full-access 绕过文件限制。该能力主要约束文件效果,不能据此宣称同时隔离全部网络访问或进程可见性。
// 按本次批准覆盖、会话日志与部署默认解析文件执行策略。
resolve(request: SandboxPolicyRequest = {}): SandboxExecutionPolicy平台后端落实文件约束
固定版本本地实现使用 Linux 的 bwrap 或 Landlock、macOS 的 Seatbelt、Windows 的受限令牌与 ACL;具体后端报告 full 或 partial。
Windows 与较旧 Landlock 存在部分实施的情形,命令成功不证明请求的所有限制都已实施。自定义 runnerCommand 会跳过内建后端选择与探测,此时 full 是操作者的实施声明,还须配置 runnerFailureSignatures。SSH 沙箱由 sandbox-ssh 在远端执行环境实施,不能把本地 ACL 结论套在远端路径上。失败输出中的拒绝线索也不等于完整的拒绝审计。
凭据与业务所有权分别校验
dsh-credentials 定义凭据服务,credentials-local 管理本地来源;配置引用环境变量名,密钥值由提供者拥有,空值视为缺失。
// 每次操作重新解析凭据,返回当前值与来源,跨操作不可缓存。
abstract resolve(ref: CredentialRef): Promise<ResolvedCredential | undefined>每次操作或请求重新 resolve;本地凭据文件默认监视变更,重载后可供下次请求使用。来源优先级是启动环境、存储文件、项目 .env、home .env;启动环境是冻结快照,优先级最高且只读,变更它需要重启。describe 仅报告配置状态、来源与可写性。同时 jobs 与 subagent 检查对象拥有关系,不能因为模型知道一个编号就允许访问。
辅助示例
模型需要在工作区外写文件时,工具发起针对该动作的审批;获得一次许可后,执行器使用获批的权限覆盖配置执行,并报告实际沙箱事实。这个许可不会自动授予后续命令,更不会让模型读取任意作业或取得模型 API 密钥。若用户已取消,迟到的同意也不能启动原动作。
设计取舍
审批、执行限制、凭据与所有权各自回答一个具体问题,减少权限被含糊继承的机会;代价是使用者需要分别检查审批、执行限制、凭据和所有权结果。软提示适合协作,强制限制依赖具体执行后端,二者不能因名称都含“只读”就混为同一保证。
相关包与插件
- 一次性敏感操作批准
@deepseek-ai/dsh-user-approval - 子进程文件访问隔离接口
@deepseek-ai/dsh-sandbox - 本机跨平台沙箱提供者
@deepseek-ai/dsh-sandbox-local - SSH 远程沙箱提供者
@deepseek-ai/dsh-sandbox-ssh - 凭据引用与记录接口
@deepseek-ai/dsh-credentials - 本机私有凭据存储
@deepseek-ai/dsh-credentials-local