Files
ycode/docs/沙盒参考代码评估-2026-10-18.md
T

104 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 沙盒参考代码与 YCode 接入评估(2026-10-18)
> 后续实施已完成自有沙盒首版,见[实施与维护基线](自有沙盒首版实施-2026-10-18.md)。本文保留此前评估时的代码状态,不代表后续沙盒仍未接入。
## 结论
可以据此完善 YCode,尤其是统一策略、文件操作代理、安全删除、调用归属与审计。不过,`C:/Users/Administrator/code/沙盒` 是逆向分析资料和部分客户端脚本的集合,不是可以直接安装的完整 Windows 沙盒工程。
当前 YCode 已有工作区路径检查和文件写入审批,但尚未接入模型命令的系统级隔离。最合适的实施方式是保留 OMP 与备用内核共用的宿主工具入口,在其下增加策略服务、文件事务和独立的 Windows 执行后端;参考包里的 shim 放在这套后端之上接入。仅复制 shim、设置环境变量或取消当前命令限制,不能补齐系统沙盒。
本轮完成材料核对、YCode 执行路径审查和临时目录中的权限基线探测;**未修改业务代码,未启用新沙盒,未连接或重启 WorkBuddy/YCode 的用户进程**。
## 证据与版本范围
材料 README 将对象标为 WorkBuddy 5.8.6 / Windows x64,采集日期为 2026-10-17。这是资料作者的版本声明;随包可导入的 REA Evidence 未单独证明该版本号,不能与项目历史的 5.8.2/5.8.3 原版基线混为一谈。
本轮所有原版脚本实现的核对均通过 REA,不直接读取或执行所附原版 shim。README 和 `runtime_facts.txt` 作为分析者说明阅读,其原生机制、运行实况与具体数值仍需对应的 REA 证据复核。未直接审读附带的 `.c` 反编译正文。
| 证据 | 本轮核对结果与范围 |
| --- | --- |
| 原随包 `evidence/rea_evidence.json` | REA 成功导入 2 条记录,0 条 unknown;该数字只表示本包包含的记录,不代表不存在实现未知项 |
| `ev_74bf702462bc37612d2a68ea2e1c93b30b77dd5d99eaf1e961f1ab36d626c5e3` | 原安装位置 `cli/vendor/shim` 的静态 JavaScript 分析,8 个 JS 文件;不是进程运行验证,也没有附带原生分析记录 |
| `ev_2860ca8fafaf310ee1adc2ebe31530c868da0ecbb41a6f451e8e8e86b447a078` | 本轮 REA 分析所给目录中的 8 个 CJS 文件和 `rules/tsbx_rules.json`;8 个 JS 均解析成功,源码正文解析失败数为 0 |
| `ev_3c27ca6a1b13c90777b729eac969ce3aa20a232145bfd342d6e13e76b4ac8c9d` | 本轮目录静态分析摘要;应用关系图 partial、语义图 unknown,保留 2699 项语义未知;规则 JSON 只确认解析与顶层字段,未据此宣称策略生效 |
| 两份静态分析中的文件身份 | 按 basename 对照的 8 个 CJS SHA-256 全部相同,确认提供的 JS 副本与随包 REA 记录中的字节身份一致;不证明运行环境等价 |
本轮 REA 输入目录摘要为 `d87c4cab25fb1feec426332fe01b1680538577405cf82476cb6f5b1b14d94b84`。选择范围不包含材料中的 Python、Shell、Ghidra 伪代码正文;REA 当前 JavaScript 入口不支持将这些作为源码选择项。调用返回明确的 `source_paths` 不支持错误后,已缩小到支持范围,未改走其他采集渠道。
本地证据产物(`.tmp` 为本机验证产物,不随业务代码发布):
- `.tmp/sandbox-assessment-20261018-evidence.json`:REA 导出的 7 条记录,包括导入记录、本轮分析和选定视图,约 33.8 MB。
- `.tmp/sandbox-assessment-20261018-identities.json`:8 个 JS 文件的原/副本摘要对照。
- `.tmp/sandbox-assessment-20261018-probe.json`:YCode 当前权限基线的 11 项受控检查。
- `.tmp/sandbox-assessment-probe-20261018.mjs`:可复现探测脚本;执行命令为 `node .tmp/sandbox-assessment-probe-20261018.mjs`。
## 当前 YCode 的实际边界
| 执行位置 | 已实现 | 与完整沙盒的差距 |
| --- | --- | --- |
| `src/main/agent/tools/index.ts` | `realpath` 后的工作区检查;默认模式拒绝越界;写入前审批并再次检查路径/内容;原子替换文件 | 只覆盖这些宿主文件工具,没有统一敏感文件策略、通用删除代理或任意进程文件隔离 |
| 同文件 `execute_command` | 默认模式立即拒绝;只有 `full-access` 才调用普通 `spawn(shell: true)`,Windows 取消使用 `taskkill /T` | 未实现受限进程启动、系统级文件/注册表/网络规则;`cwd` 只是启动位置;该命令分支未显式净化继承的环境变量 |
| `src/main/agent/conversation-tools.ts` / `omp-turn.ts` | OMP 与备用循环共用宿主工具与审批;OMP 启动参数含 `--no-tools` | 可以接入统一沙盒服务,无需为此更换 OMP;OMP 自身进程目前也没有系统级隔离 |
| `src/main/capabilities/mcp.ts` / `runtime.ts` | MCP 配置摘要信任、连接代次、每次调用审批;HTTP origin 保护 | 本地 stdio MCP 启动没有接系统沙盒;调用获批不等于插件进程已隔离。远程 MCP 的外部副作用需独立标明权限范围 |
| `src/main/terminal-host.ts` | 用户终端使用 ConPTY/PowerShell,限制窗口归属和资源数量,过滤部分敏感环境变量 | 独立于模型命令权限,当前没有系统沙盒;用户手动终端与模型自动执行应明确各自边界,不能误算成模型工具已隔离 |
| `src/main/workspace-revert.ts` / `src/shared/revert.ts` | 对有完整 before/after 的 `write_file` / `edit_file` 实现回滚并检查外部改动 | 不覆盖任意命令、MCP、副进程或删除产生的所有变化;不能替代通用文件备份事务 |
| 权限菜单与安全中心 | 已有默认/完全访问状态和确认;安全中心导航保留 | 权限菜单刻意将原版“安全沙箱”描述适配为“默认权限”;设置安全中心尚无页面分支,不能只接 UI 宣称后端已启用 |
## 参考材料中可以利用的部分
以下源位置均指 REA 静态图返回的行号与符号,不代表本轮执行过这些原版函数。
| 材料 | 已取得的静态事实 | 对 YCode 的用途 |
| --- | --- | --- |
| `shims/broker-ipc-client.cjs` | `sendBrokerRequest`(151 行)、`sendBrokerRequestSync`(209 行)、队列优先级/低优先级淘汰/超时相关函数 | 参考 IPC 客户端的同步/异步分工、背压、错误分类;服务端认证、协议上限、取消和断线策略需另行完整定义 |
| `shims/node-brokered-fs-shim.cjs` | 请求构造 `buildBrokerHostOperationRequest`(195 行)、`buildBrokerFileTokenRequest`(213 行)、`buildBrokerFileWriteCompletedRequest`(231 行);默认命令字可见 `HostFileOperation`、`FileTokenRequest` | 建立“受控操作/申请授权/报告完成”的文件操作生命周期,统一归属与审计;token 的真实授权语义与原生侧消费方式仍需补证 |
| 同文件 | `sessionId`、`toolCallId`、`brokerTraceId` 字段相关静态节点;`createBrokerOutcomeUnknownError`(260 行)、`loadBrokerNativeAddon`(143 行) | 将审批绑定到具体调用,并对结果未知建模;不能在 IPC 结果不明时假定成功或直接重做非幂等操作。原生 addon 仍是依赖项 |
| `shims/safe-delete-broker-delete.cjs` / `safe-delete-bulk-guard.cjs` / `node-safe-delete-shim.cjs` | 删除请求构造、同步/异步代理、批量删除检查与批准/拒绝的函数及参数节点 | 参考安全删除、批次审批和审计;回收站执行器、阈值、重放和恢复成功条件尚未由本轮证据证明 |
| `shims/broker-program-policy-check.cjs` | `checkProgramPolicy`(14 行)及程序/runtime/options 参数 | 增加程序启动策略入口;不能用程序名检查替代进程隔离或实际可执行文件身份验证 |
| `rules/tsbx_rules.json` | REA 确认解析成功,包含 `file_rules`、`process_rules`、`network_policy`、`registry_rules` 等顶层字段 | 可作为后续规则语义分析的起点;本轮没有完整规则值或实际判定证据,不直接把此 JSON 当作 YCode 已生效策略 |
因此可以复用已经确认的职责划分和协议线索;实际引入脚本前还要补齐完整正文、导出接口、依赖、平台分支与失败分支的 REA 证据。现有静态图足以支撑接入方向判断,不足以保证逐函数搬迁后行为一致。
## 这份目录还缺少什么
目录没有配套的 `sandbox-center.exe`、`sandbox-cli.exe`、`sandbox_ffi.dll`、`tsbx*.dll`、native addon 可执行产物,也没有这些组件可复现构建所需的完整工程。README 描述的 Rust 策略中枢不在所给源码集合中。
`decompiled/tsbx*.c` 按资料自身说明属于 Ghidra 伪代码;它们不等于包含原始类型、初始化、链接依赖和完整构建配置的 C/C++ 项目。本轮未尝试把伪代码当源码编译。
README 提到的受限令牌、Job、注入钩子、命名管道、网络双引擎、备份事务,以及具体 verdict 位与 registry/network TODO 等均是**待 REA 复核的分析结论**。随包仅有 shim 的两条正式 REA 记录,不能直接把这些原生说明提升为已验证事实,更不能据此声称 Windows 沙盒已复原。
当前还未证明 shim 对 Windows、macOS 和 Python 的完整适用范围;没有观察它们在 YCode 的 Node/Electron/子进程环境中的实际行为。语言层拦截即使成功工作,也不能凭静态函数存在证明任意其他程序受到同样限制。
## 建议接入顺序与验收条件
### 第一批:统一策略、审批与文件事务
在主进程增加独立的沙盒服务边界,输入至少包含会话、run、tool call、真实工作区路径、权限模式和操作;输出区分允许、待审批、拒绝与结果未知。沿用 `executeTurnTool` 的公共路由,让 OMP 和备用内核得到同一决策。
先覆盖宿主文件读写、敏感路径规则、安全删除和独立文件事务日志。既有消息 before/after 可继续用于展示,事务记录应能在消息保存失败或进程重启后追查与恢复。权限 token 应绑定主体、真实目标和操作并有有效期;不能只信任请求 JSON 中自报的 session ID。
验收:越界、junction、凭证样本保护、审批前后文件变化、审批取消、删除恢复、批量操作、重启恢复、多会话交叉请求。此批完成只能称“应用层权限与文件保护”,不启用默认模式 Shell,也不宣称任意进程已隔离。
### 第二批:独立 Windows 执行后端
通过 REA 补齐原版原生组件身份、初始化/配置/启动/停止、策略 IPC、审批回调及实际允许/拒绝行为,再决定原生后端的接入实现。无论采用哪种内核,都需由 YCode 管理自己的实例、会话和生命周期,不能借用用户正在运行的 WorkBuddy 策略进程。
在 `execute_command` 下加入受控启动适配器,输出真实能力状态。后端不可用或握手失败时继续拒绝默认模式命令,不能回退到普通 `spawn`。将环境净化、子进程继承、进程树停止、会话退出和审计纳入这个入口;当前终端的环境过滤可供参考,但不是完整凭证隔离保证。
验收:受控临时目录中的允许/拒绝写入;命令和后代进程越界尝试;程序真实身份;受控本地网络策略;取消/超时/主进程退出后的子树清理;IPC 断线与策略失败;原版同场景比较。注册表及其他声称具备的能力须分别验证。只有这些边界通过,才可在默认模式开放命令。
### 第三批:语言适配、连接器和安全中心
原生边界建立后,再依据补齐的 REA 证据引入 Node/Python/Shell 适配,验证实际运行时、同步/异步接口、rename/copy/文件描述符、恢复与错误处理。明确哪些本地 MCP 进程、用户终端和其他辅助进程处于隔离范围;配置被信任不等于进程被沙盒化。
安全中心继续按项目约定通过 REA 采集原版页面与行为。页面读取真实后端健康、策略、审计和审批状态,分别标明已实现、未实现与不可用能力;原版对应功能和视觉/交互仍按独立 1:1 场景验收。
## 本轮验证结果
`node .tmp/sandbox-assessment-probe-20261018.mjs`:**11/11 通过**。使用唯一临时目录、假 `.env` 内容和自建 junction;不读取真实凭证,不发送模型请求,不执行完全访问命令。
已验证当前行为:工作区内可读取假 `.env`(说明当前没有敏感文件策略);默认模式拒绝越界读写和 junction 逃逸;默认写入需批准,拒绝不落文件,批准后写入成功;预取消写入不创建文件;默认 Shell 被拒绝;完全访问仅在自有临时样本上验证可读取工作区外文件。
这些检查只验证 YCode 现有宿主工具的常规路径,未验证并发路径替换等竞争条件,也没有验证系统沙盒、网络、原生钩子、MCP/终端隔离或 WorkBuddy 等价行为。本轮没有业务代码变化,因此未额外运行生产构建;全部既有未提交修改保持原样。