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

8.7 KiB
Raw Blame History

aibox 模块安全审计报告

审计日期: 2026-08-01 审计文件: aibox.py 审计范围: AI引擎、工具系统、WebSocket服务、任务调度器、数据库


问题严重等级定义

等级 颜色 说明 响应时间
P0 🔴 严重 可直接被利用获取系统权限或造成服务完全不可用 立即修复
P1 🟠 高危 可被利用获取敏感数据或造成部分功能不可用 24小时内修复
P2 🟡 中危 存在安全隐患但利用难度较高或影响有限 一周内修复
P3 🟢 低危 健壮性/信息泄露类问题,风险较低 版本迭代时修复

🔴 P0 严重问题

1. 命令注入漏洞

  • 位置: execute_local_command 工具实现 (~L2670)

  • 风险描述:

    # 当前危险实现模式
    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