dsh-sandbox-temp-guard:Windows ACL 沙箱临时目录自愈守卫

前言

在 Windows 上使用 DeepSeek Harness(DSH)时,本地 ACL 沙箱(@deepseek-ai/dsh-sandbox-local)会为每个「会话 + 工作区」组合在系统临时目录下创建私有 temp 路径(形如 %TEMP%\dsh-XXXXXX),并在 provider 生命周期内缓存该路径与对应的 capability-SID 授权。若 Storage Sense、磁盘清理或手动删除把该目录清掉,上游实现不会在复用缓存前检查目录是否仍存在,runner 会因 --temp 指向已消失的路径而拒绝启动,整条会话内后续命令都会以 SANDBOX_UNAVAILABLE 失败,且重试无效,直到重启 DSH。Agent 还容易把这类后端基础设施故障误判为「沙箱损坏」,反复申请 danger-full-access 提权。下面介绍社区插件 dsh-sandbox-temp-guard(维护者 wsm000,分类 admin-security),它在上游正式修复落地前,对 temp 目录做自愈并给仍漏网的错误追加排查指引。背景讨论见 deepseek-ai/deepseek-harness Discussion #8550。

这是什么

dsh-sandbox-temp-guard 是 DSH 的 Cordis 插件:针对 Windows ACL 沙箱,在 OS 清理掉会话私有 temp 目录时自动重建目录并补回 ACL 授权;同时对工具结果里仍出现的「后端不可用」类错误做注解,引导模型不要误用 sandbox_permissions 提权。插件零运行时依赖(仅 Node 内置模块),许可证 MIT,当前 package 版本 0.1.0。社区目录页:https://www.skillhub.cn/plugins/wsm000/dsh-sandbox-temp-guard;源码与说明:https://github.com/wsm000/dsh-sandbox-temp-guard。

故障链路与插件职责

上游在创建 temp 时大致等价于:

const tempDir = mkdtempSync(join(tmpdir(), 'dsh-'))   // %TEMP%\dsh-XXXXXX
// + 一个可撤销的 capability-SID ACL 授权
this.tempCapabilities.set(key, { dir: tempDir, writeSid, grant })

之后每次 confine() 直接复用缓存的 dir,不检查目录是否还存在。目录被清掉后的典型链路是:

  1. runner 收到 --temp <已消失的路径>,requireDirectory 失败 → windows-acl-run: --temp is not an existing directory(exit 127)
  2. seam 按 fail-closed 抛出 SandboxUnavailableError(SANDBOX_UNAVAILABLE)
  3. 该会话内此后每条命令都在执行前失败,缓存里的坏路径会一直用下去

插件分两块能力(README 原文表述):

  1. 修复(核心):在每次工具执行前(并可配置地周期性)找到活跃 sandbox provider 缓存的 temp capability,对缺失目录执行 mkdirSync 并重新 grant.add(dir)(目录消失时其 ACE 一并消失,必须补授)。理想情况下错误不会浮到模型面前。
  2. 注解(卫生):若 SANDBOX_UNAVAILABLE / windows-acl-run: --temp 仍出现在工具结果里,tools/post-execute 会追加指引:说明这是后端基础设施故障而非策略拒绝;不要用 sandbox_permissions 提权;守卫已重建 temp,请原样重试一次;仍失败则需重开会话。

对 provider 内部 tempCapabilities 的访问采用通用发现(遍历对象图寻找 Map 形态、条目含 { dir, grant.add } 的缓存);上游字段改名时退化为 no-op 而非崩溃。已在 DSH 0.1.7-rc.2 的 dsh-sandbox-local 上验证字段形状。

安装与启用

安装机制来自官方 dsh plugin;README 注明在 DSH 0.1.7-rc.2 实测。任选其一:

# GitHub 源(未发布 npm 时的默认路径;DSH-Plugins-Marketplace 等市场的
# topic:dsh-plugin 收录插件,一键安装走的也是这个 spec)
npx @deepseek-ai/dsh plugin --profile desktop add github:wsm000/dsh-sandbox-temp-guard

# npm(若本插件已发布到 npm;市场对已发布 npm 的插件会优先走 npm,更快更稳)
npx @deepseek-ai/dsh plugin --profile desktop add dsh-sandbox-temp-guard

# 本地 tarball(开发/内测)
pnpm pack                                   # 得到 dsh-sandbox-temp-guard-0.1.0.tgz
npx @deepseek-ai/dsh plugin --profile desktop remove dsh-sandbox-temp-guard   # 版本变化时先移除
npx @deepseek-ai/dsh plugin --profile desktop add ./dsh-sandbox-temp-guard-0.1.0.tgz

开发时也可用 file:/// 源码 overlay(零运行时依赖,tarball / npm / overlay 均可):

# dev.patch.yml
- insert:
    - id: sandbox-temp-guard
      name: 'file:///C:/abs/path/to/dsh-sandbox-temp-guard/src/index.js'
      config:
        repairBeforeToolExecution: true
        sweepIntervalMs: 60000
        annotateBackendFailure: true
npx @deepseek-ai/dsh --profile dev --patch ./dev.patch.yml

DSH 生态里能力多以插件形式挂载;SkillHub 等社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系,安装前请自行查看仓库源码与 MIT 许可证。插件以当前 dsh 进程权限运行,与任何 DSH 插件一样,启用前应确认你信任维护者与代码行为。

配置项

插件通过 cordis.patch.yml 注入,可在 patch 或插件配置中覆盖下表键值:

键 默认 说明
repairBeforeToolExecution true 每次工具执行前扫一遍并修复
sweepIntervalMs 60000 周期兜底扫描间隔,0 关闭
annotateBackendFailure true 对后端失败结果追加排查指引

典型用法即安装后保持默认即可:执行前修复 + 每分钟周期扫描 + 失败结果注解三者默认均开启。

验证

仓库提供离线测试,不依赖 live DSH 进程:

node test/run-test.mjs     # 17 项离线断言:发现/重建/补授/容错/钩子接线/注解

适用场景与限制

适合谁:在 Windows 上长期使用 DSH desktop profile、启用 dsh-sandbox-local,且环境会定期清理 %TEMP% 的开发者或团队。本插件是上游在 materializeAclGrant() 复用缓存前「检查存在、缺失则重建并补授」落地前的过渡方案,上游修好后可再评估是否移除。

已知边界:

  • 只处理 temp 目录被清理这一种故障;provider 完全不可用(例如 ACL 后端崩溃)时,注解会提示重开会话,这是当前唯一恢复手段。
  • ctx.get('sandbox') 为可选访问,缺失时安全降级。

结尾

dsh-sandbox-temp-guard 把 Windows 沙箱 temp 被系统清掉导致的会话级 SANDBOX_UNAVAILABLE 从「只能重启 DSH」收窄为可自愈,并减少 Agent 对后端故障的误提权。目录页:https://www.skillhub.cn/plugins/wsm000/dsh-sandbox-temp-guard;GitHub:https://github.com/wsm000/dsh-sandbox-temp-guard。

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

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

Xiaoye