From dfc05e1e144a234434610aeffc0c911635e6dcee Mon Sep 17 00:00:00 2001 From: coso Date: Wed, 26 Aug 2026 17:09:31 +0800 Subject: [PATCH] fix(sandbox): correct Windows runner imports --- .../exec-plans/codex-desktop-complete-alignment-plan.md | 1 + .../crates/tool-runtime/src/execution_process/windows.rs | 7 +++---- .../src/execution_process/windows_runner_child.rs | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/internal/exec-plans/codex-desktop-complete-alignment-plan.md b/internal/exec-plans/codex-desktop-complete-alignment-plan.md index b826d5017..0db825ea1 100644 --- a/internal/exec-plans/codex-desktop-complete-alignment-plan.md +++ b/internal/exec-plans/codex-desktop-complete-alignment-plan.md @@ -387,6 +387,7 @@ Renderer typed gateway - 2026-08-26:继续对照 Codex current `windows-sandbox-rs::setup_main::sandbox_users` 与 write-root ACL 语义,关闭 restricted token 双重访问检查缺口。`tool-runtime::windows_setup` 现在幂等创建 `LimeSandboxUsers` 本地组,将 offline/online 账户加入组;默认 Windows readiness 与每次 runner 启动均验证组 SID 和目标账户成员关系,组缺失、成员漂移或 NetAPI 错误 fail closed。`windows_acl` 将 cwd/显式 permission 拆成 read/write/write-deny/access-deny plan:普通 token 与 restricted token 两侧分别由 sandbox group 和短生命周期 capability SID 获得 read/write ACE,metadata/read-only carveout 只拒绝 capability 写,显式 `Deny` 同时拒绝 group/capability 全部访问。lease 不再通过 `/remove:g` 删除稳定主体 ACE,而是在每个路径第一次修改前保存原始 DACL security descriptor,终态逆序恢复。Windows integration matrix 在 workspace process 存活时断言新增 SID 同时包含 sandbox group 与另一条 capability SID,并继续覆盖 online/offline identity、workspace write、metadata/external deny 和全部目标原始 SDDL rollback。本机 `npm run test:rust:related -- ...` 退出码 `0`,反向依赖链与 `tool-runtime 373/373` 通过;Windows-only NetAPI/GetFileSecurityW/SetFileSecurityW 与增强矩阵仍必须由真实 MSVC runner 编译执行,因此 checklist 保持 `44/46 (95.7%)`、状态 `active`、readiness `Planned/enforced=false`。 - 2026-08-26:收口 Windows setup 文件规模与职责边界。将本地账户创建/更新、本地组与成员关系、组 SID/readiness 校验及 account SID 解析从 1,086 行 `windows_setup.rs` 原样迁入唯一 current 子 owner `windows_setup/accounts.rs`;主编排文件降至 817 行,子模块 281 行,没有新增 backend、compat API 或行为分支。`npm run test:rust:related -- ...` 退出码 `0`,反向依赖链与 `tool-runtime 373/373` 通过;`npm run test:contracts` 完成 App Server client `299 checks` 及 command/harness/modality/scripts/release/docs guards;`npm run governance:legacy-report` 扫描 2063 文件且零引用候选、分类漂移、边界违规均为 `0`;evidence parser `7/7`,rustfmt 与 `git diff --check` 通过。macOS collector 继续以退出码 `1` 生成 schema v3 `evidence-pending`,七项全部 missing。该拆分只消除仓库 1,000 行硬约束,不改变安全完成度:真实 Windows/MSVC restricted matrix、live provider/Pier/DeepSWE verifier artifacts 与覆盖当前工作树的正式 notarized/package 仍未完成,计划保持 `active`、`44/46 (95.7%)` 与 `SandboxBackendStatus::Planned/enforced=false`。 - 2026-08-26:继续 C-3,删除已由真机证据判定无效的 `CreateProcessWithTokenW` fallback、suspended/resume 与后置 Job 分配,改为 `CreateProcessWithLogonW -> sandbox-account runner -> current token 派生 restricted token -> CreateProcessAsUserW + STARTUPINFOEX` 唯一 current 链;有界双 named-pipe framing 承接 spawn/stdin/close/resize/terminate/output/exit/error,pipe ACL 只允许目标 account SID且连接后校验 runner PID,pipe 与 ConPTY 均通过 job-list attribute 原子入 Job,宿主 reaper 持有控制 pipe 与 ACL lease 到 runner 退出。`windows-sandbox-runner.exe` 已进入 dev/Quality 成组构建、Electron Windows resource、release manifest `windowsSandboxRunnerSha256` 和 packaged verifier;Everyone-write case 的 `icacls` 输出改为进程内捕获,避免污染 evidence parser 的稳定 test 行。本地 `cargo fmt --check`、Prettier、`git diff --check`、packaging/sidecar/evidence 定向 Vitest `66/66`、Rust related 反向依赖链、`tool-runtime 373/373`、`app-server-daemon 38/38`、contracts `299 checks`、scripts/release/docs/legacy governance 全部通过,legacy 扫描仍为 2063 files、0/0/0。当前主机未安装 Windows target,因此这些结果不替代 MSVC 编译和 schema v3 七项真机矩阵;计划继续保持 `active`、`44/46 (95.7%)` 与 `Planned/enforced=false`,下一刀是推送该窄提交并监控 Windows Quality evidence。 +- 2026-08-26:Windows Quality run `32950744293`(SHA `3ca895af0`)已取得 schema v3 artifact `9600137436`,但在 setup binary 的 MSVC 编译阶段失败,七项尚未执行。失败收敛为单一 Windows-only import:`windows_runner_child.rs` 从 `Win32::Foundation` 导入 `EqualSid`,而 `windows-sys 0.52` 的 owner 是 `Win32::Security`;同时报告本轮 `windows.rs` 的两个 unused import。已按实际模块归属修正并准备最小重跑;该 run 不改变 `44/46 (95.7%)` 或 `Planned/enforced=false`。 ## 7. 阻塞与避让 diff --git a/lime-rs/crates/tool-runtime/src/execution_process/windows.rs b/lime-rs/crates/tool-runtime/src/execution_process/windows.rs index addd98b2b..b5349ff47 100644 --- a/lime-rs/crates/tool-runtime/src/execution_process/windows.rs +++ b/lime-rs/crates/tool-runtime/src/execution_process/windows.rs @@ -6,7 +6,6 @@ use std::os::windows::ffi::OsStrExt; use std::path::Path; use std::ptr; use std::thread; -use std::time::Duration; use windows_sys::Win32::Foundation::{ CloseHandle, GetLastError, LocalFree, SetHandleInformation, ERROR_SUCCESS, HANDLE, HANDLE_FLAG_INHERIT, HLOCAL, INVALID_HANDLE_VALUE, LUID, @@ -25,9 +24,9 @@ use windows_sys::Win32::Security::{ use windows_sys::Win32::Storage::FileSystem::WriteFile; use windows_sys::Win32::System::JobObjects::{ CreateJobObjectW, JobObjectBasicAccountingInformation, JobObjectExtendedLimitInformation, - QueryInformationJobObject, SetInformationJobObject, TerminateJobObject, - JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, JOBOBJECT_EXTENDED_LIMIT_INFORMATION, - JOB_OBJECT_LIMIT_BREAKAWAY_OK, JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, + QueryInformationJobObject, SetInformationJobObject, JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, + JOBOBJECT_EXTENDED_LIMIT_INFORMATION, JOB_OBJECT_LIMIT_BREAKAWAY_OK, + JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, }; use windows_sys::Win32::System::Pipes::CreatePipe; use windows_sys::Win32::System::Threading::{ diff --git a/lime-rs/crates/tool-runtime/src/execution_process/windows_runner_child.rs b/lime-rs/crates/tool-runtime/src/execution_process/windows_runner_child.rs index af142de32..0fea161b1 100644 --- a/lime-rs/crates/tool-runtime/src/execution_process/windows_runner_child.rs +++ b/lime-rs/crates/tool-runtime/src/execution_process/windows_runner_child.rs @@ -15,7 +15,8 @@ use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{mpsc, Arc, Mutex}; use std::thread; use std::time::Duration; -use windows_sys::Win32::Foundation::{EqualSid, WAIT_OBJECT_0}; +use windows_sys::Win32::Foundation::WAIT_OBJECT_0; +use windows_sys::Win32::Security::EqualSid; use windows_sys::Win32::Storage::FileSystem::{ CreateFileW, ReadFile, FILE_GENERIC_READ, FILE_GENERIC_WRITE, OPEN_EXISTING, };