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
This commit is contained in:
1 parent
9dbe395484
commit
a7a78d1424
22 files changed
+151
No files matched your search
@@ -0,0 +1,215 @@
|
||||
# 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
|
||||
Reference in new issue
Block a user