dsh-sandbox-console-fix:Windows 桌面版 workspace-write 沙箱控制台修复

前言

在 DeepSeek Harness(DSH)里用智能体跑 Shell,常见权限档位是 workspace-write:只允许在工作区内写入,比 danger-full-access 更安全。Windows 桌面版(Electron 打包)上,若沙箱走 ACL 本地 runner,部分环境会在 workspace-write 下立刻失败,退出码 3221225794(0xC0000142,STATUS_DLL_INIT_FAILED),pwsh、cmd、powershell 表现一致;read-only 与 danger-full-access 往往仍可用。下面介绍社区 bundle dsh-sandbox-console-fix 的定位、机制与安装方式。仓库已由维护者归档,且代码标注为 AI 生成、未经人工审阅;安装前请自行阅读源码。

这是什么

dsh-sandbox-console-fix 是面向 Windows 的 DSH bundle(dsh-plugin),维护者为 GitHub 用户 TJZF-4j97,在 SkillHub 目录中归类为 admin-security。它针对 DeepSeek Harness desktop 0.2.0-rc.2(README 写明 Electron 44.0.0 / Node 24.18.1,在 Windows 11 22H2 x64 上验证),通过给 ACL 沙箱 runner 补控制台或调整进程 token 的 Default DACL,使 workspace-write 下的受限 Shell 子进程能再次启动,且 README 强调 不放宽 完整性标签、工作区 capability、deny ACE 与 dsh-fs-sandbox 文件策略。Linux / macOS 上 patch 行带平台守卫,composition 不变,包为惰性无操作。

上游问题以 Discussion 形式报告:https://github.com/deepseek-ai/deepseek-harness/discussions/9280。2026-10-19 起仓库 已归档:在 未提升权限(UAC 开启、Harness 非「以管理员身份运行」)的宿主上,随包 runner 已能启动 workspace-write 受限子进程,该 bundle 不必安装;在 提升权限 宿主(UAC 关闭或管理员启动 Harness)上,失败仍可能出现,bundle 仍可作为临时规避。

故障现象与根因(摘要)

桌面应用中,dsh-sandbox-local 的 windowsAclRunnerInvocation() 在存在 built entry 时使用:

if (existsSync(builtEntry)) return [process.execPath, builtEntry];

此时 process.execPath 为 DeepSeek Harness.exe(GUI 子系统,无控制台)。Runner spawn 受限子进程时依赖子进程 继承 runner 的控制台;无控制台可继承时,console 子系统的子进程在 DLL 初始化阶段自行建控制台,在 workspace-write 对应的低完整性、写受限 token 下失败,得到 0xC0000142。

read-only 路径在 shipped 代码里已向 restricted token 的 Default DACL 合并 Everyone 等 ACE;workspace-write 合并的是 capability write SID 而非 Everyone,在部分 token Default DACL 缺少 Everyone 的宿主上,上述控制台创建路径更容易触发失败。

核心功能

bundle 通过 cordis.patch.yml 在 Windows 上 禁用 shipped 的 sandbox 行并插入自有 provider(与 dsh-base 对 bash-sandbox 的平台守卫写法一致),子类覆盖 LocalSandboxProvider 的 runner 调用,在 argv 中插入与 DSH 开发路径同构的 preload:

shipped:  [execPath, runner.js, …profile, --, target]
this:     [execPath, --import <console-shim.mjs>, runner.js, …profile, --, target]

console-shim.mjs 在 runner 派生 restricted token 之前 向 runner 进程 token 的 Default DACL 合并一条 Everyone 全访问 ACE(与 shipped read-only 已合并的 ACE 同类);若合并无法应用,则回退为 AllocConsole() 并保存/恢复三个标准句柄、隐藏窗口。README 称 restricted token 的低完整性、写受限 SID、工作区/私有临时目录 grant、deny ACE、Job、stdio 与 fs 策略 与 shipped 一致,仅 Default DACL 多出的 ACE 与 read-only 路径对齐。

调试:将环境变量 DSH_SANDBOX_CONSOLE_FIX_DEBUG 设为文件路径时,可记录所走路径(后续安全自检中,诊断行为已改为主要写 stderr、避免任意路径写文件——以仓库当前 README 为准)。

与 @argszero/cordis-plugin-sandbox-grant-advisor(0.17.0)的关系:advisor 命名并诊断 native-init 类失败;本 bundle 为修复实现。机制长文见上游 Discussion #9238。

