Repository navigation
Windows ACL 沙箱在 UNC/9P 工作区根(\\wsl.localhost\…)上 GetNamedSecurityInfoW 返回 ERROR_INVALID_FUNCTION,导致 workspace-write 下 PTC worker 启动即失败 #9315
Replies: 1 comment
|
报错、参数、失败点我都核到了,你的现象描述是准确的。但有一处归因需要更正 —— 改对之后,修复点会从"放宽分类"变成"补一次包装",落点完全不同。 1. 失败点与文案,逐字命中
getNamedSecurityInfoW(path, SE_FILE_OBJECT, DACL | LABEL, …)
…
throwWin32(api, 'GetNamedSecurityInfoW', readResult, path)
9P/WSL 不提供 Windows 安全描述符,所以 2.
|
Uh oh!
There was an error while loading. Please reload this page.
环境
0.2.0-rc.2(channelnightly,win-x64);同症状在 npm 线@deepseek-ai/dsh0.2.0-rc.2(web/CLI)上同样成立 —— 二者的@deepseek-ai/dsh-base都挂- id: ptc-runtime → @deepseek-ai/dsh-ptc-runtime-node与- id: sandbox → @deepseek-ai/dsh-sandbox-local@deepseek-ai/dsh-sandbox-windows-acl/dsh-sandbox-local/dsh-ptc-runtime-node(随 0.2.0-rc.2 打包;0.2.1-alpha.2的lib/types-Cl_DXjhk.js与 rc.2 md5 相同,未修)10.0.26300.0,PowerShell5.1.26100.95493.0.1.0,内核6.18.40.1-microsoft-standard-WSL2,Ubuntu 26.04 LTS\\wsl.localhost\...,策略workspace-write现象 / 日志
return 1;也失败 → 失败在 worker 启动阶段,与程序内容无关。danger-full-access正常(ptc-runtime对danger-full-access跳过confine())。sandbox-unavailable(runtime 里有这个分类),实际报成worker-exit,且消息里没有“这个根不支持 ACL 沙箱”的任何提示。最小复现(DSH 内)
\\wsl.localhost\<distro>\<linux 路径>(dsh-wsl-workspace插件就是这么注册的;web 侧用npx --yes @deepseek-ai/dsh@next web同样能复现),策略workspace-write。run_code任意程序(含无工具调用的return 1;)→ 必现上面报错。danger-full-access→ 成功;工作区换成 Windows 盘路径(如D:\project\…)+ workspace-write → 成功。对照结论:同一台机器、同一 API,本地 NTFS 根返回 0,9P(
\\wsl.localhost\…)根返回 1。9P 重定向器不提供安全描述符,ACL 沙箱在这类根上原理上无法工作。定位
dsh-ptc-runtime-node/lib/index.js:950→await this.ctx.sandbox.confine(argv, …)(provider 的static inject含sandbox/sandboxPolicy,解析的是它所在 realm 的服务;该行挂在宿主平面,所以永远是宿主sandbox)dsh-sandbox-local/lib/index.js:176→win32: ["windows-acl"](win32 只有这一个后端,没有 UNC/网络路径分支)dsh-sandbox-windows-acl/lib/types-Cl_DXjhk.js:400-407→readCurrentSecurity():调用点只有
grantWrite(:592)与revokeWrite(:629)→ 只有workspace-write需要写授权时才会读 ACL;read-only不申请写授权,理论上不触发(未实测)。失败发生在 worker 约束准备阶段,
dsh-ptc-runtime-node的归类(lib/index.js:1164/1170)把它落成worker-exit,而不是sandbox-unavailable。影响
workspace-write下run_code/ PTC 模式完全不可用,只能每次提权到danger-full-access(等于放弃围栏);在 WSL 场景里,插件已把 bash/fs/搜索/终端都绕开了这条运行器,只有宿主 PTC 这一条还在踩。diagnose-windows-sandbox-acl技能在这里无效 —— 它修的是 ACL 权限,而 9P 根本不提供安全描述符。官方讨论板检索结论与交叉引用(2026-10-10)
workspace-writefailures beyond0xC0000142—— 索引帖按“失败发生在哪一步”分派。它收录的是SetNamedSecurityInfoW failed (Win32 5): grantWrite(...)(ACL 授权失败)那一路,本条是读安全描述符就失败(GetNamedSecurityInfoW,Win32 1),索引里没有这一类 → 建议补一条新分支:“根无法承载安全描述符(UNC / 9P / 云盘虚拟盘)→readCurrentSecurity()抛ERROR_INVALID_FUNCTION”。SetFileSecurityW Win32 87)、[#3749](https://github.com/deepseek-ai/deepseek-harness/discussions/3749)(SMB 映射盘被判“超出工作区”)、[#9223](https://github.com/deepseek-ai/deepseek-harness/discussions/9223)(映射盘符拼写)。建议
dsh-sandbox-local/dsh-sandbox-windows-acl:对无法承载安全描述符的根显式识别(UNC 前缀 /PathIsNetworkPathW/GetDriveType=DRIVE_REMOTE,或把GetNamedSecurityInfoW的ERROR_INVALID_FUNCTION、ERROR_NOT_SUPPORTED视作“该根不支持”),返回SandboxUnavailableError(→sandbox-unavailable)并附一句可行动的说明,而不是把原始 Win32 错抛进 worker 启动路径。enforcement: 'partial'/ 只读效果 —— 这样run_code立刻可用,插件侧(WSL 世界)也不必再想办法绕。dsh-ptc-runtime-node:把 runner 准备阶段的抛错也按sandbox-unavailable归类(现在只有isRunnerSpawnFailure的窄判据),避免用户只看到worker-exit。验证修复
run_code同程序workspace-writevsdanger-full-access(修复前:前者失败、后者成功;修复后应两者都成功,且result.sandbox.enforcement如实为partial)。repro-acl.ps1(UNC 根 = 1 / NTFS 根 = 0);修复后 UNC 根上的调用不应再抛原始 Win32 错。All reactions