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
… Each grant therefore also denies FILE_DELETE_CHILD to the world SID … and labels the same directory Low in the one SetNamedSecurityInfoW call that applies all three edits.
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.
Summary
在 Windows 上,只要某个 DSH 会话以
read-only或workspace-write在工作区目录中执行过任意一条 shell 命令,dsh-sandbox-windows-acl就会给该目录写入一个**永久生效(standing,永不撤销)**的 Low 完整性强制标签(mandatory label)。该标签带NO_WRITE_UP且可继承,会立即传播到整棵目录树。后果:工作区内任何以普通(Medium)完整性运行的进程都无法再写入这些路径。受影响的不只是 DSH——用户自己的构建与开发工具链全部受影响。本次实际表现是 Electron 应用启动时静默退出(exit 3),项目无法再
dev启动,而 DSH 未提供任何撤销该标签的入口。受影响的用户场景:任何把日常开发项目目录作为 DSH 工作区打开、并使用默认
workspace-write预设的人。触发条件是该目录中执行过一次 shell 命令。Reproduction
环境:Windows x64、
dsh0.1.7-rc.2、profileweb。icacls 'G:\path\to\project'预期:只有
BUILTIN\Administrators/SYSTEM/Authenticated Users/Users等常规继承 ACE,无S-1-4-*、无DENY、无Mandatory Label行。在 DSH Web 中将该目录作为工作区打开,保持权限预设为
workspace-write,执行任意一条 shell 命令(bash或pwsh工具均可,例如echo ok)。再次检查该目录及其任一子目录:
Current behavior
第 3 步后,目录 ACL 变为(实测输出,已脱敏):
Mandatory Label\Low Mandatory Level:(OI)(CI)(NW)—— Low 完整性标签,NW为NO_WRITE_UP,(OI)(CI)使其向下继承。(I)(OI)(CI)(NW),文件显示(I)(NW),即已全部继承。实测继承范围:一个含
node_modules的项目目录被标记后,icacls <dir> /setintegritylevel M /T需要处理 85613 个对象,即整棵树都被写入。第 4 步:Electron 应用启动时静默退出,exit code 3,无错误输出。原因推断为 Chromium 需要把 ICU 数据映射/写入工作区内的路径,而 Low 完整性标签与
NO_WRITE_UP使完整性检查失败。S-1-4-<a>-<b>与workspaceWriteSid()由工作区路径推导的结果逐位一致,可确认为本后端所写(见下方证据)。此外,撤销途径缺失:
dispose()不撤销它们。icacls清理在本平台会失败。实测确认:icacls <dir> /grant "*S-1-4-<a>-<b>:..."返回ERROR_NONE_MAPPED(1332),因为sucount无法映射该派生 SID。Expected behavior
沙箱的写边界应当只约束被它启动的子进程,而不应使工作区对用户自己的普通进程变为只读/不可写。
至少应满足其一:
Environment
dshCLI 自package.json上报),profilewebwin32/x64)@deepseek-ai/dsh-sandbox-windows-acl、@deepseek-ai/dsh-sandbox-local、@deepseek-ai/dsh-sandbox-policyworkspace-write(approval: ask);read-only同样触发danger-full-access预设后不再触发(该模式不经过confine())给维护者的补充材料
证据链
1. 派生 SID 由本后端算法产生。
workspaceWriteSid()对规范路径做 SHA-256 后取两个 30 位子权限:以实测路径代入该函数(
workspaceRoot摘要计算位于:36),结果与目录 ACL 中的派生 SID 完全一致(S-1-4-440924568-613075690)。2. 三项改动与
grantWrite()的一次性写入一致。 目录 ACL 同时出现了 capability-SID allow ACE、FILE_DELETE_CHILD的 world deny、以及 Low no-write-up 标签,对应 README § Mechanism 所述的"一条SetNamedSecurityInfoW调用中应用全部三项编辑"。根因
触发路径(均为只读确认):
与既有决策记录的差异。 2026-09-19 决策记录 § Bought 记录的代价是:
README § Known Limitations 同样表述为:
两处描述的都是宽松化方向(Low 进程获得了写权限),属已知且被接受的边界放松。
但实际后果是反向的:Medium 完整性进程(Electron/Chromium、普通构建工具)因目标被标 Low 而被拒绝写入,导致工作区对用户自己的工具链变为不可用。这一方向未见于上述两处记录,也未见于决策记录 § Cost 列表。
换言之:已评估的代价是"边界变松",未评估的代价是"用户工作区对普通进程变为只读,且不可撤销"。
建议修复方向
按影响从大到小:
icacls无法处理S-1-4-*(ERROR_NONE_MAPPED),使任何依赖icacls的清理脚本都失效;若提供清理命令,需走 Win32 API 而非icacls。用户侧规避与恢复(供其他遇到者参考)
规避:在该类目录中将会话设为
danger-full-access(不经过confine(),不写标签)。恢复(本次实测有效,在一个含
node_modules的目录上处理了 85613 个对象、0 失败):注:
/setintegritylevel M /T会把标签改为显式Medium Mandatory Level:(NW),与"完全无标签"不等价,但不再阻断 Medium 进程。恢复后新创建的文件不再继承 Low 标签。All reactions