DeepSeek Harness 沙箱 Low 完整性标签:快捷方式变白、程序打不开与撤销方法

故障排查发布于 2026-10-17作者: DeepSeek Plugin 插件市场
DeepSeek HarnessDSH 沙箱Low 完整性标签workspace-writeicacls setintegritylevel快捷方式图标Electron 崩溃
Windows 上用 DeepSeek Harness 的 workspace-write 打开工作区后,目录被打上可继承的 Low 完整性标签:快捷方式图标变白纸、.bat/.exe 弹「未知发布者」、Electron 启动即崩、旧子目录写不进;本文给出确认与 icacls 撤销方法。

DeepSeek Harness(DSH)的 workspace-write 不只是「会话里限制一下」——它会把工作区目录连同整棵树打上一条可继承的 Low 完整性标签,并让这个改动常驻磁盘**:移除工作区、切回「完全权限」、甚至重启 DSH 都不会自动撤销。** 于是你会看到一组看起来毫无关联的症状:工作区里的 .bat/.cmd/.exe 双击弹「无法验证发布者」、开始菜单快捷方式图标集体变成白纸、工作区内构建出来的 exe 在沙箱外也写不了 %TEMP%、被授权过的目录里 Electron 程序启动即崩(0x80000003)、工作区根能写而已存在子目录一律写不进。这些现象在本批讨论里被拆成 8 条独立报告,但根因只有一条链:标签可继承 → Windows 由映像标签决定进程完整性 → 继承范围内的一切都被降权,而沙箱没有撤销入口。本文把「怎么确认 → 怎么恢复 → 为什么会复发」讲清楚,每条都给可粘贴命令。

DeepSeek Harness 沙箱 Low 完整性标签的症状与机制:一条标签如何变成十几种故障

