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 在特定權限環境下的兼容性問題,通過犧牲部分完整性標籤機制換取功能可用性。隨着上游沙箱包升級或問題修復,建議及時卸載。