You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Windows named pipes created by tools like Ninja use the platform's default named-pipe ACL when no explicit security descriptor is provided. In the elevated sandbox, the pipe owner has access, but the write-restricted token can still fail its restricted-SID access check because the sandbox user SID was not in the restricting SID set. That causes child processes to exit successfully while Ninja never receives the expected pipe completion/close behavior and hangs.
Fix: Including the elevated sandbox user's SID in the restricting SID list lets the restricted check succeed for these owner-scoped pipe objects without broadening the unelevated sandbox to the real signed-in user.
On some Windows hosts the GPU/renderer sandboxes die with STATUS_BREAKPOINT(0x80000003 / exit -2147483645). Chromium then FATAL-exits before the UI is usable.
Electron apps crash with exit_code=-2147483645 because the folder's DACL contains orphaned zombie SIDs(S-1-15...). Granting permissions to S-1-15-2-2 or running icacls /reset fixes the crash.
已知临时解法:启动时加 --disable-gpu-sandbox。
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
调查报告:Windows 沙箱内无法启动 Chromium 系浏览器
TL;DR
Windows 沙箱内可以启动普通 GUI 程序(notepad 实测成功),但启动不了任何 Chromium 系浏览器 —— 崩溃码
0x80000003。根因是已经文档化的沙箱约束:受限令牌的 restricting SID 列表是
[logonSid, Everyone],而命名管道的 client 端打开没有任何 restricting SID 被授予;Chromium 的 Mojo IPC 全走命名管道 ⇒ 打开失败 ⇒__debugbreak()。这与 #997 报告的 TLS 失败(SEC_E_NO_CREDENTIALS)是同一个 pass-2 语义的两个表现。建议:方案 A(宿主侧代抓取 + 文档化)—— 改动小、直接解决 agent 拿不到网页正文的痛点。
摘要
沙箱内可以启动 GUI 程序,但无法启动任何 Chromium 系浏览器(Chrome / Edge / Electron 应用)。
这是
@deepseek-ai/dsh-sandbox-windows-acl已经文档化的已知限制的必然结果,不是新的 bug。但对 agent 的实际能力边界影响很大 —— 它意味着沙箱内的 agent 无法用浏览器做任何事,而现代站点几乎全是 HTTPS + JS 渲染,web_search的标题+链接远不够。核心机制一句话:受限令牌的 restricting SID 列表是
[logonSid, Everyone],而命名管道的 client 端打开所请求的写访问没有任何 restricting SID 被授予 → Chromium 的 Mojo IPC 全部走命名管道 → 打开失败 →__debugbreak()→0x80000003。一、实测现象
在本机沙箱内(
workspace-write)逐项实测:cmd.exe /c echo(继承 stdio)Start-Process cmd -RedirectStandardOutputnotepad.exe(普通 GUI 程序)msedge.exe --headless=new --disable-gpu about:blank/json/version在 1 秒内响应(Edg/153.0.4234.32)、/json/list返回 7 个标签页 —— 但随后崩溃chrome.exe --headless=new ...0xFFFF7001应用程序发生异常 unknown software exception (0x80000003)⇒ 准确表述不是「不能打开软件」,而是「能打开,但用命名管道做进程间通信的程序会崩」—— 而 Chromium 系全靠这个。
二、根因(官方文档 + 源码级定位)
2.1 官方文档已写明(
dsh-sandbox-windows-acl/README.zh.md「已知限制」)同一份文档还写明(与本次实测一致):
2.2 讨论 #997 给出了源码级定位
⇒ Chromium 的 Mojo 命名管道打开失败,与 Schannel 失败是【同一个 pass-2 语义】的两个表现。
三、同类案例:三个项目撞过同一堵墙
3.1 openai/codex PR #20270 —— 修法在沙箱侧
⇒ 关键:Codex 的修法是【把所需 SID 加进 restricting 列表】,改动在沙箱侧,被隔离的程序侧无法自救。
3.2 NousResearch/hermes-agent PR #66842 —— 修复阶梯
3.3 electron/electron#51761 —— canonical issue
0x80000003),但修法不能照搬 ——icacls在 DSH 沙箱内被明确拒绝(本次实测:Access is denied)。四、建议
方案 A(推荐,改动小):文档化 + 宿主侧代抓取
web_search,由宿主进程发起、返回正文)—— 让 agent 在受限模式下仍能拿到网页内容理由:直接解决 agent 的实际痛点,不动沙箱边界。
方案 B(根治,改动大):沙箱 shell 改用非受限令牌 + 文件系统 ACL 强制
进程不再用受限令牌做全局限制,写限制改由文件系统 ACL 强制(复用现有的 capability-SID 授权机制);
read-only模式需重设计(只读 ACL / job object)。代价:需全面回归沙箱边界。收益:TLS 与 Chromium 一并解决。
方案 C(研究路径):补充 restricting SID 列表
参照 Codex 的做法,识别 pass-2 拒绝的具体安全对象并补充所需 SID。实验成本高、收益不确定。
不建议:在沙箱内加
--no-sandbox本次实测
--no-sandbox无效(Chromium 即使关掉自己的沙箱,浏览器↔渲染进程仍走 Mojo 命名管道)。而且它会削弱 Chromium 自身的安全边界。五、我试过并失败的(避免别人重复)
在 Windows /
workspace-write下,以下全部失败:唯一「部分成功」的是
--headless=new:主进程起来了、调试端口开了,然后仍崩。六、参考实现(宿主侧,可绕开沙箱)
因为问题在沙箱侧,正确做法是把浏览器控制放在宿主进程。调研到的两个参考:
@deepseek-ai/dsh-browser(rc,npm 未公开)browser_open/browser_actJSON.parse裸调、无onclose、send无超时、spawn无 error 监听)dsh-browser-control(第三方)browser_*工具launch.sh是 macOS 专用($HOME/Library/...、/Applications/Google Chrome.app、pkill),Windows 跑不起来;且拷贝含Login Data的凭据副本到/tmp后--kill不清理第三方插件的「登录态复用」思路值得借鉴:新版 Chrome 禁止在默认
user-data-dir上开--remote-debugging-port,它的做法是把关键 profile 文件拷到隔离目录,再用隔离目录启动。七、证据附录
本报告由 dsh-desktop-kit 项目在实机调研后整理,全部结论均有实测或官方原文出处;未能证实的内容已明确标注。
All reactions