DeepSeek Harness 沙箱 Low 完整性标签:快捷方式变白、程序打不开与撤销方法
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)。
机制拆成三步:
- 写入:连接工作区时,沙箱在工作区根写入可继承的 Low 标签(同一次调用还写 capability 允许 ACE 与 world 删除拒绝)。工作区根是「有意的常驻授权」,dispose 只撤临时授权,不回收标签(#9819)。
- 继承:因为带
(OI)(CI),标签向下传播到子目录与文件;这也是为什么「新建的文件」也会带标签(#9819)。 - 生效: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),插件安装一律 EPERM | Low 标签打在 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 的安全策略、杀软拦截或文件损坏误判成同一条。四步做完,再决定改不改。
- 看目录上的标签。 在非受限的 PowerShell 里执行
icacls "<目录>",预期在输出中看到这一行:
Mandatory Label\Low Mandatory Level:(OI)(CI)(NW)
若没有 Mandatory Label 行,本条不成立,去查别的方向(#9819)。
-
看文件上的继承标签。 对可疑的
.bat/.exe单独执行icacls "<文件>",预期看到带(I)的继承项,例如Mandatory Label\Low Mandatory Level:(I)(NW)——(I)表示它是继承来的,而不是显式写的(#9819)。 -
用安全区判定做交叉验证(最有说服力)。 在 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)。
- 确认是继承而不是你手工设过。 执行
Get-ChildItem -Force -Recurse "<目录>" | Select-Object FullName抽查几个子目录,若它们都带同一个标签,基本可断定来自工作区根的继承传播(#9819)。
DeepSeek Harness 撤销:把整棵树改回 Medium
恢复的核心只有一条命令——把标签改成 Medium,并且必须带 (OI)(CI) 与 /T 才能覆盖整棵树。 注意 icacls /reset 只重建 DACL,清不掉 SACL 里的标签,这是最常踩的坑(#9819)。
- 关闭所有正在使用该目录的 DSH 会话(避免恢复过程中被重新授权覆盖)。
- 执行恢复命令,把
<目录>换成你的实际路径:
icacls "<目录>" /setintegritylevel "(OI)(CI)Medium" /T /C
# /T = 递归整棵树;/C = 遇错继续;"(OI)(CI)Medium" = 目录与文件都继承 Medium
- 大目录需要等一会儿:Windows 会急切传播到整棵树,体量大的话耗时可达数十秒到数分钟(#9819)。
- 验证:重新执行
icacls "<目录>",Mandatory Label行应变成Medium Mandatory Level:(NW);再跑一次第 3 步的SecurityZone判定,预期返回 0。 - 重新双击启动器、重启开始菜单图标缓存(或注销重登一次),预期不再弹「无法验证发布者」、图标恢复正常。
- 若只想撤销单个文件的标签(例如一个被降权的构建产物),去掉
(OI)(CI)与/T单独处理即可:
icacls "D:\your\workspace\app.exe" /setintegritylevel Medium
需要管理员权限的两种情形:目录属主不是当前用户、或你拿不到对象上的
WRITE_OWNER/WRITE_DAC。这两种情况下先把命令放到提权 PowerShell 里执行(#9819)。
DSH插件 已存在子目录写不进:补一次「追溯传播」
这一类不能只改根,因为问题恰恰是「根改了、子目录没跟上」。 据社区核对源码:Windows 不追溯把继承型 SACL 施加到已存在的对象,而 grantWrite() 的幂等短路只检查被授权对象本身(根一旦带标签,后续配置直接提前返回),于是已存在子目录永远补不上标签与能力 ACE(#9416、#9559)。
处置步骤(讨论中实测有效,一次性执行即可):
- 确认症状:
echo test > "<工作区>\老目录\a.txt"报Access to the path … is denied,而mkdir "<工作区>\新目录"后往里写却成功——「新建可写、旧有不可写」就是本条的指纹。 - 对整棵树补一次标签传播:
icacls "<工作区>" /setintegritylevel "(OI)(CI)L" /T
讨论中在 200 个子目录的树上实测全部恢复(#9416)。
- 验证:重开会话后在原先写不进的目录里再写一次,预期成功。
- 之后新建的目录会自然继承根上的可继承标签,不需要每次重复执行。
与上一节的顺序提醒:如果你同时踩了「图标变白/程序起不来」和「旧子目录写不进」,要注意这两条的修复目标相反——前者要把标签改成 Medium(撤销),后者要补成 Low(补齐)。先判断你到底想恢复「文件可信」还是「工作区可写」,别把两条命令交替执行。
DeepSeek Harness 标签为什么会复发,以及怎么少复发
一句话结论:标签是「常驻 + 精确匹配短路」的组合,手工改回 Medium 之后,只要再以 workspace-write 打开该工作区,就很可能被重新盖回 Low;而结果取决于那一刻 DACL 里有没有 WRITE_OWNER。 社区核对源码后给出两条可能的走向(#9819):
- 有
WRITE_OWNER→ 静默盖回 Low,表现为「我的修复被覆盖了」; - 没有
WRITE_OWNER→ 直接ERROR_ACCESS_DENIEDfail-closed,表现为「工作区彻底不可用」;授权前提不满足导致 workspace-write 命令整体失效的同族情形,见 DeepSeek Harness 沙箱命令全失败。
四条降低复发概率的做法:
- 别把用户主目录、
C:\Users、盘根当工作区:这三类会让标签传播范围失控(从「一个项目目录」变成「整个 profile」),也是快捷方式图标变白、插件安装EPERM这类自伤的主因(#9569、#9560)。 - 别把 DSH 自己的安装目录当工作区:标签打到
DeepSeek Harness.exe上会导致桌面端起不来且插件装不上,属于最难排查的自伤形态(#9560)。 - 构建输出挪出工作区:把
CARGO_TARGET_DIR、outDir、虚拟环境目录等指向工作区外,避免产物继承 Low 后被降权;讨论中实测「产物在工作区内必崩、挪出去 8/8 成功」(#9314)。 - 需要长期保持文件可信的目录,从工作区里摘出来:例如你要用受信任签名验证、或要让第三方安装器写入的目录,不要放在工作区内。
DSH插件 排查注意事项
这块最容易犯的错是「拿一条命令去修另一条症状」——先分类,再动手。 八条要点:
- 一句话定位:
icacls "<目录>"里有没有Mandatory Label行,是区分「标签问题」与「别的权限问题」的唯一入口(#9819)。 /reset无效:它只重建 DACL,清不掉 SACL 里的标签,必须用/setintegritylevel(#9819)。- 必须带
(OI)(CI)与/T:icacls <path> /setintegritylevel Low不带继承标记时只标目录本身,子目录不继承——这也是为什么有些「手工复现」复现不出来(#9819)。 - 切权限模式不清标签:这是本族最反直觉的一点,别指望用「完全权限」恢复(#9666)。
- Electron 崩在
NOTREACHED():0x80000003且无日志时,先做「同 exe 换目录」的 A/B,而不是去查应用日志(#9666)。 - 「新建可写、旧有不可写」是本族专属指纹:别把
Access to the path is denied一律当 ACL 配错(#9416)。 revokeWrite()未导出是官方侧的真缺口:社区核对源码确认该函数具备清标签能力但没有对外出口,所以目前只能靠icacls手工撤销,而不是「官方会根据配置自动回收」(#9314)。- 修复状态如实:截至
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 双击弹「无法验证发布者」,根因是沙箱写入的可继承 Low 完整性标签。目录内每个可执行文件都被物化成 Low,Windows 在启动 Low 完整性程序前会插入发布者确认框。恢复办法是执行 icacls "<工作区>" /setintegritylevel "(OI)(CI)Medium" /T /C 把整棵树改回 Medium,之后双击不再弹窗;注意下次以 workspace-write 打开同一工作区时会重新盖回 Low。
工作区快捷方式图标变成白纸图标,通常是 DeepSeek Harness 写入的可继承 Low 标签搞的。当工作区覆盖到用户主目录时,可继承的 Low 标签会传播到整个 profile,Windows 拒绝为带 Low 标签的 .lnk 解析图标,于是开始菜单与桌面的快捷方式集体变白纸,重建图标缓存不解决问题。判定方法是 icacls "%USERPROFILE%" 看有没有 Mandatory Label 行,恢复用 icacls "%USERPROFILE%" /setintegritylevel Medium;根治办法是别把用户主目录或盘根当工作区。
DeepSeek Harness 的 workspace-write 会话里 Electron 程序启动即崩、报 0x80000003,是因为从带 Low 标签的映像启动会把进程整体降到 Low 完整性,Chromium 在这种令牌下创建「备用窗口站」会被拒绝,于是走到 NOTREACHED() 直接自杀,所以既没有报错弹窗也没有日志。判据是同一份 exe 换到工作区外启动就正常;恢复用 icacls "<工作区>" /setintegritylevel Medium,注意把权限模式切到「完全权限」并不会自动撕掉标签。
DeepSeek Harness 工作区里旧子目录写不进、新建目录却可写,不是权限配错,而是 Windows 不追溯把继承型 SACL 施加到已存在的对象,而沙箱的授权幂等短路只检查被授权对象本身,所以已存在子目录永远补不上标签与能力 ACE。一次性补救是对整棵树执行 icacls "<工作区>" /setintegritylevel "(OI)(CI)L" /T,让已存在子目录也拿到标签;之后新建目录会自动继承,不再需要重复执行。
确认一个目录是不是被 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
来源
- #9819 — Windows sandbox: workspace folders get a Low integrity label, so Windows treats their files as Internet-zone· deepseek-ai(GitHub Discussions)
- #9666 — 【bug】工作区被贴过「低权限」的标签后不会撕掉,且完全权限会话里工作区内的程序会继承标签并崩溃· deepseek-ai(GitHub Discussions)
- #9062 — sandbox-windows-acl 的 standing Low 标签导致工作区内全部 Electron 应用无法启动· deepseek-ai(GitHub Discussions)
- #9314 — Workspace-write provisioning leaves a persistent Low integrity label on built executables· deepseek-ai(GitHub Discussions)
- #9560 — Windows:工作区的 Low 完整性标签打在 DSH 自身二进制上时,桌面端无法启动、插件安装必然 EPERM· deepseek-ai(GitHub Discussions)
- #9569 — Windows:工作区覆盖用户主目录导致开始菜单快捷方式图标全部变空白· deepseek-ai(GitHub Discussions)
- #9559 — windows-acl: Low integrity label (and allow ACE) not applied to existing subdirectories· deepseek-ai(GitHub Discussions)
- #9416 — 工作区不可写:低完整性标签没有铺到已存在的子目录· deepseek-ai(GitHub Discussions)