Files
ycode/docs/自有沙盒首版实施-2026-10-18.md
T

8.9 KiB

自有沙盒首版实施与维护基线(2026-10-18)

后续完整接入已开始,见首批实施与当前差距。本文保留首版验收时的范围;后续策略、运行时/依赖及目录事务状态以新记录和维护 README 为准。

当前结论

已建立可独立构建、修改、测试和诊断的 YCode Windows x64 沙盒首版。原生执行器、策略、文件事务、审计和维护工具全部在本仓库维护,不依赖 WorkBuddy 的 exe、DLL、策略进程或安装目录。

默认权限的 execute_command 已接入自有原生后端:在工作区副本中执行,禁用网络,成功后的文件变更经真实会话审批后写回。原生组件缺失、摘要不匹配或隔离启动失败时拒绝执行,不回退到普通宿主 Shell。

这满足本轮“可以开始维护自己的沙盒”的阶段目标;不代表 WorkBuddy 沙盒或安全中心已完成 1:1,也不表示所有 YCode 子进程已经隔离。具体差距与下一批工作见下文。

实现归属

位置 职责
native/sandbox/runner.cpp Windows AppContainer、精确 SID 检查、Job、受控 stdio、环境白名单、父进程监控、超时/取消、临时盘符、租约与资源释放
native/sandbox/probe.cpp 仅测试使用的真实 Win32 文件、网络和子进程探针,不打包发布
native/sandbox/README.md 构建、协议、维护操作、安全边界、限制和微软 API 来源
scripts/build-sandbox.mjs 自动定位本机 MSVC/SDK,静态运行库编译,生成源码/产物 SHA-256 清单
src/main/sandbox/policy.ts 真实工作区路径、敏感名称、junction/符号链接、多重硬链接、设备名称及 ADS 路径检查
src/main/sandbox/service.ts 工作区快照、原生产物校验、命令生命周期、文件变更、审批与审计
src/main/sandbox/transactions.ts 独立备份、批量校验、提交补偿、冲突保护与恢复
src/main/sandbox/maintenance.ts / scripts/sandbox-maintain.ts 状态、自检、运行/事务记录、恢复与遗留 profile/盘符清理
src/main/agent/tools/index.ts / conversation-tools.ts 宿主文件工具与默认命令接入;OMP 和备用循环共享入口及 run/tool-call 归属
main / preload / shared IPC 配置真实 userData/resources 路径;应用退出取消原生执行;提供 window.ycode.app.sandboxStatus()

package.json 增加独立构建、原生回归、整应用回归和维护命令,生产构建先编译原生执行器。Electron 打包资源只选择 ycode-sandbox.exe 和 manifest.json,不包含探针。生成的 exe/manifest 被 Git 忽略,源码与构建入口留在仓库。

执行边界

每次命令使用独立 AppContainer 身份。受限进程先暂停启动,校验其 AppContainer 标记与指定 SID,再加入禁止 breakaway 的 Job,之后才执行。Job 限制 32 个活动进程与 1 GiB 总提交内存,根命令退出、取消或超时后终止后代,并等待进程树静止。

原生执行器监视实际启动父进程。Node 启动它时使用 Windows detached 进程模式,使父进程突然退出后,原生监视器仍能完成 Job/profile/盘符清理;这项行为已通过独立父进程退出探测。

工作区副本通过一个独立临时盘符呈现,解决 cmd/PowerShell 查询驱动根目录时被拒绝的兼容问题。盘符分配有互斥,清理按精确目标匹配,不修改原工作区 ACL。

子进程只继承允许的 stdio 句柄与固定环境变量;模型供应商凭证不继承。未授予网络 capability,已通过本机 TCP listener 实测确认没有建立连接。

文件、审批和恢复

默认宿主文件工具增加敏感路径与链接检查,写入转入独立事务。命令执行前过滤受保护文件、VCS、依赖目录和链接,执行后校验正常文件并计算 create/update/delete。成功命令产生变更时,由现有 InteractionBroker 发出真实审批,批准后才提交。

所有变更在提交前校验原文件摘要;审批期间被外部编辑会拒绝覆盖。先持久化 before/after 备份,再应用变更。中途失败尝试补偿;补偿不完整会报告事务 ID 和 recovery-required。成功提交后即使运行审计保存失败,也保留真实的 committed 结果并返回审计失败标记,避免误报未写入而重复操作。

事务记录独立于聊天消息,维护工具可在另一进程中恢复。恢复拒绝覆盖后续外部改动,重复恢复不产生额外变化。快照副本在结束后清理,租约、清理状态、审计和事务备份保留在 userData/sandbox。

