You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
if(ctx.shell.sandboxMode===void0)thrownewError("permission: the mounted bash executor does not confine (no sandboxMode) — "+"presets bundle a sandbox mode, so composing this plugin over an unconfined executor is a misconfiguration");
[E] [permission-preset-service] Error: permission: the mounted bash executor does not confine
(no sandboxMode) — presets bundle a sandbox mode, so composing this plugin over an
unconfined executor is a misconfiguration
at new PermissionPresetService (.../dsh-permission-presets/lib/index.js:109:47)
[E] [desktop-windows-pwsh-sandbox] Error: service "shell" has been registered at <PwshLocalExecutor>
at new PwshLocalExecutor (.../dsh-pwsh-local/lib/index.js:223:3)
at new SandboxPwshExecutor (.../dsh-pwsh-sandbox/lib/index.js:133:3)
at new DesktopWindowsPwshSandbox (.../app/lib/windows-pwsh-sandbox.js:58:3)
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
DSH Desktop (Windows):workspace-write 模式下
pwsh工具完全不可用1. 环境
2.0.10(dsh-plugin-desktop)0.1.5-rc.2@deepseek-ai/dsh-sandbox-windows-acl@0.1.5-rc.2(依赖koffi ^3.1.0、@deepseek-ai/dsh-win32-process@0.1.5-rc.2)v24.18.1(宿主日志头部)v24.21.0winver填写,例如 Windows 11 23H2 / 22631.4169)<workspace 路径>(非系统盘)whoami=<machine>\<user>,IsInRole(Administrators)= True)。已用同样提权的对照排除此项(见 §4 第 5、6 组)pwshPath回退到C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe(5.1)workspace-write(出厂默认)cordis.patch.yml无任何 pwsh/permission 相关改动2. 现象
文件策略为
workspace-write时,pwsh工具的每一次调用都返回:3221225794=0xC0000142=STATUS_DLL_INIT_FAILED:进程在 DLL 初始化阶段就退出,命令一行都没执行。echo hello这种最简命令也一样。%APPDATA%\DSH Desktop\logs全量检索windows-acl-run、0xC0000142、STATUS_DLL无任何命中。runner 只是把子进程的退出码原样回传(runner.js的return (await sandbox.spawn(...).wait()).exitCode),子进程崩溃不产生 stderr、不产生日志 —— 诊断信息完全缺失,这是本缺陷可观测性上的第二个问题。切到
danger-full-access后同一条命令立刻正常(实测两次),证明问题只出在沙箱化路径。3. 最小复现
脚本只读取安装目录、只需要一个已存在的临时目录,不修改任何 profile / 配置 / ACL 之外的持久状态(standalone 模式下临时授权会在退出时撤销)。
保存为
repro-acl-electron-pwsh.js,执行:node repro-acl-electron-pwsh.js <一个已存在的临时目录> [工作区目录]4. 实测结果
noderead-only0nodeworkspace-write0nodeworkspace-write0DSH Desktop.exe)read-only0workspace-write0xC0000142workspace-write0xC0000142对照结论(全部为同机、同账户、同提权状态,唯一变量是宿主与模式):
node启动就全部正常 → 不是沙箱实现逻辑本身坏了;read-only正常 → 不是「Electron 不能跑受限子进程」这么笼统;workspace-write这一组合,且与控制台无关(read-only同样无控制台却正常)。5. 分析(已确认 / 推断分开标注)
已确认
桌面版把 runner 的启动方式换成了 Electron 自身(
resources/app/lib/windows-pwsh-sandbox.js:33-76):argv 变成
[process.execPath, windows-acl-runner.js, upstreamRunner, ...],并注入ELECTRON_RUN_AS_NODE=1。read-only与workspace-write的差别只在受限令牌的可写 capability(lib/types-DuU3lSVe.js):read-only=[logonSid, EVERYONE];workspace-write=[logonSid, EVERYONE, workspaceSid, tempSid];setTokenDefaultDaclGrant(token, tempWriteSidPtr ?? writeSidPtr ?? worldSid)—— 于是
workspace-write把 capability SID(S-1-4-…) 写进令牌默认 DACL,而read-only写的是 EVERYONE。该文件自身的注释已经记录过同类失败(
0xC0000142、以及CREATE_NO_WINDOW/CREATE_NEW_CONSOLE的边界),说明这是已知的脆弱面,但本报告的组合不在既有注释覆盖范围内(子进程以继承方式 spawn,且node宿主完全正常)。基线故障在宿主日志中完全无记录(见 §2),
runner.js只回传子进程退出码。推断(待维护者确认)
Electron 主进程的令牌(完整性级别 / 特权集 / 所属 JOB 对象 / 默认 DACL)与 node 存在差异;当受限令牌的默认 DACL 被替换为 capability SID 时,Electron 宿主下的控制台子系统子进程无法完成 DLL 初始化,而 node 宿主下可以。read-only 之所以正常,可能正是因为它沿用了 EVERYONE 这一"人人都能访问"的默认 DACL。
建议的排查/修复方向
node.exe与DSH Desktop.exe作为 runner 宿主时的进程令牌差异(TokenDefaultDacl/TokenIntegrityLevel/受限 SID 集/JOB 归属),定位workspace-write下子进程 DLL init 失败的确切 API 失败点;0xC0000142)时输出诊断(例如windows-acl-run: child died before init, mode=…, sid=…),并入RUNNER_FAILURE_RULES;workspace-write目前不可用,唯一可用的临时手段是danger-full-access。6. 同一次调查中发现的两个关联问题(附证据,供参考)
6.1 非沙箱执行器无法替换(组合硬门槛)
@deepseek-ai/dsh-permission-presets/lib/index.js:109:把一个不设沙箱的执行器(如
@deepseek-ai/dsh-pwsh-local)挂成ctx.shell时,整棵插件树加载失败、DSH 无法启动(实测报错原文见 §7)。这意味着:sandbox-policy/fs-sandbox文件边界」这种组合绕过本缺陷;service "shell" has been registered at <PwshLocalExecutor>(见 §7)。建议:允许无 confined executor 时伴随
sandbox-policy一起降级(或给出明确的配置指引),而不是直接 fail 掉整棵插件树。6.2 Cygwin/MSYS2 系 shell 在受限令牌下无法启动
用社区插件
dsh-gitbash-shell的机制(继承@deepseek-ai/dsh-bash-sandbox,仅把内层 argv 换成bash.exe -c)实测 Git for Windows 的bash.exe(<Git 安装目录>\bin\bash.exe):workspace-write0xC0000142read-only0xC0000142nodeworkspace-write0xC0000142bash 自身给出的根因:
0xC0000022=STATUS_ACCESS_DENIED。Cygwin 初始化时需要写自己进程令牌的默认 DACL并创建 signal pipe,WRITE_RESTRICTED令牌直接拒绝 —— 注意这里read-only也失败、换node宿主也失败,说明它与 §5 的 Electron 组合问题是两个独立的失败。结论:在当前令牌方案下,
dsh-bash-sandbox家族在 Windows 上不可能工作。若官方希望支持 Git Bash / MSYS2 工具链(该社区插件方向),这是必须先解决的前置问题。7. 附:本次调查中产生过的宿主日志证据
%APPDATA%\DSH Desktop\logs\host\*.log(均为尝试"替换执行器"期间的组合错误,不是基线缺陷的日志):(§4 表格所依据的复现脚本运行时,宿主日志没有新增任何条目。)
8. 影响与临时绕行
workspace-write)下,pwsh工具 100% 不可用 → agent 无法运行任何 shell 命令(构建、测试、git 等全部不可用)danger-full-access(/permission danger-full-access或界面权限选择器)。实测可用,但会同时放弃 shell 与文件工具的工作区写入边界All reactions