DSH 0.1.7 引入了基于 ACL 的沙箱机制,要求 workspace-write 策略下的命令在 spawn 前必须通过权限授权。在非系统盘工作区(如 D:/E:/F:)下,由于目录默认 ACL 不含创建者 FullControl、且 DSH 运行在 UAC 过滤令牌下,调用 SetNamedSecurityInfoW 时因缺少 WRITE_OWNER 权限返回 Win32 5 错误,导致沙箱 fail-closed。dsh-acl-sandbox-patch 是一个临时修复插件,通过包装底层 API 恢复命令执行能力。
插件信息¶
dsh-acl-sandbox-patch 是一个针对 DSH 0.1.7 Windows ACL 沙箱在非系统盘工作区下全部命令 spawn 前失败的临时修复插件。
- 维护者:masknull
- 分类:admin-security
- 许可证:MIT
- GitHub:github.com/masknull/dsh-acl-sandbox-patch
核心功能¶
- 修复非系统盘工作区失败:解决 DSH 0.1.7 在非系统盘工作区下,
grantWrite授权调用失败导致命令无法 spawn 的问题。 - API 包装与降级:包装
SetNamedSecurityInfoW。当写入Low完整性标签失败时,自动降级为仅注入 DACL(剥离LABEL_SECURITY_INFORMATION),依赖属主隐式WRITE_DAC权限完成授权。 - 令牌完整性控制:包装
SetTokenInformation。检测工作区是否包含Low完整性强制标签。若不存在,跳过子进程令牌降级,避免因 no-write-up 策略导致写操作被拒。 - 平台限制:仅限 Windows 平台,其他平台自动 no-op。
- 版本兼容:支持 DSH >= 0.1.7-rc.1。
安装¶
通过官方插件命令安装,该命令会链接包并记入依赖。
dsh plugin --profile web add github:masknull/dsh-acl-sandbox-patch
安装后需重启 DSH 使新 bundle 层生效。重启日志应显示激活信息。
典型用法¶
安装并重启 DSH 后,新会话中的 workspace-write 命令将直接执行,无需逐条批准。
- 执行基础命令:
whoamiecho hi
- 验证文件操作:
- 在沙箱内执行
New-Item建立文件。 - 覆写已存在文件。
- 在沙箱内执行
注意事项¶
- 生效方式:必须重启 DSH。插件通过
NODE_OPTIONS注入预加载,仅对重启后的新进程生效。 - 性能影响:重启后首条
workspace-write命令较慢(需传播 DACL)。实测在 44,251 个文件的工作区上约需 20 秒;同进程后续命令约 1.7 秒;新开会话约 2 秒。 - 旧 Runner 问题:重启前已建立的会话,其命令通道可能由旧 runner 处理(重启不回收),行为可能异常。新开会话即可恢复正常。
- 安全边界变化:
- 保留:
WRITE_RESTRICTED令牌、capability SID Allow ACE、world SID Deny ACE、fail-closed 策略。 - 失去:仅在降级场景下,移除了
Low完整性强制标签这一层纵深防御。
- 保留:
- 供应链安全:建议使用固定提交版本,例如
github:masknull/dsh-acl-sandbox-patch#<commit sha>。
总结¶
该插件解决了 DSH 0.1.7 在特定权限环境下的兼容性问题,通过牺牲部分完整性标签机制换取功能可用性。随着上游沙箱包升级或问题修复,建议及时卸载。