维护入口

npm run sandbox:build
npm run test:sandbox
npm run test:sandbox:app
npm run sandbox:maintain -- status
npm run sandbox:maintain -- self-test

有状态操作必须显式提供实际 userData/sandbox 的绝对路径:

npm run sandbox:maintain -- audit --state-root 'C:\实际数据目录\sandbox'
npm run sandbox:maintain -- transactions --state-root 'C:\实际数据目录\sandbox'
npm run sandbox:maintain -- restore 事务UUID --workspace 'C:\实际工作区' --state-root 'C:\实际数据目录\sandbox'
npm run sandbox:maintain -- cleanup --state-root 'C:\实际数据目录\sandbox'

修改规则时从 policy.ts 入手,补对应的对抗性测试,再运行原生与整应用两组回归。改原生协议时同步 runner、manifest、shared 类型与 service。sandboxStatus 的 installed 仅表示组件校验通过,系统实际隔离能力以自检/命令执行为准。

验证

  • npm run test:sandbox:最终 52/52 通过,报告 .tmp/sandbox-regression-EDmDWK/report.json。覆盖真实 token/Job、目录与 PowerShell、文件越界读写、后代隔离、breakaway 拒绝、敏感文件、TCP、审批/拒绝/外部冲突、文件增改删与恢复、Unicode、取消/超时、父进程退出、硬杀后的租约清理、审计故障、组件缺失/摘要篡改、快照清理及完全访问的链接写入兼容性。
  • npm run test:sandbox:app:最终完整链路 10/10 通过,报告 .tmp/sandbox-app-0ljMle/report.json。此命令先执行完整生产构建(原生编译、全项目 typecheck、Electron 三端构建),再以实际 production main/preload/renderer、真实 OMP RPC、仅 localhost 的受控模型验证审批、拒绝、取消、消息落库及真实工作区结果。
  • npm run sandbox:maintain -- self-test 通过;维护 CLI 在独立新进程中恢复测试事务,确认新建文件被恢复移除。遗留租约清理命令亦在自有测试状态目录验证成功。
  • npm run smoke、npm run test:conversation-ipc、npm run test:omp 通过。OMP 历史测试 mock 缺少现有 powerSaveBlocker 导出,已仅补齐测试替身。
  • 全项目类型检查已在并行 UI 修改完成后恢复通过;最终生产构建和整应用复核均通过,日志 .tmp/sandbox-app-final-verification.log。

所有测试使用自有临时目录/隔离 userData;未发送真实模型请求,未对用户真实工作区运行测试命令或写回测试产物,未操作 WorkBuddy 运行状态。用户当前 YCode 未被强制重启,新主进程代码在下次完整启动时加载。保留用户授权的并行上下文用量与引用 UI 修改。

当前限制与下一批工作

  1. 当前实现 Windows x64。其他平台拒绝默认命令。第三方语言解释器、npm 等工具链和受控依赖缓存尚未自动接入;默认可使用 cmd 与系统 Windows PowerShell。
  2. 快照上限为 10,000 项、128 MiB、单文件 8 MiB;默认超时 120 秒,输出每路保留 2 MiB。这些文件容量限制是快照/写回检查,尚非 OS 磁盘配额。
  3. 当前同步文件增改删及文件所需父目录;空目录创建和目录删除的写回显式拒绝。大型依赖项目、目录/元数据语义、工具链兼容性需继续完善。
  4. OMP 进程本身、用户手动终端、本地 MCP 服务进程和远端连接器仍沿用原有信任/审批模型,不能算作已被此后端整体隔离。
  5. AppContainer 按 Windows ACL 允许读取部分共享系统资源;没有实现任意读取路径的全局白名单、DLP、原版网络域名/注册表/注入钩子规则。对抗具有相同用户权限的宿主进程并发替换路径,需要进一步实现原生句柄相对文件代理。
  6. 事务备份/审计的保留与自动压缩清理、停电级持久性、安全中心 UI、独立安全审查以及原版相同场景比较仍需逐项验收。

本轮没有新采 WorkBuddy 实现。设计线索沿用上轮 REA ev_74bf702462bc37612d2a68ea2e1c93b30b77dd5d99eaf1e961f1ab36d626c5e3 与 ev_2860ca8fafaf310ee1adc2ebe31530c868da0ecbb41a6f451e8e8e86b447a078;新增的 Windows 原生实现使用微软公开 API,来源与边界见 native/sandbox/README.md。未将本轮原生/OMP 通路成功计作完整 1:1。