dsh-sandbox-allowlist:为 DSH 默认沙箱增加可配置授权目录

前言

在 DSH 的默认沙箱里,工作区外的写入通常会受到限制。如果希望沙箱内的 CLI 命令或 write/edit 文件工具写入工作区外的受信目录,常见做法是关闭沙箱,或逐次处理审批,但这会削弱沙箱边界,也会拖慢流程。

dsh-sandbox-allowlist 的做法是在保留 DSH 默认沙箱的前提下,增加一组可配置的“沙箱授权目录”。这些目录可以被沙箱内的 CLI 命令与 write/edit 文件工具写入,不需要每次审批,也不需要关闭沙箱。

DSH 的理念是“一切皆插件”,社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系。dsh-sandbox-allowlistdeveloperdh 维护,许可证为 MIT

这是什么

dsh-sandbox-allowlist 是一个 DSH 沙箱扩展插件。它向 DSH 默认沙箱的写入边界追加可配置的可信目录,使这些目录在沙箱内可被写入。

它解决的核心问题是:

  • 工作区外的受信目录需要被沙箱内 CLI 命令写入。
  • write/edit 文件工具需要写入工作区外的受信目录。
  • 希望减少逐次审批,同时不直接关闭沙箱。

核心功能

沙箱授权目录

插件通过 sandbox-allowlist 设置 namespace 管理授权目录。可配置的目录清单支持:

  • 多个目录
  • 通配符 **,匹配子树
  • 通配符 *,匹配一级子目录
  • 通配符 ?,匹配单个非分隔符字符

这些目录会被追加进 DSH 默认沙箱的可写边界。命中授权目录的写入不需要每次审批,也不需要关闭沙箱。

CLI 命令与 write/edit 工具

沙箱内的 CLI 命令可以写工作区外的沙箱授权目录。

write/edit 文件工具也可以在 workspace-write 模式下写入沙箱授权目录。

注意:命中 allow 规则只跳过审批询问,命令仍然受文件沙箱约束,写盘边界不会改变。

命令白名单

插件支持命令放行规则,规则动作包括:

  • allow:放行,不询问
  • ask:询问
  • deny:拦截

规则按声明顺序求值,最后一条匹配的规则生效。未命中命令规则时,插件委托给下游,保留部署原有行为。

平台覆盖

插件覆盖:

  • Windows:ACL 沙箱
  • Linux:bwrap

Linux 上,landlock / seatbelt 暂不支持。

设置与生效

命令规则和授权目录可以通过设置页或 settings.yaml 编辑,实时生效,无需重启。

纯插件实现

该插件通过插件机制工作,不修改任何 node_modules / 官方包代码。

Windows 授权回收

在 Windows 上,从配置中删除授权目录会触发自动对账,并回收此前写入的写 ACE。

如果回收失败,相关目录会保留在:

$DSH_HOME/sandbox-allowlist-grants.json

下次对账时自动重试。

如果插件被卸载后目录仍残留 ACE,可以使用应急清理脚本:

node scripts/revoke.mjs

安装与启用

Node 要求:

>=20.11

安装命令:

dsh plugin --profile web add dsh-sandbox-allowlist

如果进行本地开发调试,也可以先打出 tarball,再安装本地包:

pnpm pack --pack-destination /tmp/pkg
dsh plugin --profile web add /tmp/pkg/dsh-sandbox-allowlist-*.tgz

安装后,可在设置页或 settings.yaml 中编辑 sandbox-allowlist 配置。配置实时生效,无需重启。

典型用法

配置沙箱授权目录

授权目录配置在 sandbox-allowlist.allowedDirs 中。示例:

sandbox-allowlist:
  allowedDirs:
    - 'D:\Shared\Tools'
    - 'D:\Shared\**'
    - 'D:\Data\logs\*'
    - 'D:\Work\202?'
    - '/opt/tools/**'

含义如下:

  • D:\Shared\Tools:指定一个具体目录
  • D:\Shared\**:匹配该目录的子树
  • D:\Data\logs\*:匹配一级子目录
  • D:\Work\202?? 匹配单个非分隔符字符
  • /opt/tools/**:POSIX 风格路径同样支持

锚定盘符或根目录且带 ** 的模式会被拒绝,用于防止整盘遍历。不存在的路径会被跳过并告警;如果配置 strict: true,可以改为抛错。

配置命令白名单

命令白名单配置在同一个 sandbox-allowlist namespace 下。示例:

sandbox-allowlist:
  commands:
    default: delegate
    rules:
      - tool: bash
        pattern: 'git *'
        action: allow

      - pattern: 'rm -rf *'
        action: deny

说明:

  • default: delegate 表示未命中规则时委托给下游,保留部署原有行为。
  • rules 按声明顺序求值,最后一条匹配的规则生效。
  • pattern 支持通配符,可用于忽略命令参数。
  • 命中 allow 只跳过审批询问,命令仍受文件沙箱约束。
  • deny 会直接拦截命令。
  • 规则通过设置页或 settings.yaml 编辑,实时生效,无需重启。

运行自检测试

仓库提供以下测试入口:

npm test
npm run test:command-gate
npm run test:patch
npm run test:dry-mount

这些命令可用于验证通配符展开、命令规则、补丁组合和干挂载等行为。

适用场景与注意

适合以下场景:

  • 需要在沙箱内写入工作区外的受信目录。
  • 希望减少 CLI 命令的逐次审批,同时保留沙箱边界。
  • 希望用统一配置管理授权目录和命令规则。
  • 在 Windows ACL 沙箱或 Linux bwrap 环境中使用 DSH。

使用前需要注意:

  • 沙箱授权目录将被沙箱内的 AI 代理直接写入,无需审批。只添加完全信任的目录。
  • 授权目录必须已存在且归当前用户所有。
  • Windows 上,授权目录需要能修改 DACL。
  • write/edit 工具只在 workspace-write 模式下放行沙箱授权目录。
  • Linux 上只完整支持 bwraplandlock / seatbelt 暂不支持。
  • dsh 升级时,如果相关基类签名变化,本插件可能需要小调。
  • 插件会在当前 dsh 进程中运行。安装前应检查源码、依赖和许可证。

结尾

dsh-sandbox-allowlist 的价值在于:它不要求关闭 DSH 默认沙箱,也不要求每次写入都走审批,而是通过可配置的授权目录和命令规则,把受信边界显式地配置出来。

目录页:

https://www.skillhub.cn/plugins/developerdh/dsh-sandbox-allowlist

GitHub:

https://github.com/developerdh/dsh-sandbox-allowlist

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye