🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

Windows 沙箱修复 goodbyele7-afk/dsh-windows-sandbox-fix

DeepSeek Harness
goodbyele7-afk12 天前有提交已提供中文文档扫描:含敏感能力

修复 Windows 沙箱命令全部失败的问题

29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/21 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add goodbyele7-afk/dsh-windows-sandbox-fix
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · security
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 12 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 1 处,展示前 1 条)
  • 读取本地文件
    runner-shim.mjs:116
    if (!existsSync(RUNNER)) fail("acl runner missing: " + RUNNER);
扫描于 2026/10/31(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
展开完整介绍(142 字)↓

修复 DSH 在 Windows 上 workspace-write 沙箱每条命令都报 0xC0000142 的问题。通过 runnerCommand 把未经改动的上游 ACL runner 重新托管到控制台子系统的 node.exe 下运行。不改 asar 补丁,隔离限制保持不变。

README

由 DeepSeek 最新模型翻译生成
DSH Windows 沙箱 0xC0000142 修复(配置档补丁,不改 asar) 症状:DeepSeek Harness 桌面版在 Windows 上,把权限切到 workspace-write(沙箱内) 后,任何 shell 命令都返回 [exit code: 3221225794],没有 stdout、没有 stderr。 切回 danger-full-access 立刻正常。 结论:沙箱本身没坏,是托管沙箱 runner 的宿主进程选错了——上游用 process.execPath,在桌面版里那是 GUI 子系统的 Electron 主程序,它没有控制台,而它下面要起的每个子进程都必须在受限令牌下新建一个控制台。 换成一个控制台子系统的 node.exe 托管同一份未修改的 runner,问题消失,隔离强度不打折。
展开完整文档(README 剩余 1 节)
DSH Windows 沙箱 0xC0000142 修复(配置档补丁,不改 asar)

症状:DeepSeek Harness 桌面版在 Windows 上,把权限切到 workspace-write(沙箱内) 后,任何 shell 命令都返回 [exit code: 3221225794],没有 stdout、没有 stderr。
切回 danger-full-access 立刻正常。

结论:沙箱本身没坏,是托管沙箱 runner 的宿主进程选错了——上游用 process.execPath,在桌面版里那是 GUI 子系统的 Electron 主程序,它没有控制台,而它下面要起的每个子进程都必须在受限令牌下新建一个控制台。
换成一个控制台子系统的 node.exe 托管同一份未修改的 runner,问题消失,隔离强度不打折。

3221225794 = 0xC0000142 = STATUS_DLL_INIT_FAILED

English TL;DR

On Windows, DeepSeek Harness desktop's workspace-write sandbox fails every command with
exit 3221225794 (0xC0000142, STATUS_DLL_INIT_FAILED) and empty output.

Cause: @deepseek-ai/dsh-sandbox-local launches the ACL confinement runner via
process.execPath, which under the desktop app is DeepSeek Harness.exe — a GUI-subsystem binary with no console. Every console-subsystem child the runner creates under the WRITE_RESTRICTED + Low-integrity token must allocate a console, cannot, and dies in DLL init.

Fix: override runnerCommand in the profile so a console-subsystem node.exe hosts the
unmodified upstream runner. A tiny in-process shim translates the bwrap-style argv prefix the
seam hands to a configured runner into the ACL runner's own dialect. No asar patch, no upgrade
breakage, confinement unchanged.

See README.en.md for the full English version.

1. 你是否命中这个问题

在 DSH 里执行下面任意一条,看结果:

- 会话权限设为 workspace-write,跑 echo hi → [exit code: 3221225794],无输出
- 同一个会话切到 danger-full-access,同一条命令 → 正常
- read-only 模式 → 往往能跑(这是个很有迷惑性的旁证,见 §3)

三条都符合,基本就是这个问题。

影响面

| 项目 | 值 |
| 平台 | Windows 10 / 11 |
| 关键条件 | DSH 以提权令牌运行(High Mandatory Level)时最容易命中 |
| 已验证版本 | DSH Desktop 0.2.1-rc.2(Electron 44.7.0 / Node 24.21.0 / Windows 10.0.26300) |
| 上游状态 | @deepseek-ai/dsh-sandbox-windows-acl@0.2.1-rc.1 的 lib/* 与 rc.2 逐字节相同,截至 2026-10-20 未修 |

不适用的版本:0.2.0-rc.2 及更早的差异未验证。若你的版本不同,先看 §6 的「自行确认根因」,再决定要不要用。

2. 根因

2.1 上游怎么起 runner

// @deepseek-ai/dsh-sandbox-local/lib/index.js L539-543
windowsAclRunnerInvocation() {
...
if (existsSync(builtEntry)) return [process.execPath, builtEntry];
...
}

桌面版的 process.execPath 是:

D:\...\DeepSeek Harness.exe ← GUI 子系统(PE Subsystem = 2),没有控制台

2.2 于是发生了什么

DeepSeek Harness.exe GUI 子系统,无控制台 └─ runner.js 创建 WRITE_RESTRICTED 令牌 + 降 Low 完整性 └─ cmd.exe / pwsh.exe 控制台子系统 → 必须有控制台 └─ 受限令牌下无法分配控制台 → DLL 初始化阶段死亡 → 0xC0000142

2.3 A/B 实测(决定性证据)

同一份 runner.js、同一组参数、同一台机器,只换宿主:

| 宿主 | 命令 | 结果 |
| DeepSeek Harness.exe(ELECTRON_RUN_AS_NODE=1) | cmd /c echo | 3221225794,输出全空 |
| 同目录的 node.exe(PE Subsystem = 3) | 同上 | exit 0,输出正常 |

2.4 为什么 read-only 反而是好的

read-only 把 Everyone 合并进令牌默认 DACL,控制台创建路径能通过; workspace-write 走 WRITE_RESTRICTED 能力 SID 那条路,就过不去。
GUI 程序(如 notepad)在沙箱里也能跑,因为它们不需要控制台。
这两个旁证会把人带偏——真正的分界线不是「能不能写」,而是「子进程要不要控制台」。

3. 修复原理

不动沙箱逻辑,只换 runner 的宿主进程。

DeepSeek Harness.exe
└─ node.exe(控制台子系统) ← 换这里 └─ runner-shim.mjs ← argv 方言转换(进程内) └─ import() 原版 runner.js ← 一份未修改的上游代码 └─ 受限令牌 + 能力 SID + Low 完整性 + 写入边界 ← 全部照旧

为什么 shim 必须「进程内」转换

配置了 runnerCommand 之后,seam 交给它的 argv 是 bwrap 方言:

--ro-bind / / --dev /dev --unshare-pid --proc /proc --die-with-parent
[--tmpfs /tmp --bind <ws> <ws>] -- <目标 argv...>

而 ACL runner 读的是自己的方言:

--workspace <dir> --temp <dir> --mode <read-only|workspace-write> -- <目标 argv...>

这个翻译必须在同一个进程里做。 DSH 的子进程层把目标进程的 stdio 放在 fd 4/5/6、控制通道放在 fd 7。用 stdio: "inherit" 起的大孙进程只继承 0/1/2, fd 7 就丢了,你会看到:

windows-acl-run: uv_get_osfhandle returned an invalid handle for target control fd 7

所以 shim 的做法是改写 process.argv 后直接 import() 原版 runner,让所有继承描述符原样留在 DSH 放的位置。

为什么要把依赖复制到磁盘

普通 node.exe 读不了 app.asar 内部路径(ENOENT)。所以 runner 和它的依赖闭包(实测 28 个包 / 1717 个文件 / 约 20 MB)必须落到一个真实目录里。
node.exe 本身约 89 MB——直接用系统 PATH 上的 node 也行,见 §4.2。

4. 安装

4.1 三步

1) 取出 runner 依赖闭包(纯 node,会自己解析 app.asar 头,不需要 Electron)
node scripts/extract.mjs --out "D:\dsh-sandbox-support"

2) 把宿主 node 放进去(或用 --node 指向已有的)见 4.2 copy "C:\Program Files\nodejs\node.exe" "D:\dsh-sandbox-support\node.exe"

3) 拷 shim copy runner-shim.mjs "D:\dsh-sandbox-support\runner-shim.mjs"

然后往 profile 里加配置(见 §4.3),重启 DSH。

scripts/install.mjs 会把 1–3 步和 §4.3 的 profile 写入一起做掉:

node scripts/install.mjs --out "D:\dsh-sandbox-support"

目录可以放任意位置(放系统盘外更好,避免被清理)。

4.2 宿主 node 的挑选

要求只有一条:PE Subsystem = 3(CONSOLE),且 ABI 能加载 koffi 原生模块。
最省事的做法是直接用系统安装的 Node.js——它和 DSH 自带的 Node 版本通常一致。

检查语法:

PE 子系统:3 = 控制台,2 = GUI

node -e "const b=require('fs').readFileSync('node.exe');const pe=b.readUInt32LE(0x3c);console.log('Subsystem =',b.readUInt16LE(pe+0x5c))"

顺带说明:DSH 安装目录里的 DeepSeek Harness.exe 不能当宿主,即使加了 ELECTRON_RUN_AS_NODE=1 —— 它照样是 GUI 子系统。

ABI 提醒:Electron 内置 Node 和官方 Node.js ABI 号可能不同(本机实测 Electron 报 modules 149,官方 Node.js 报 modules 137)。koffi 是本方案唯一的原生依赖,实测在官方 Node.js 下能加载;但如果你换的宿主 node 加载失败,scripts/verify.mjs 会直接报出来。

node scripts/verify.mjs --tree "D:\dsh-sandbox-support"
ok host node can load koffi (ABI compatible)

4.3 profile 配置

文件:%USERPROFILE%\.dsh\profiles\desktop\cordis.patch.yml

- id: sandbox
name: "@deepseek-ai/dsh-sandbox-local"
config:
runnerCommand:
- "D:\\dsh-sandbox-support\\node.exe"
- "D:\\dsh-sandbox-support\\runner-shim.mjs"
runnerFailureSignatures:
- "windows-acl-run"

两个字段必须成对出现——上游会校验: runnerFailureSignatures 非空但 runnerCommand 为空会抛错,反之亦然。

5. 验证

重启后:

| 检查 | 期望 |
| workspace-write 下 echo hi | exit 0,有输出 |
| pwsh 命令 | exit 0,PowerShell 7.x |
| 往工作区里写文件 | 成功 |
| 往工作区外写文件 | 失败(Access is denied / No such file or directory),文件不存在 |

最后一条是关键:修复只换宿主,不该削弱边界。如果沙箱外写入成功了,说明哪里配错了。

自动化检查:

node scripts/verify.mjs --tree "D:\dsh-sandbox-support"

6. 已知副作用

bash 的 cygheap 警告(无害)

minGW/MSYS 的 bash 每次启动会往 stderr 打一行:

0 [main] bash (2856) cygheap_user::init: NtSetInformationToken (TokenDefaultDacl), 0xC0000022

Cygwin 在受限令牌下试图改自己进程令牌的默认 DACL,被拒(0xC0000022 = STATUS_ACCESS_DENIED)。
不影响功能,退出码正常。pwsh 完全干净。

诊断技能被注销

设置 runnerCommand 后,上游会条件性注销 diagnose-windows-sandbox-acl 技能(dsh-sandbox-local L286-291)。修复生效后也不需要它。

enforcement 被硬编码为 "full"

confine() 在 runnerCommand 分支里直接写死 enforcement: "full"(L311-321),
绕过 selectRunner 的探测。上游对 windows-acl 的静态值是 "partial"。
本修复因此把「部分强制」报成了「完全强制」。
实际隔离强度等于没变的 runner.js,但这个字段会误导做安全判断的人,建议知情。

自行确认根因

如果你的版本行为不同,先做这个判断:

用 DSH 自己的 Electron 跑一次 runner(应当复现 0xC0000142)
ELECTRON_RUN_AS_NODE=1 "...\DeepSeek Harness.exe" -e "console.log(process.execPath)"

用系统 node 跑同一份 runner(应当正常)
node -e "console.log(process.execPath)"

7. 维护

DSH 升级后

asar 内容变了,支撑树会过期。重跑:

node scripts/extract.mjs --out "D:\dsh-sandbox-support"

然后重启。profile 不用改。

目录被挪走

改 profile 里的两条路径即可。

回滚

删掉 profile 里 - id: sandbox 整段,重启。同时把会话权限切回 danger-full-access,否则会退回「命令全挂」的状态。

8. 为什么不是改 asar

社区已有直接替换 app.asar 内 runner.js 的方案。它能用,但:

- 每次 DSH 升级都会覆盖 app.asar,补丁失效,需要重打
- 修改安装目录意味着你无法验证当前跑的是不是被改过的代码
- 本方案用的 runnerCommand 是上游公开的配置项,runner.js 一个字节都不动

本方案自己的代价是:支撑树需要随版本刷新,且 enforcement 字段会说谎(见 §6)。

9. 上游反馈

- Discussion #10066 ——已经是同一个根因(GUI 子系统),但只到「能解释」,没给可用修复
- T-Auto/dsh-ops#92 —— 同类现象
- Astral-Dream/dsh-windows-sandbox-0xC0000142-workaround ——改 asar 的方案

仓库里 docs/upstream-report.md 是一份可以直接贴到上游讨论区的报告草稿。

10. 免责

- 本仓库不是上游官方修复,是按 MIT 分发的第三方补丁。
- 只在少数机器上验证过,不能保证对你的环境有效。
- 修改 profile 前请自行备份。
- 用不用、怎么用,风险自负。

License

MIT
预览分享卡片长什么样 ↓goodbyele7-afk/dsh-windows-sandbox-fix
分享 · DeepSeek Harness Hub
goodbyele7-afk/dsh-windows-sandbox-fix

修复 Windows 沙箱命令全部失败的问题

回到顶部