一句话结论:Low 标签是 SACL 上一条可继承且 no-write-up 的强制完整性 ACE,它决定的不只是权限,而是「从被标文件启动的进程,其完整性级别」——Windows 用映像文件上的标签来给进程定级。 据社区核对源码,这条 ACE 由 grantWrite() 的一次 SetNamedSecurityInfoW 写入,带 SUB_CONTAINERS_AND_OBJECTS_INHERIT 与 SYSTEM_MANDATORY_LABEL_NO_WRITE_UP 两个标志,命名 S-1-16-4096;引入点是 dsh-v0.1.7-alpha.1(提交 d5ad3baeb5,2026-09-19),首个含该行为的 tag 是 dsh-v0.1.7-alpha.1,0.1.6-alpha.2 不含它(#9819)。

机制拆成三步:

  1. 写入:连接工作区时,沙箱在工作区根写入可继承的 Low 标签(同一次调用还写 capability 允许 ACE 与 world 删除拒绝)。工作区根是「有意的常驻授权」,dispose 只撤临时授权,不回收标签(#9819)。
  2. 继承:因为带 (OI)(CI),标签向下传播到子目录与文件;这也是为什么「新建的文件」也会带标签(#9819)。
  3. 生效:Windows 在启动程序时读取映像文件上的标签来决定进程完整性。从 Low 映像启动 → 进程是 Low → 写不了 Medium 位置(%TEMP%、%LOCALAPPDATA%、\BaseNamedObjects);同时 IInternetSecurityManager::MapUrlToZone 会把带 Low 标签的文件判为 Internet 区(zone 3),而 Medium 文件是 Local Machine(zone 0)(#9819)。

DSH插件 八个真实现场:同一个根因的不同面孔

判据都指向一句「这个目录/文件被标成 Low 了」,但表现出来完全不像同一件事。 汇总如下:

现场典型症状关键点来源
工作区内可执行文件.bat/.cmd/.exe 双击弹「打开文件 - 安全警告:无法验证发布者」不是 Mark of the Web,文件里没有 Zone.Identifier 备用数据流#9819
工作区覆盖用户主目录开始菜单 51 个快捷方式全变通用白纸图标,重建图标缓存无效Windows 拒为带 Low 标签的 .lnk 解析图标#9569
工作区 = DSH 安装目录桌面端启动即退(0x5),插件安装一律 EPERMLow 标签打在 DeepSeek Harness.exe 上,从它启动的进程整体降为 Low,写不了隐式 Medium 的 userData/profile#9560
工作区内的 Electron 应用启动即崩,退出码 3 / EXCEPTION_BREAKPOINT (0x80000003),无弹窗无日志Chromium 在 Low 令牌下创建「备用窗口站」被拒,走到 NOTREACHED() 自杀#9062、#9666
工作区内构建的产物在沙箱外启动仍是 Low,写 %TEMP%/%LOCALAPPDATA% 报 UnauthorizedAccessException标签随构建产物继承到 exe;撤销能力 revokeWrite() 有实现但未导出#9314
从被授权目录启动的宿主程序跨进程拖放失效、WH_KEYBOARD_LL 全局键盘钩子失效(RegisterHotKey 却正常)进程被压到 Low,系统级功能按完整性级别分级#9666
工作区里已存在的子目录根本写不进(Access to the path … is denied),py_compile/mypy/git/node 全线失败;新建目录却可写Windows 不追溯把继承 SACL 施加到已存在对象,且授权幂等短路只检查根#9416、#9559
工作区覆盖 profile会话内受限命令报 temp 授权「材料化与清理双双失败」整棵用户 profile 被标签化后,临时根所在的目录也受影响#9569

DeepSeek Harness 为什么「切回完全权限」救不回来

因为标签不在会话里,而在磁盘上。 这一点在讨论里被反复强调:把权限模式切到「完全权限」不会清除已有标签,标签依然生效并会复发;移除工作区同样不撤销标签(#9819、#9666)。换句话说,沙箱对工作区做的是一次跨会话的持久改造,你需要自己把它撤回去。

DSH插件 编号处置:确认标签、撤销标签、验证结果

动手前先确认「确实是被打了标签」,别把 MSBuild 的安全策略、杀软拦截或文件损坏误判成同一条。四步做完,再决定改不改。

  1. 看目录上的标签。 在非受限的 PowerShell 里执行 icacls "<目录>",预期在输出中看到这一行:
Mandatory Label\Low Mandatory Level:(OI)(CI)(NW)

若没有 Mandatory Label 行,本条不成立,去查别的方向(#9819)。

  1. 看文件上的继承标签。 对可疑的 .bat/.exe 单独执行 icacls "<文件>",预期看到带 (I) 的继承项,例如 Mandatory Label\Low Mandatory Level:(I)(NW)——(I) 表示它是继承来的,而不是显式写的(#9819)。

  2. 用安全区判定做交叉验证(最有说服力)。 在 PowerShell 里执行:

powershell
[System.Security.Policy.Zone]::CreateFromUrl("file:///D:/your/workspace/app.exe").SecurityZone
#   → 3 = Internet(被标为 Low)
#   → 0 = MyComputer(Medium,正常)

据讨论中实测,同一个文件在带 Low 标签时被判为 zone 3,恢复 Medium 后回到 zone 0。这条判据比看 ACL 更直观,也更适合用来向别人证明问题(#9819)。

  1. 确认是继承而不是你手工设过。 执行 Get-ChildItem -Force -Recurse "<目录>" | Select-Object FullName 抽查几个子目录,若它们都带同一个标签,基本可断定来自工作区根的继承传播(#9819)。

DeepSeek Harness 撤销:把整棵树改回 Medium

恢复的核心只有一条命令——把标签改成 Medium,并且必须带 (OI)(CI) 与 /T 才能覆盖整棵树。 注意 icacls /reset 只重建 DACL,清不掉 SACL 里的标签,这是最常踩的坑(#9819)。

  1. 关闭所有正在使用该目录的 DSH 会话(避免恢复过程中被重新授权覆盖)。
  2. 执行恢复命令,把 <目录> 换成你的实际路径:
powershell
icacls "<目录>" /setintegritylevel "(OI)(CI)Medium" /T /C
#   /T = 递归整棵树;/C = 遇错继续;"(OI)(CI)Medium" = 目录与文件都继承 Medium
  1. 大目录需要等一会儿:Windows 会急切传播到整棵树,体量大的话耗时可达数十秒到数分钟(#9819)。
  2. 验证:重新执行 icacls "<目录>",Mandatory Label 行应变成 Medium Mandatory Level:(NW);再跑一次第 3 步的 SecurityZone 判定,预期返回 0。
  3. 重新双击启动器、重启开始菜单图标缓存(或注销重登一次),预期不再弹「无法验证发布者」、图标恢复正常。
  4. 若只想撤销单个文件的标签(例如一个被降权的构建产物),去掉 (OI)(CI) 与 /T 单独处理即可:
powershell
icacls "D:\your\workspace\app.exe" /setintegritylevel Medium

需要管理员权限的两种情形:目录属主不是当前用户、或你拿不到对象上的 WRITE_OWNER/WRITE_DAC。这两种情况下先把命令放到提权 PowerShell 里执行(#9819)。

DSH插件 已存在子目录写不进:补一次「追溯传播」

这一类不能只改根,因为问题恰恰是「根改了、子目录没跟上」。 据社区核对源码:Windows 不追溯把继承型 SACL 施加到已存在的对象,而 grantWrite() 的幂等短路只检查被授权对象本身(根一旦带标签,后续配置直接提前返回),于是已存在子目录永远补不上标签与能力 ACE(#9416、#9559)。

处置步骤(讨论中实测有效,一次性执行即可):

  1. 确认症状:echo test > "<工作区>\老目录\a.txt" 报 Access to the path … is denied,而 mkdir "<工作区>\新目录" 后往里写却成功——「新建可写、旧有不可写」就是本条的指纹。
  2. 对整棵树补一次标签传播:
powershell
icacls "<工作区>" /setintegritylevel "(OI)(CI)L" /T

讨论中在 200 个子目录的树上实测全部恢复(#9416)。

  1. 验证:重开会话后在原先写不进的目录里再写一次,预期成功。
  2. 之后新建的目录会自然继承根上的可继承标签,不需要每次重复执行。

与上一节的顺序提醒:如果你同时踩了「图标变白/程序起不来」和「旧子目录写不进」,要注意这两条的修复目标相反——前者要把标签改成 Medium(撤销),后者要补成 Low(补齐)。先判断你到底想恢复「文件可信」还是「工作区可写」,别把两条命令交替执行。

DeepSeek Harness 标签为什么会复发,以及怎么少复发

一句话结论:标签是「常驻 + 精确匹配短路」的组合,手工改回 Medium 之后,只要再以 workspace-write 打开该工作区,就很可能被重新盖回 Low;而结果取决于那一刻 DACL 里有没有 WRITE_OWNER。 社区核对源码后给出两条可能的走向(#9819):

  1. 有 WRITE_OWNER → 静默盖回 Low,表现为「我的修复被覆盖了」;
  2. 没有 WRITE_OWNER → 直接 ERROR_ACCESS_DENIED fail-closed,表现为「工作区彻底不可用」;授权前提不满足导致 workspace-write 命令整体失效的同族情形,见 DeepSeek Harness 沙箱命令全失败。

四条降低复发概率的做法:

  1. 别把用户主目录、C:\Users、盘根当工作区:这三类会让标签传播范围失控(从「一个项目目录」变成「整个 profile」),也是快捷方式图标变白、插件安装 EPERM 这类自伤的主因(#9569、#9560)。
  2. 别把 DSH 自己的安装目录当工作区:标签打到 DeepSeek Harness.exe 上会导致桌面端起不来且插件装不上,属于最难排查的自伤形态(#9560)。
  3. 构建输出挪出工作区:把 CARGO_TARGET_DIR、outDir、虚拟环境目录等指向工作区外,避免产物继承 Low 后被降权;讨论中实测「产物在工作区内必崩、挪出去 8/8 成功」(#9314)。
  4. 需要长期保持文件可信的目录,从工作区里摘出来:例如你要用受信任签名验证、或要让第三方安装器写入的目录,不要放在工作区内。

DSH插件 排查注意事项

这块最容易犯的错是「拿一条命令去修另一条症状」——先分类,再动手。 八条要点:

  1. 一句话定位:icacls "<目录>" 里有没有 Mandatory Label 行,是区分「标签问题」与「别的权限问题」的唯一入口(#9819)。
  2. /reset 无效:它只重建 DACL,清不掉 SACL 里的标签,必须用 /setintegritylevel(#9819)。
  3. 必须带 (OI)(CI) 与 /T:icacls <path> /setintegritylevel Low 不带继承标记时只标目录本身,子目录不继承——这也是为什么有些「手工复现」复现不出来(#9819)。
  4. 切权限模式不清标签:这是本族最反直觉的一点,别指望用「完全权限」恢复(#9666)。
  5. Electron 崩在 NOTREACHED():0x80000003 且无日志时,先做「同 exe 换目录」的 A/B,而不是去查应用日志(#9666)。
  6. 「新建可写、旧有不可写」是本族专属指纹:别把 Access to the path is denied 一律当 ACL 配错(#9416)。
  7. revokeWrite() 未导出是官方侧的真缺口:社区核对源码确认该函数具备清标签能力但没有对外出口,所以目前只能靠 icacls 手工撤销,而不是「官方会根据配置自动回收」(#9314)。
  8. 修复状态如实:截至 0.2.0-rc.2/0.2.1-alpha.* 的社区报告,标签仍会写入且仍无自动撤销入口;本文所有命令是用户侧手工恢复,不是官方修复。

系统级排查来回翻 icacls 输出确实费眼,而且这类问题常常和「插件装不上、装上了不加载」混在一起。如果你想先把插件侧的变量排除掉,与其在各处手敲命令,不如用 DSH Plugin Hub 这类可视化插件市场——它把插件装卸、更新确认、诊断与系统日志收在一个面板里,能帮你快速判断「到底是沙箱搞的,还是插件本身没装上」。

系统日志

来源:Discussion #9819、Discussion #9666、Discussion #9062、Discussion #9314、Discussion #9560、Discussion #9569、Discussion #9559、Discussion #9416。

常见问题

用了 DeepSeek Harness 的 workspace-write 之后,工作区里的 .bat/.exe 双击弹「打开文件 - 安全警告:无法验证发布者」,这不是杀软也不是「解除锁定」,怎么修?

DeepSeek Harness workspace-write 会让工作区里的 .bat/.exe 双击弹「无法验证发布者」,根因是沙箱写入的可继承 Low 完整性标签。目录内每个可执行文件都被物化成 Low,Windows 在启动 Low 完整性程序前会插入发布者确认框。恢复办法是执行 icacls "<工作区>" /setintegritylevel "(OI)(CI)Medium" /T /C 把整棵树改回 Medium,之后双击不再弹窗;注意下次以 workspace-write 打开同一工作区时会重新盖回 Low。

工作区的快捷方式图标和普通文件图标全变成通用白纸图标,重建图标缓存也没用,是 DeepSeek Harness 的锅吗?

工作区快捷方式图标变成白纸图标,通常是 DeepSeek Harness 写入的可继承 Low 标签搞的。当工作区覆盖到用户主目录时,可继承的 Low 标签会传播到整个 profile,Windows 拒绝为带 Low 标签的 .lnk 解析图标,于是开始菜单与桌面的快捷方式集体变白纸,重建图标缓存不解决问题。判定方法是 icacls "%USERPROFILE%" 看有没有 Mandatory Label 行,恢复用 icacls "%USERPROFILE%" /setintegritylevel Medium;根治办法是别把用户主目录或盘根当工作区。

DeepSeek Harness 的 workspace-write 会话里,工作区内的 Electron 程序(含之前一直正常的)启动即崩、退出码 3,或者报 0x80000003,为什么?

DeepSeek Harness 的 workspace-write 会话里 Electron 程序启动即崩、报 0x80000003,是因为从带 Low 标签的映像启动会把进程整体降到 Low 完整性,Chromium 在这种令牌下创建「备用窗口站」会被拒绝,于是走到 NOTREACHED() 直接自杀,所以既没有报错弹窗也没有日志。判据是同一份 exe 换到工作区外启动就正常;恢复用 icacls "<工作区>" /setintegritylevel Medium,注意把权限模式切到「完全权限」并不会自动撕掉标签。

DeepSeek Harness 的工作区根能写,但工作区里以前就存在的子目录全部写不进(Access to the path is denied),新建的目录却可以,是权限配错了吗?

DeepSeek Harness 工作区里旧子目录写不进、新建目录却可写,不是权限配错,而是 Windows 不追溯把继承型 SACL 施加到已存在的对象,而沙箱的授权幂等短路只检查被授权对象本身,所以已存在子目录永远补不上标签与能力 ACE。一次性补救是对整棵树执行 icacls "<工作区>" /setintegritylevel "(OI)(CI)L" /T,让已存在子目录也拿到标签;之后新建目录会自动继承,不再需要重复执行。

怎么快速确认一个目录是不是被 DeepSeek Harness 打了 Low 标签,而不靠猜?

确认一个目录是不是被 DeepSeek Harness 打了 Low 标签,两条命令就够:icacls "<目录>" 预期在输出里看到 Mandatory Label\Low Mandatory Level:(OI)(CI)(NW);再用 [System.Security.Policy.Zone]::CreateFromUrl("file:///<路径>").SecurityZone 判断,带 Low 标签时返回 3(Internet 区),恢复 Medium 后返回 0(Local Machine)。两条都命中即可确认是标签问题,而不是文件损坏或杀软拦截。

相关术语

Low 完整性标签(Mandatory Integrity Label)
Low 完整性标签是写在对象 SACL 上的一条强制完整性 ACE(SID S-1-16-4096,`no-write-up`,可继承),属于 Windows 强制完整性控制(MIC)的一部分。Mark 为 Low 的进程不能写 Medium 对象,DeepSeek Harness 用它把受限子进程的删除能力关在工作区内;副作用是同样被标为 Low 的文件在资源管理器里被视为低可信来源。— https://github.com/deepseek-ai/deepseek-harness/discussions/9819
icacls /setintegritylevel
icacls /setintegritylevel 是 Windows 内置工具 icacls 用来设置对象完整性级别的子命令,写的就是 SACL 里的强制完整性 ACE。加上 (OI)(CI) 可继承标记并配 /T 时会传播到整棵目录树,是撤销 DeepSeek Harness 写入的 Low 标签最直接的手段。— https://github.com/deepseek-ai/deepseek-harness/discussions/9819
standing grant(常驻授权)
standing grant 指 DeepSeek Harness 沙箱对工作区根做的一次性、跨会话复用的授权:capability 允许 ACE、world 删除拒绝 ACE 与 Low 完整性标签会被写在磁盘上并长期保留,会话结束、切换权限模式甚至重启都不清除。它带来的后果是这些安全描述符改动会在工作区目录上累积。— https://github.com/deepseek-ai/deepseek-harness/discussions/9819
EXCEPTION_BREAKPOINT(0x80000003)
EXCEPTION_BREAKPOINT 是状态码 0x80000003,通常由程序内部主动触发断点或断言失败(如 Chromium 的 NOTREACHED())产生,因此崩溃既没有弹窗也没有日志。在 DeepSeek Harness 的 Low 完整性场景里,它常见于 Electron 程序被降权后创建窗口站被拒。— https://github.com/deepseek-ai/deepseek-harness/discussions/9666

来源