- ReadFileTool: replace readlines() with on-demand range reading; add reverse block reading for large file tail; limit single line to 10KB; hard-cap max_lines to 500 - SubprocessCommandExecutor: replace capture_output with line-by-line Popen reading; enforce 1MB output limit with immediate process termination; merge stdout/stderr counting for both sync and streaming modes - Raise TOOL_MAX_RESULT_LENGTH default from 10KB to 1MB as final safety net - Add SECURITY_AUDIT.md documenting vulnerabilities and remediation roadmap - Update README with memory safety features and v2.3 changelog
8.7 KiB
8.7 KiB
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 完全控制系统
-
修复建议:
- 禁止
shell=True,改用subprocess.run([...], shell=False) - 将命令拆分为参数列表,使用
shlex.split()解析或手动分割 - 添加命令白名单机制,只允许执行预定义的安全命令(ls, cat, grep等)
- 限制工作目录,禁止在敏感目录执行命令
- 禁止
2. WebSocket 无认证机制
-
位置:
WebSocketHandler.handle()/WebSocketServer(~L6000+) -
风险描述:
- WebSocket 服务监听在
0.0.0.0:8765,公网可访问 - 无任何 token、密码或 session 认证
- 任何人连接后可无限制使用 DeepSeek API(消耗费用)
- 结合工具调用漏洞可直接控制服务器
- WebSocket 服务监听在
-
修复建议:
- 短期方案: 将监听地址改为
127.0.0.1,仅允许本地访问,通过 gateway/WAF 统一接入并认证 - 长期方案: WebSocket 握手阶段校验 token(支持 URL query 参数或 Authorization header)
- 参考现有 gateway 的认证机制(RSA签名/PBKDF2)做统一接入
- 添加 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 协议
- 跟随重定向时重新校验目标地址
- 禁止访问内网 IP 段:
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. 缺少优雅关闭
- 位置: 信号处理
- 说明: 关闭时未确保消息队列刷新、数据库连接正确关闭
✅ 已有的良好安全实践
审计中发现以下安全措施已经实现:
- ✅ 工具结果清洗:
_sanitize_tool_result()过滤控制字符,确保工具返回值是合法字符串 - ✅ 消息回滚机制: API 失败时
_rollback_messages()回滚对话,防止坏消息污染历史 - ✅ 对话自动压缩: Token/消息数超限自动压缩,防止上下文无限增长
- ✅ pymsg 超时防护:
recv_timeout=10s防止 Slowloris DoS 攻击 - ✅ log_client 健壮性: 双层异常保护、队列大小限制、Event 同步刷新
- ✅ 提示词软约束: 系统提示词中明确要求 AI 不要执行危险命令(需配合代码层面硬约束)
- ✅ 提示词排序修复: 数字前缀正则排序,确保技能提示正确加载顺序
- ✅ 内存搜索优化: 基于主题相关性搜索,避免不必要的全库扫描
🛠️ 修复路线图
第一阶段(立即):修复 P0
- 修复命令注入:移除
shell=True,改用参数列表,添加命令白名单 - WebSocket 认证:默认绑定 127.0.0.1,通过 gateway 接入或添加 token 认证
第二阶段(近期):修复 P1
- 统一文件操作 safe_path 校验,限制工作目录
- 网络请求添加 SSRF 防护,禁止内网访问
- 工具输出大小限制(1MB)
- 启动时 API Key 配置校验
第三阶段(后续版本):P2/P3
- 请求频率限制
- 日志脱敏
- 错误信息脱敏
- 临时文件自动清理
- 对话加密存储
- 多线程安全加固
- 优雅关闭
审计完成时间: 2026-08-01