Files
blackbird/docs/security/aibox_SECURITY_AUDIT.md
T
qing a7a78d1424 docs: aggregate project documentation under docs/ with unified index
- Move all per-module security audit reports to docs/security/
- Move code review logs to docs/reviews/, analysis reports to docs/reports/
- Add docs/INDEX.md as single entry point for all project documentation
- Add documentation management conventions section to README.md
- Clean up empty per-module docs/ directories
2026-08-03 13:21:48 +08:00

216 lines
8.7 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.
# aibox 模块安全审计报告
**审计日期:** 2026-08-01
**审计文件:** [aibox.py](file:///Users/qingsong/micro_servers/aibox/aibox.py)
**审计范围:** AI引擎、工具系统、WebSocket服务、任务调度器、数据库
---
## 问题严重等级定义
| 等级 | 颜色 | 说明 | 响应时间 |
|------|------|------|----------|
| P0 | 🔴 严重 | 可直接被利用获取系统权限或造成服务完全不可用 | 立即修复 |
| P1 | 🟠 高危 | 可被利用获取敏感数据或造成部分功能不可用 | 24小时内修复 |
| P2 | 🟡 中危 | 存在安全隐患但利用难度较高或影响有限 | 一周内修复 |
| P3 | 🟢 低危 | 健壮性/信息泄露类问题,风险较低 | 版本迭代时修复 |
---
## 🔴 P0 严重问题
### 1. 命令注入漏洞
- **位置:** `execute_local_command` 工具实现 (~L2670)
- **风险描述:**
```python
# 当前危险实现模式
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
```
使用 `shell=True` 并通过 f-string 直接拼接用户输入的命令,攻击者(或被诱导的AI)可以构造恶意命令执行任意系统操作,例如:
- `rm -rf /` 删除所有文件
- `cat /etc/shadow` 窃取密码哈希
- 反弹 shell 完全控制系统
- **修复建议:**
1. 禁止 `shell=True`,改用 `subprocess.run([...], shell=False)`
2. 将命令拆分为参数列表,使用 `shlex.split()` 解析或手动分割
3. 添加命令白名单机制,只允许执行预定义的安全命令(ls, cat, grep等)
4. 限制工作目录,禁止在敏感目录执行命令
---
### 2. WebSocket 无认证机制
- **位置:** `WebSocketHandler.handle()` / `WebSocketServer` (~L6000+)
- **风险描述:**
- WebSocket 服务监听在 `0.0.0.0:8765`,公网可访问
- 无任何 token、密码或 session 认证
- 任何人连接后可无限制使用 DeepSeek API(消耗费用)
- 结合工具调用漏洞可直接控制服务器
- **修复建议:**
1. **短期方案:** 将监听地址改为 `127.0.0.1`,仅允许本地访问,通过 gateway/WAF 统一接入并认证
2. **长期方案:** WebSocket 握手阶段校验 token(支持 URL query 参数或 Authorization header)
3. 参考现有 gateway 的认证机制(RSA签名/PBKDF2)做统一接入
4. 添加 Origin 校验,防止跨站 WebSocket 劫持
---
## 🟠 P1 高危问题
### 3. 路径遍历风险
- **位置:** `read_file` / `write_file` / `append_file` 等文件操作工具
- **风险描述:**
- 只有 `read_memory` 实现了 `safe_path` 校验
- 其他文件工具未限制可访问目录,通过 `../../etc/passwd` 可读取系统敏感文件
- 写入工具可覆盖任意文件,破坏系统或植入后门
- **修复建议:**
- 定义允许访问的根目录(如 `~/.aibox/workspace/`)
- 统一实现 `safe_path()` 函数,校验后规范化路径,确保在允许目录内
- 对写入操作添加额外确认或权限控制
---
### 4. SSRF 漏洞风险
- **位置:** `web_search` / `fetch_url` / 网络请求类工具
- **风险描述:**
- 未限制可访问的 IP 范围
- 可访问内网服务:`http://127.0.0.1:8443`(gateway)、`http://10.x.x.x` 等
- 可访问云服务商元数据接口(如 `http://169.254.169.254/` 获取临时凭证)
- **修复建议:**
- 禁止访问内网 IP 段:`127.0.0.0/8`, `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `169.254.0.0/16`
- 禁止访问非 HTTP/HTTPS 协议
- 跟随重定向时重新校验目标地址
---
### 5. 敏感信息暴露
- **位置:** 系统提示词构建 / `tools_info`
- **风险描述:**
- 系统提示词中包含所有工具的完整参数 schema
- 错误响应可能返回栈追踪等内部信息
- 工具返回的原始错误信息可能泄露路径、代码结构
- **修复建议:**
- 精简工具描述,只暴露必要信息
- 对外返回的错误信息做脱敏处理,仅返回通用错误提示
- 详细错误只记录在服务端日志
---
### 6. API Key 配置校验缺失
- **位置:** `ConfigManager` 初始化
- **风险描述:**
- 配置中默认值是占位符,但启动时未校验
- 可能因配置错误导致空 Key 或使用默认无效 Key
- 没有 Key 时直接启动失败或行为异常
- **修复建议:**
- 启动时强制校验 `DEEPSEEK_API_KEY` 配置
- 未配置有效 Key 时直接拒绝启动并给出明确提示
- 日志中不要打印完整 API Key
---
## 🟡 P2 中危问题
### 7. 无请求频率限制
- **位置:** WebSocket 消息处理
- **风险:** 恶意用户可高频发送请求,导致 API 费用暴涨或服务拒绝
- **建议:** 添加 per-connection 消息频率限制(如每分钟最多 30 轮对话)
### 8. 工具调用结果无大小限制
- **位置:** `_sanitize_tool_result()`
- **风险:** 读取大文件(如几GB的日志)可能导致内存溢出,服务崩溃
- **建议:** 工具输出统一限制大小(如 1MB),超出截断并提示
### 9. 对话历史明文存储
- **位置:** SQLite 数据库 `~/.aibox/memos.db`
- **风险:** 聊天记录包含敏感信息,明文存储易被窃取
- **建议:** 对敏感内容加密存储,或限制数据库文件权限
### 10. 临时文件清理不彻底
- **位置:** 代码执行/命令执行工具
- **风险:** 执行代码生成的临时文件未清理,可能占用磁盘空间或泄露信息
- **建议:** 使用 `tempfile.TemporaryDirectory()` 自动清理
### 11. 技能文件加载无沙箱
- **位置:** `load_skills()` 技能加载
- **风险:** 可执行技能(`.sh`/`.py`)直接运行,无隔离或校验
- **建议:** 技能目录做权限校验,仅加载可信来源技能,或在沙箱中执行
### 12. 日志未脱敏
- **位置:** Logger 输出
- **风险:** API 请求/响应、对话内容可能写入日志文件,泄露敏感信息
- **建议:** 日志中脱敏 API Key、密码等敏感字段,对话内容可选记录
---
## 🟢 P3 低危/健壮性问题
### 13. 递归深度防护不足
- **位置:** `think_and_respond()` 递归调用
- **说明:** 虽然设置了 `max_recursion_depth=10`,但复杂工具链仍可能导致栈溢出
- **建议:** 改用迭代而非递归,或添加更严格的深度检查
### 14. 对话压缩可能丢失上下文
- **位置:** `_compress_conversation()`
- **说明:** 当前压缩算法简单截断早期消息,可能丢失工具调用上下文
- **建议:** 保留系统提示和工具调用/结果对,只压缩纯对话内容
### 15. 多线程竞争风险
- **位置:** `EnhancedAIManager` 状态管理
- **说明:** `messages`/`tools` 等状态在多连接下可能有竞争条件(当前单连接模型,但代码未防护)
- **建议:** 必要时添加锁机制,或确保每个连接独立实例
### 16. 监听地址硬编码
- **位置:** WebSocketServer 启动
- **说明:** 当前默认 `0.0.0.0:8765`,建议改为配置项且默认 `127.0.0.1`
### 17. 缺少优雅关闭
- **位置:** 信号处理
- **说明:** 关闭时未确保消息队列刷新、数据库连接正确关闭
---
## ✅ 已有的良好安全实践
审计中发现以下安全措施已经实现:
1. ✅ **工具结果清洗:** `_sanitize_tool_result()` 过滤控制字符,确保工具返回值是合法字符串
2. ✅ **消息回滚机制:** API 失败时 `_rollback_messages()` 回滚对话,防止坏消息污染历史
3. ✅ **对话自动压缩:** Token/消息数超限自动压缩,防止上下文无限增长
4. ✅ **pymsg 超时防护:** `recv_timeout=10s` 防止 Slowloris DoS 攻击
5. ✅ **log_client 健壮性:** 双层异常保护、队列大小限制、Event 同步刷新
6. ✅ **提示词软约束:** 系统提示词中明确要求 AI 不要执行危险命令(需配合代码层面硬约束)
7. ✅ **提示词排序修复:** 数字前缀正则排序,确保技能提示正确加载顺序
8. ✅ **内存搜索优化:** 基于主题相关性搜索,避免不必要的全库扫描
---
## 🛠️ 修复路线图
### 第一阶段(立即):修复 P0
- [ ] 修复命令注入:移除 `shell=True`,改用参数列表,添加命令白名单
- [ ] WebSocket 认证:默认绑定 127.0.0.1,通过 gateway 接入或添加 token 认证
### 第二阶段(近期):修复 P1
- [ ] 统一文件操作 safe_path 校验,限制工作目录
- [ ] 网络请求添加 SSRF 防护,禁止内网访问
- [ ] 工具输出大小限制(1MB)
- [ ] 启动时 API Key 配置校验
### 第三阶段(后续版本):P2/P3
- [ ] 请求频率限制
- [ ] 日志脱敏
- [ ] 错误信息脱敏
- [ ] 临时文件自动清理
- [ ] 对话加密存储
- [ ] 多线程安全加固
- [ ] 优雅关闭
---
**审计完成时间:** 2026-08-01