Repository navigation
[Experimental / RFC] Windows fail-closed、native typed argv/逐流输出与Agent显式选路 - #26
KouzakiUmi wants to merge 6 commits into
Conversation
|
感谢这份 RFC——克制的标注(Experimental/RFC、明确「不是恢复真正 Windows 围栏」、不因测试绿请求合并)和两份设计文档正是我们希望看到的提交方式。维护者已对核心问题做出裁决: 裁决:接受 fail-closed 方向,但必须加运行时开关,且默认开启
在开关落地 + rebase 之前,本 PR 保持 RFC 状态,不进入正式 review。 再次感谢克制与文档质量——这正是这个仓库需要的贡献方式。 |
124f8f7 to
1c0248b
Compare
实机测试报告(本机已装插件,非源码/单元脚本)针对本 PR 已部署到本机 desktop profile 的 环境:Windows 10 / Git for Windows Bash 5.3.15( 会话政策分三段:
结论三条入口在本机 主路径可用,关键门控有效。
1.
|
| 用例 | 结果 |
|---|---|
身份:BASH_VERSION / uname / git --version |
Bash 5.3.15,MINGW64_NT,git 2.56.0.windows.2 |
~ /tmp /dev/null 盘根 |
解析正常 |
管道、glob(/usr/bin/bash*)、重定向、中文 UTF-8 |
通过 |
workdir=/tmp |
pwd → /tmp |
后台 sleep 3 |
completed,exit 0,输出含 bg-done-* |
false 后 $? |
1 |
ipconfig /all |
失败 exit 1(MSYS 吃掉 /all,打印用法) |
ipconfig //all |
成功,但 bash 按 UTF-8 收 GBK,中文乱码 |
cmd /c echo ... |
失败(/c 被当成盘根,进入交互 cmd) |
cmd //c echo ... |
成功 |
2. gitbash_to_native_path
| 输入 | 结果 |
|---|---|
/c/Users/<user> |
C:/Users/<user> |
~ / $HOME |
<home>(C:/Users/<user>) |
/tmp |
C:/Users/<user>/AppData/Local/Temp |
/dev/null |
\\.\NUL |
/usr/bin/bash |
c:/program files/git/usr/bin/bash |
/c/Program Files/Git/usr/bin/bash(空格) |
C:/Program Files/Git/usr/bin/bash |
/c/Users/<user>/测试 目录#hash(中文/空格/#) |
原样映射到 C:/Users/<user>/测试 目录#hash |
已是原生 C:\Users\<user> |
保留反斜杠 |
相对路径 foo/bar |
原样返回 |
/ucrt64/bin/git |
拒绝 NO_MOUNT_MAPPING(不把 POSIX 原样冒充 native) |
https://example.com/path |
拒绝 [URL] |
| 空字符串 | 拒绝 [EMPTY] |
3. gitbash_native
| 用例 | 结果 |
|---|---|
ipconfig.exe + 字面 /all,stdout=gbk |
exit 0,中文「Windows IP 配置」正常(未记录适配器/地址) |
whoami.exe utf-8 |
<host>\<user> |
可执行文件用 MSYS 路径 /c/Windows/System32/whoami.exe |
同样成功 |
git.exe --version |
git version 2.56.0.windows.2 |
git -C + kind:path 指向本机一个 git worktree + rev-parse --short HEAD |
exit 0,打印该 worktree 的 short HEAD(路径 argv 已翻译) |
typed cwd = /tmp |
whoami 仍成功 |
cmd.exe /c 未声明 entrypoint: interpreter |
拒绝(已知解释器必须显式 interpreter) |
补上 entrypoint: interpreter 后字面 /c echo native-cmd-ok |
native-cmd-ok,/c 未被转成盘根 |
foo.cmd / foo.bat |
拒绝:only native .exe;never wrap .cmd/.bat |
非绝对路径 whoami |
拒绝:unresolved or non-absolute typed path |
stdout=raw(whoami) |
exit 0;reliableText=false,保留 raw bytes,不把原文当 UTF-8 文本 |
stdout=utf16le 套在实际并非 UTF-16 的 whoami 上 |
exit 0 仍保留;解码呈乱码(声明编码被应用,不是自动探测) |
后台 ping.exe 127.0.0.1 -n 2,encoding=gbk |
completed,exit 0;中文 Ping 统计正常 |
4. 沙箱 / fail-closed
4.1 workspace-write
| 用例 | 结果 |
|---|---|
WW 下 bash(echo + pwd + 写 /tmp/dsh-pr26-ww-probe.txt),不升权 |
执行前拒绝。无可用 Windows Git Bash 围栏;命令未启动;禁止 unconfined 降级;禁止换工具绕过 |
WW 下 gitbash_native whoami.exe,不升权 |
执行前拒绝。无 confined backend adapter;RO/WW/缺失策略在 spawn/artifact 前拦截 |
WW 下 gitbash_to_native_path /c/Users/<user> |
仍可用:C:/Users/<user>(纯转换,不启动进程) |
对同一条 bash 探测单次批准 danger-full-access |
真正执行:pwd → 会话工作区;写出 /tmp/dsh-pr26-ww-probe.txt,内容 sandbox-write-probe |
升权之后、不再带批准再打 bash |
再次 fail-closed,命令未启动(单次批准未变成长期 full-access) |
升权之后、不再带批准再打 gitbash_native |
再次 fail-closed。该工具无 per-call 升权参数,WW 下只能拒绝 |
4.2 read-only
| 用例 | 结果 |
|---|---|
RO 下 bash(echo + pwd),不升权 |
执行前拒绝。文案与 WW 同类:无可用 Windows Git Bash 围栏;命令未启动;禁止 unconfined 降级;禁止换工具绕过。错误串标明 requested mode 为 read-only |
RO 下 gitbash_native whoami.exe,不升权 |
执行前拒绝。无 confined backend adapter;RO/WW/缺失策略在 spawn/artifact 前拦截 |
RO 下 gitbash_to_native_path /c/Users/<user> |
仍可用:C:/Users/<user> |
对同一条 bash 探测单次批准 danger-full-access |
真正执行:输出 ro-should-refuse,pwd → 会话工作区 |
升权之后、不再带批准再打 bash |
再次 fail-closed,命令未启动 |
升权之后、不再带批准再打 gitbash_native |
再次 fail-closed。无 per-call 升权参数 |
WW 与 RO 的拒绝语义一致,仅 requested mode 字符串不同。
仍未覆盖(不能当成通过)
- 未解析 / 缺失策略的实机 fail-closed(本机只打到明确的
danger-full-access/workspace-write/read-only) - 关闭
experimentalNative后的旧行为回退 - 真实 LLM 自主选路、生产 GUI、非 CRT 解释器 quoting 矩阵
- 真 Windows confinement / ACL / token / IPC
gb_*FastCtx、变体 preset、pwsh显隐(不是本 PR 三条入口的实机范围)
在上述缺口补齐前,这份报告只证明:本机已装实验构建上,三条路由入口和所列门控可工作;workspace-write 与 read-only 下自有 Bash/native 会 fail-closed,单次 full-access 批准可以放行 bash 且不粘滞。 不能当作发布或安全放行。
ddf82cf to
771c618
Compare
[Experimental / RFC] Windows fail-closed、native typed argv/逐流输出与 Agent 显式选路
行为与维护者裁决
按照维护者裁决,
gitbash-shell行 Config 提供 volatile 布尔 experimentalNative,默认 true(旧配置缺键同样开启),统一控制 fail-closed 和两个 companions。设置路径:设置 → 插件 → dsh-gitbash-shell → 实验原生执行 / fail-closed。
修改作用于现有会话后续调用,无需重启;已开始的后台 producer 保留生命周期。关闭后 shell 文件写入限制不执行,不能视为恢复真 Windows 围栏。路径方言/codePaths/子代理方言开关独立。
拒绝错误说明设置关闭路径以及用户在会话访问模式控件选择 danger-full-access 的路径;Agent 不得自行放宽权限、换工具或文件 I/O 绕拒绝。native 在准备入口、异步准备后、执行入口和最终 spawn 重验开关与 policy。
实验实现
沿用 route B 的 agent-owned 工具 scope 与 operation-owned 执行 scope,官方 root PowerShell/provider 保留。已有同名工具不覆盖;缺 native 公开能力不撤 Bash/path。官方未来开放对应 native/encoding/closed DTO API 时,按官方优先纪律整体迁移并退役插件私有实现。Artifact ownership/quota/retention 由插件自管;后台 Jobs/controller admission 不可用时明确拒绝,不静默改前台重复执行。
本轮进展(2026-10-14)
独立审查与本轮修复
未继承对话历史的子代理重新审查完整增量,确认一项 P2:OFF 期间外部注册同名工具,恢复 ON 后全局工具被遮蔽,同 agent 工具则抛 duplicate 异常并阻断后续 companion 注册。本轮已修复全部确认问题:
gitbash_to_native_path与gitbash_native共用按 agent 检查所有权的注册入口,每次刷新先注销自身注册,再检查外部全局/同 agent 所有者。实际 Core 的 knownNames 包含隐藏工具;旧宿主回退 schemas 检查,旧宿主隐藏工具行为尚未独立验证。分步审查建议
继续建议两步 review:① Bash fail-closed、唯一 Config 开关/UI、拒绝引导与旧行为回退;② native/path、输出生命周期与可见性路由。第二步复用第一步的同一字段。当前保留完整 Draft/RFC 和跨层回归,尚未另开子 PR。
验证
环境:Windows / Node 24.13.0 / Core 0.2.1-alpha.2。
已安装实验构建的三入口实机报告提供有限外部证据:入口主路径、RO/WW 拒绝、单次 Bash 批准不粘滞。报告未记录精确提交,也明确未覆盖开关 OFF、真实 LLM 自主选路、生产 GUI 与非 CRT 矩阵,不作为当前 rebase 构建的完整生产验收。
正式 review / release 尚待
四项齐后才谈 ready for review → release。真 Windows confinement/ACL/token/IPC/VM、SSH/PTY、真实磁盘耗尽/吞吐/RSS/跨任务 quota/purge 仍无完整验收,不据测试绿色宣称生产可用。