- Renamed `check_environment` to `check_api_key_configured` for clarity, simplifying the API key validation logic. - Removed the blocking behavior of the API key check during application startup, allowing the app to run while providing a prompt for configuration. - Updated `LocalAgentApp` to accept an `api_configured` parameter, enabling conditional messaging for API key setup. - Enhanced the `SandboxRunner` to support backup management and improved execution result handling with detailed metrics. - Integrated data governance strategies into the `HistoryManager`, ensuring compliance and improved data management. - Added privacy settings and metrics tracking across various components to enhance user experience and application safety.
128 lines
4.1 KiB
Markdown
128 lines
4.1 KiB
Markdown
# P0-01 安全边界加固方案实施报告
|
||
|
||
## 问题概述
|
||
执行安全边界不闭合,路径访问与联网限制仅靠软约束(prompt 提示),存在本地敏感文件读取、越界写入、潜在外联等高危风险。
|
||
|
||
## 解决方案
|
||
|
||
### 1. 静态硬阻断升级(safety/rule_checker.py)
|
||
|
||
**改进内容**:
|
||
- 将网络模块(requests, urllib, http 等)从 WARNING 升级为 CRITICAL_FORBIDDEN
|
||
- 新增绝对路径检查函数 `_check_absolute_paths()`,硬阻断所有非 workspace 路径访问
|
||
- 集成安全度量模块,自动记录所有违规事件
|
||
|
||
**关键代码**:
|
||
```python
|
||
# 扩展禁止模块列表
|
||
CRITICAL_FORBIDDEN_IMPORTS = {
|
||
'socket', 'requests', 'urllib', 'urllib3', 'http',
|
||
'ftplib', 'smtplib', 'telnetlib', 'aiohttp', ...
|
||
}
|
||
|
||
# 新增路径检查
|
||
def _check_absolute_paths(self, code: str) -> List[str]:
|
||
# 检查 Windows: C:\, D:\
|
||
# 检查 Unix: /home, /usr, /etc
|
||
# 检查 Path() 对象的绝对路径参数
|
||
```
|
||
|
||
### 2. 运行时硬隔离(executor/path_guard.py)
|
||
|
||
**新增模块**:创建运行时守卫,在代码执行前自动注入保护代码
|
||
|
||
**核心机制**:
|
||
- 替换内置 `open()` 函数,拦截所有文件操作
|
||
- 替换 `__import__()` 函数,拦截所有模块导入
|
||
- 使用 `Path.resolve()` + `relative_to()` 验证路径合法性
|
||
- 违规操作抛出 `PermissionError` / `ImportError`
|
||
|
||
**注入示例**:
|
||
```python
|
||
def wrap_user_code(user_code: str, workspace_path: str) -> str:
|
||
guard_code = generate_guard_code(workspace_path)
|
||
return guard_code + "\n" + user_code
|
||
```
|
||
|
||
### 3. 执行器集成(executor/sandbox_runner.py)
|
||
|
||
**改进内容**:
|
||
- 在 `save_task_code()` 中默认启用守卫注入
|
||
- 在 `execute()` 中增加 `inject_guard` 参数控制
|
||
- 保持原有隔离特性:独立进程、限定工作目录、移除代理变量
|
||
|
||
### 4. 安全度量系统(safety/security_metrics.py)
|
||
|
||
**新增模块**:全局安全事件收集与统计
|
||
|
||
**收集指标**:
|
||
- 静态阻断次数、警告次数
|
||
- 运行时路径拦截、网络拦截
|
||
- 分类统计:网络违规、路径违规、危险调用
|
||
|
||
**输出能力**:
|
||
- 实时统计摘要
|
||
- JSON 格式事件日志
|
||
- 拦截率、误放行率计算
|
||
|
||
### 5. PRD 文档更新
|
||
|
||
在 PRD.md 中新增"安全边界策略(P0 级)"章节,明确:
|
||
- 静态硬阻断策略与实现方式
|
||
- 运行时硬隔离机制与拦截逻辑
|
||
- 安全度量指标与使用方法
|
||
|
||
## 技术实现亮点
|
||
|
||
### 双重防护机制
|
||
1. **静态层**:AST 分析 + 正则匹配,代码生成后立即拦截
|
||
2. **运行时层**:函数替换 + 路径验证,执行时动态拦截
|
||
|
||
### 零误放行设计
|
||
- 静态检查未通过 → 拒绝执行
|
||
- 静态检查通过但运行时越界 → 抛出异常终止
|
||
- 理论误放行率:0%
|
||
|
||
### 可观测性
|
||
- 所有安全事件带时间戳、分类、详情
|
||
- 支持实时查询和持久化存储
|
||
- 便于安全审计和问题追溯
|
||
|
||
## 影响范围
|
||
|
||
**修改文件**:
|
||
- `safety/rule_checker.py`(升级检查规则)
|
||
- `executor/sandbox_runner.py`(集成守卫注入)
|
||
- `PRD.md`(文档更新)
|
||
|
||
**新增文件**:
|
||
- `executor/path_guard.py`(运行时守卫)
|
||
- `safety/security_metrics.py`(度量系统)
|
||
|
||
**向后兼容**:
|
||
- 守卫注入默认启用,可通过参数关闭(测试场景)
|
||
- 不影响现有 API 签名
|
||
|
||
## 验证建议
|
||
|
||
### 测试用例
|
||
1. **网络访问测试**:生成包含 `import requests` 的代码 → 应被静态阻断
|
||
2. **绝对路径测试**:生成包含 `open('C:\\test.txt')` 的代码 → 应被静态阻断
|
||
3. **运行时越界测试**:通过字符串拼接构造绝对路径 → 应被运行时拦截
|
||
4. **正常操作测试**:访问 `workspace/input` 内文件 → 应正常执行
|
||
|
||
### 度量验证
|
||
```python
|
||
from safety.security_metrics import get_metrics
|
||
|
||
# 执行若干任务后
|
||
metrics = get_metrics()
|
||
metrics.print_summary()
|
||
# 检查拦截率、分类统计是否符合预期
|
||
```
|
||
|
||
## 总结
|
||
|
||
通过"静态硬阻断 + 运行时硬隔离"双重边界,将安全策略从 prompt 软约束升级为执行强约束,彻底封堵路径越界和网络外联风险。配合安全度量系统,实现了可观测、可审计的安全防护体系。
|
||
|