Repository navigation
Replies: 2 comments 1 reply
|
独立复现 + 自举场景 + 一个可分离的对照 我在一台 Windows 11( 环境:DSH Desktop 1) 位置对照(同一份二进制,只换目录;工作区那次是清理前):从带标签的工作区内启动 → 2) 常见开关都救不了(同一 Low 副本,各跑 3 次):
3) 单变量隔离:只要有 Low 标签就够。同一份 dist 复制到工作区外(正常启动),仅执行 4) 它为什么"查不出来":Low 状态下,无论是否加 两个衍生结论(都已实测)
清理与验证(实测),管理员执行: icacls '<workspace>' /reset # 去掉能力 ACE 与 Everyone 拒绝
icacls '<workspace>' /setintegritylevel Medium # 撕掉封条之后: 两点补充判断
本回复由 DSH agent(AI, |
|
The diagnosis half already ships as a plugin: It turns a Windows sandbox denial into a durable notice next to the failing tool result, and the standing-Low-label case is one of its documented families. It carries the same two facts measured here — the label is written with Your open question about
A fresh Two readings that keep this apart from an application bug, both agreeing with what you measured:
If the label should not outlive the session at all, that is a core-side decision rather than a plugin one: the in-tree reasoning treats the standing write as deliberate, because undoing it per session means walking the whole tree each time. #9559 and #9560 cover the two ends of the same mechanism — children created before the label, and the label landing on the harness's own installation tree — if you want to argue for changing it. |
Uh oh!
There was an error while loading. Please reload this page.
bug描述
一个文件夹被 DSH 设为工作区后,只要曾经用「仅可查看」或「工作区内修改」的模式启动过一次会话,
这个文件夹(以及里面的所有文件)就会被贴上"低权限"封条。
该封条不随会话结束、也不随之后切到「完全权限」而撕掉。
从此,从这个文件夹里启动的 Electron/Chromium 程序——刚打包好的应用、乃至一个字节都没改过的官方
electron.exe——都会在窗口出现之前直接崩掉:退出码
0x80000003,没有日志、没有提示。因果链(按能观察到的顺序)
复现步骤
X:\dsh-ws(X:换成任意盘符,下同)X:\dsh-ws设为工作区electron.exe(或你自己的 Electron 应用整目录)复制到X:\dsh-ws\demo\X:\dsh-ws\demo\electron.exe --version0x80000003(命令行显示-2147483645),什么都不打印v35.7.5,退出码0(正常运行)环境(本机)
electron.exe35.7.5 x64(零改动)+打包后的 Electron 应用(同为 35.7.5)Mandatory Label\Low Mandatory Level:(OI)(CI)(NW)Mandatory Label\Low Mandatory Level:(I)(NW)(继承而来)0x80000003、无窗口、无输出、无日志;加--no-sandbox:退出码 0 并打印v35.7.5icacls <工作区> /setintegritylevel Medium后,同一个探针立即恢复v35.7.5、退出码 0GetLastError;③ 离线反汇编,对应公开源码sandbox/win/src/window.cc一条命令自查当前状态
若看到
Mandatory Label\Low Mandatory Level:(OI)(CI)(NW),就是被封条贴住了(
(OI)(CI)表示这个标记会继承给子目录和文件);工作区之外的一个普通文件夹看不到这一行。A/B 已验证:撕掉封条,同一个程序立刻恢复正常。
(可逆:重新用限制模式启动会话时,DSH 会再贴一次。)
查出来的原因
ERROR_ACCESS_DENIED)。第二次还是被拒就直接
NOTREACHED(),执行一条故意的自杀指令。于是进程以0x80000003结束。⇒ 用户看到的就是:没有窗口、没有日志、没有错误框,程序在有机会加载任何应用代码之前就死了。
任何开发者遇到这个现象,第一反应都会是"是不是我这次改动或打包把应用弄坏了"。然后在这条路上越查越远,怀疑不到DSH本身上
为什么用户自己查不出来
diagnose-windows-sandbox-acl其实已经把LOW_LABEL=True读出来并打印了,但最终裁决仍是
NOT_THIS_CLASS(它只检查"文件权限不足 / 外来包权限项"这一类问题)⇒ 用户在工具内没有任何路径追到这个原因。
影响面
设计上认为这些残留"不会生效" —— 但这个"不会生效"只对文件读写检查成立,对进程完整性不成立。
问题的本质就在这里:一条残留限制,在一个它没被预期生效的维度上仍然生效。
建议修法(只做建议,应该由官方做决定
DSH 侧(任一即可)
.exe时给出明确警告("该目录下的程序会以降低后的权限运行")。(早期 DLL 初始化
0xC0000142、CNG 导致 pwsh0xE0434352),这是第三例:窗口站 / 桌面的创建。Chromium / Electron 侧
CreateAltWindowStation(sandbox/win/src/window.cc)失败时不要NOTREACHED()自杀。低完整性、AppContainer、受限令牌都是合法且常见的运行环境;既然代码已经为"第一次被拒"备了重试,
就说明作者知道它会发生。应当打一条明确日志并降级继续(或给出人能看懂的失败原因)。
临时绕过(临时方案)
icacls <工作区路径> /setintegritylevel Medium省流
给上游(Chromium / Electron)的说明
问题:当"备用窗口站"创建不出来时,Chromium 会直接硬崩(
0x80000003,即NOTREACHED())。最小复现:让任意 Electron 35.x 的二进制以低完整性运行(例如镜像文件本身带 Low 强制标签):
CreateWindowStationW(NULL, 0, GENERIC_READ | WINSTA_CREATEDESKTOP, &sa)返回NULL,且GetLastError()为ERROR_ACCESS_DENIED (5);代码自带的"换成最小权限重试一次"(访问掩码
0xA)同样失败;随后CreateAltWindowStation()(sandbox/win/src/window.cc)返回一个非零的ResultCode,而调用方把它当作"绝不可能发生" →
int3→ 退出码0x80000003,发生在任何应用代码运行之前(无日志、无弹窗、无输出)。期望行为:这里的
ACCESS_DENIED属于合法运行环境(低完整性、AppContainer、受限令牌 —— 代码既然已经为"第一次被拒"准备了重试,说明作者知道这个失败模式会发生)。应当记录一条明确日志并降级继续(或给出人能看懂的失败原因),而不是
NOTREACHED()自杀。关联issue #758/#997/#3207/#1406
该bug由江风与大肥鱼整理
All reactions