window-sand-box 0.1.0

Windows 沙盒终端执行工具 — 使用受限令牌、ACL 和私有桌面隔离进程权限,提供安全的命令执行环境
# window-sand-box (wsbx)

[![Crates.io](https://img.shields.io/crates/v/window-sand-box.svg)](https://crates.io/crates/window-sand-box)
[![Docs.rs](https://docs.rs/window-sand-box/badge.svg)](https://docs.rs/window-sand-box)
[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE-MIT)

**Windows 沙盒终端执行工具** — 为 AI 提供安全的 Windows 命令行执行环境。

使用 Windows **受限令牌**(Restricted Token)、**ACL 权限控制**和**私有桌面隔离**技术,
在不创建额外用户账号的情况下实现进程级沙盒隔离。

---

## 快速开始

### 安装

```bash
cargo install window-sand-box
```

或从源码构建:

```bash
git clone https://github.com/WeiChens/window-sand-box.git
cd window-sand-box
cargo build --release
# 将 target\release\wsbx.exe 添加到 PATH
```

### 基本用法

```bash
# 只读模式执行(最安全,无需管理员权限)
wsbx exec --readonly cmd /c dir /b

# 可写模式执行(首次会自动弹出 UAC 提权配置 ACL)
wsbx exec cmd /c "echo hello > test.txt && type test.txt"

# 指定工作目录
wsbx exec --cwd C:\projects\my-app git status

# 带超时(10 秒后自动终止)
wsbx exec --timeout 10 python long_running_script.py
```

---

## 安全机制

### 三层防御体系

```
┌─────────────────────────────────────────────┐
│ 第一层:受限令牌(进程身份限制)                │
│                                             │
│  CreateRestrictedToken 创建的子进程:          │
│  ├─ DISABLE_MAX_PRIVILEGE → 禁用所有特权      │
│  ├─ LUA_TOKEN → 模拟标准用户,无法提权         │
│  └─ WRITE_RESTRICTED → 限制写入权限           │
└─────────────────────────────────────────────┘
┌─────────────────────────────────────────────┐
│ 第二层:Capability SID(会话级别隔离)          │
│                                             │
│  每个工作目录有一个唯一随机 SID。               │
│  只有包含此 SID 的令牌才能写入该目录。           │
│  不同工作目录的 SID 不同,互不干扰。             │
└─────────────────────────────────────────────┘
┌─────────────────────────────────────────────┐
│ 第三层:ACL 权限(文件系统控制)                │
│                                             │
│  Allow ACE → 工作目录可读写                    │
│  Deny Write ACE → 敏感目录(.git 等)不可写    │
└─────────────────────────────────────────────┘
```

### 权限模型

| 位置 | 只读模式 | 可写模式 |
|------|----------|----------|
| 工作目录 | 可读 | ✅ 可读写删除 |
| 工作目录内 .git/.env 等 | 可读 | ✅ 可读,不可写 |
| 白名单路径 | 可读 | ✅ 可读写删除 |
| C:\Windows 等系统路径 | ✅ 可读 | ✅ 可读,不可写 |
| 黑名单路径 | ❌ 不可访问 | ❌ 不可访问 |

---

## 命令参考

### `wsbx exec`

在沙盒中执行命令。

```bash
wsbx exec [选项] <命令...>
```

**选项:**

| 选项 | 说明 |
|------|------|
| `--cwd <目录>` | 工作目录(默认:当前目录) |
| `--readonly` | 只读模式 — 进程完全没有文件写入权限 |
| `--timeout <秒>` | 超时时间,超时自动终止 |
| `--whitelist <路径>` | 额外的可写入路径(可多次使用) |
| `--no-desktop` | 禁用桌面隔离(默认启用) |

**外部命令(.exe)直接执行:**

```bash
wsbx exec git status
wsbx exec node --version
wsbx exec python -c "print('hello')"
```

**CMD 内部命令需加 `cmd /c`:**

```bash
wsbx exec cmd /c dir /b
wsbx exec cmd /c "mkdir test && copy file1.txt file2.txt"
```

### `wsbx clean`

清理当前目录中 `wsbx exec` 自动添加的所有 ACL 条目(需要管理员权限)。

```bash
wsbx clean
```

---

## 库使用(Rust 项目集成)

将 `window-sand-box` 作为库集成到你的 Rust 项目中:

```toml
[dependencies]
window-sand-box = "0.1"
```

```rust
use window_sand_box::SandboxRunner;
use std::collections::HashMap;

let runner = SandboxRunner::new()?;
let cwd = std::env::current_dir()?;
let session = runner.create_session(cwd.clone())?;

// 可写模式执行
let cmd = vec!["cmd".into(), "/c".into(), "echo Hello && dir /b".into()];
let result = runner.execute(&session, &cmd, HashMap::new(), None)?;
println!("退出码: {}", result.exit_code);
print!("{}", result.stdout);

// 只读模式执行(无需管理员权限)
let result = runner.execute_readonly(&cmd, &cwd, HashMap::new(), None)?;
```

---

## 配置

配置文件位于 `%USERPROFILE%\.wsbx\config.json`(默认)。

```json
{
  "blacklist": [
    "C:\\Windows\\System32\\config"
  ],
  "whitelist": [],
  "sensitive_patterns": [
    ".git",
    ".env",
    ".ssh",
    "node_modules"
  ]
}
```

---

## 常见问题

### Q: 为什么命令外的 `&&` 不按预期工作?

```bash
wsbx exec cmd /c rmdir ..\hello && dir /b
```

**原因**:`&&` 被**你当前的终端**解析了,根本没有传到沙盒内部。

**解决**:用引号包裹整个命令:

```bash
wsbx exec cmd /c "rmdir ..\hello && dir /b"
```

### Q: 提示需要管理员权限?

设置 ACL 需要管理员权限。首次在可写模式下执行时,会自动弹出 UAC 提权对话框,
点击「是」即可自动完成配置。

### Q: 中文输出乱码?

✅ 已自动修复。输出会自动从 GBK/系统代码页转为 UTF-8。

---

## 许可证

本项目使用 [MIT 许可证](LICENSE-MIT)。