安装与启用

按 DSH 惯例通过 Plugin Manager 安装(由管理器完成包安装与 bundle 选择),不要 凭插件名自行拼接 CLI 安装命令。

  1. 打开 Plugin Manager,从 https://github.com/TJZF-4j97/dsh-sandbox-console-fix 或该目录的绝对路径安装 bundle。
  2. 重启 Harness。
  3. 将会话设为 workspace-write,执行任意 Shell 命令验证。

包 故意不声明依赖:index.js 从运行中的 Harness bundle 加载 LocalSandboxProvider,console-shim.mjs 在同一安装树解析 koffi。README 记录安装结果为 Packages: +1、无额外下载、无 pending build script。

不推荐的手动方式(摘录 README):复制到 profile 的 node_modules 并在 dsh.profile.bundles 中加入 dsh-sandbox-console-fix 后重启;Plugin Manager 会在安装失败时快照/恢复 package.json 与 pnpm-lock.yaml。

卸载:从 profile 的 bundles 列表移除 bundle 名并删除依赖,重启;README 称不遗留需本 bundle 清理的系统级变更。

典型用法与验证

会话为 workspace-write 时,README 给出如下检查步骤:

$PSVersionTable.PSVersion                      # 期望正常版本号,而非 0xC0000142
Set-Content 'C:\Users\<you>\nope.txt' 'x'      # 期望 [sandbox: file access denied under workspace-write mode]
Set-Content '.\ok.txt' 'x'                     # 期望成功
Remove-Item '.\ok.txt'

README 说明:受限 Shell 内 管道连接不同程序 的 stdio 仍可能被沙箱拒绝(EPERM),与是否安装本 bundle 无关;裸 & some.exe、PowerShell cmdlet 管道与文件重定向仍可用。

不安装 bundle 也可复现机制(需按 scripts/README.md 准备 extracted-runner 路径):

node scripts/console-probe.cjs
node scripts/console-probe.cjs --host electron
node scripts/full-chain-repro.js --help
powershell -File scripts/escape-test.ps1 -Workspace <dir>

适用场景与注意

适合谁

  • 在 Windows 10/11 x64 上使用 Harness desktop 0.2.0-rc.2,且 workspace-write 下 Shell 报 0xC0000142 的用户;尤其 README 2026-10-19 更新后仍强调的 提升权限宿主。
  • 需要 admin-security 类、在沙箱边界内恢复 Shell 可用性,并愿意接受 未审阅第三方代码 风险的用户。

不必使用

  • 非提升权限 的 Harness:shipped runner 已能启动 workspace-write 受限子进程时,维护者已在报告机上卸载并归档仓库。
  • 长期方案应关注上游对 setTokenDefaultDaclGrant 的结构修复(Discussion #9038 / #8775;#9280、#9282 已因结论更新关闭)。

安全与信任

  • 全文标注:DeepSeek V4.1-flash AI 生成,无任何人工审阅、审计或批准。安装前请自行阅读 index.js、console-shim.mjs、cordis.patch.yml。
  • 插件在 当前 DSH 进程权限 下运行;README 的安全自检列出 koffi/模块解析、诊断 env、shim 缺失、Default DACL 验证等修复项,并说明 部署面 风险:profile 以 link: 安装时,插件目录若 ACL 过宽,本地用户可能改写被执行的 patch 与源码。
  • 许可证:MIT(见仓库 LICENSE)。package.json 版本 0.2.1,engines.node 为 >=20,os 仅 win32。

兼容性

  • 子类依赖 @deepseek-ai/dsh-sandbox-local@0.2.0-rc.2 内部 API;Harness 升级后需重新评估。README 要求:在验证上游升级前应先卸载本 bundle,否则 disabled patch 可能静默丢弃 shipped sandbox 行的上游变更。

结尾

dsh-sandbox-console-fix 记录了一次针对 Windows 桌面版 ACL 沙箱在 workspace-write 下 0xC0000142 的社区规避:用 preload shim 对齐 Default DACL 或补 runner 控制台,意图在不改动文件沙箱策略的前提下恢复受限 Shell。仓库已归档,非提升宿主通常无需安装;若你仍遇同类退出码,可先对照 elevation 与 Harness 版本,再决定是否从目录或 GitHub 安装并自行审代码。

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

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

Xiaoye