半肾
精华
|
战斗力 鹅
|
回帖 0
注册时间 2019-8-21
|
我让d老师自己修了,你把下面内容让DSH验证下就是了
dsh-sandbox-console:让 DSH 的 Windows ACL 沙箱在本机可用
这是什么
一个垫片,用来修好 DSH 的 shell 沙箱(workspace-write 模式)。 装上它之后:pwsh 命令在工作区内正常读写,工作区外一律写入被拒(读取仍可用), 也就是"没经我批准不能在工作区外写入文件"。
根因(全部为实测结论)
DSH 的 Windows 沙箱后端 @deepseek-ai/dsh-sandbox-windows-acl 用 CreateRestrictedToken 造受限令牌,再以它启动 pwsh。
这个受限子进程必须有可用控制台,否则在 DLL 初始化阶段以 0xC0000142(STATUS_DLL_INIT_FAILED)死亡。实验:
runner 有控制台 → 受限 pwsh 正常;
runner 用 DETACHED_PROCESS(无控制台)启动 → 受限 pwsh / node / 任何包装脚本全部 0xC0000142。
DSH 的 runner 是用 process.execPath(DeepSeek Harness.exe,GUI 子系统) 以 ELECTRON_RUN_AS_NODE 启动的;而 GUI 子系统进程永远拿不到控制台——实测: 父进程有控制台时,Electron 子进程的 GetConsoleWindow() 仍为 null。 DSH 宿主自身也没有控制台(用 AttachConsole 逐进程判定过)。
结论:在本机(桌面版 DSH)这条链路永远缺控制台,于是每个 pwsh 调用都 0xC0000142。 (旧笔记把它归因于"缺 keep-alive 组 / WRITE_OWNER",都不对。)
修法(不改 DSH 安装目录)
%USERPROFILE%\.dsh\profiles\desktop\cordis.patch.yml 末尾给 sandbox 行加:
yaml
- id: sandbox
name: '@deepseek-ai/dsh-sandbox-local'
config:
runnerCommand: [!!js process.execPath, 'C:/DSHWZ/tools/dsh-sandbox-console/runner-command-shim.js']
runnerFailureSignatures: ['windows-acl-run:']
runner-command-shim.js 做三件事:
AllocConsole() 申请一个控制台并把窗口隐藏(受限子进程因此能正常初始化);
把 sandbox-local 传来的 bwrap 风格参数翻译成 ACL runner 的 --workspace / --temp / --mode(从 --bind <ws> <ws> 取工作区、判断是否 workspace-write);
在同一进程内加载真 runner(多开一个子进程没用:GUI 子进程不继承控制台)。
诊断日志:acl-runner-shim.log(本目录,超过 256 KB 自动截断)。
已知代价
因为走的是 runnerCommand,sandbox-local 会把"拒绝"方言当成 read-only file system / permission denied:实际拦截有效,但工具里"是否被判定为拒绝"的 标记可能不准(中文系统的报错文本匹配不上英文签名)。
runnerCommand 模式下不再注册 diagnose-windows-sandbox-acl 技能。
工作区授权 ACE 会留在工作区目录上(这是 DSH 设计的复用缓存,正常)。
回退
双击 revert-sandbox.cmd(把 cordis.patch.yml 还原成改动前的版本),或手动删掉上面那段 id: sandbox 覆盖;
重启 DSH。
回退后 shell 仍可用,但不再隔离(pwsh 以宿主权限运行,工作区外也能写)。
验证清单
powershell
# 1) 沙箱生效
echo hi
# 2) 边界:工作区内可写、工作区外被拒
[IO.File]::WriteAllText('C:\DSHWZ\probe.txt','x'); Remove-Item C:\DSHWZ\probe.txt
[IO.File]::WriteAllText('C:\probe.txt','x') # 应报拒绝
|
|