docs(security): 修正安全审计文档与代码不一致

- core: MQ kill/exec 实际未禁用,修正错误声明;HttpTask.cpp 行号 L53→L58
- gateway: 更新 20+ 处行号偏移(_KEYGEN/handleProxy/is_safe_target 等)
- aibox: shell=True 4处→3处,handle_connection/WebSocket 行号更新
- DEPS: WebSocketServer.cpp 已删除,fuzz 需求转移至 HttpServer_WsSession
- 加固计划: Phase 1.1 (127.0.0.1 绑定) 标记为已完成
- captcha/libhttp: 修正轻微行号偏移
This commit is contained in:
qing committed 2026-08-06 15:25:07 +00:00
1 parent 7ff73b7d07
commit 7f288f1c09
7 files changed
+61 -59

No files matched your search

+14 -14
View File
@@ -9,7 +9,7 @@
## 代码验证记录
**验证日期**: 2026-08-03
**验证方式**: 逐条对照审计报告与当前代码(`aibox.py` 358KB,关键区域 L3600-3850, L6540-6740, L7071-7160, L8410-8470)
**验证方式**: 逐条对照审计报告与当前代码(`aibox.py` 358KB,关键区域 L3600-3850, L6300-6400, L7071-7160, L8600-8660)
### 验证结果汇总
@@ -27,14 +27,14 @@
| 编号 | 状态 | 代码位置 | 验证说明 |
|------|------|----------|----------|
| P0-1 | ❌ | L3664, L3751, L6553, L6715 | `shell=True` 仍在 4 处使用,命令注入未修复 |
| P0-2 | ❌ | L1177, L8423-8426 | 默认 `localhost:8765`(非 `127.0.0.1`),`handle_connection` 无任何认证 |
| P0-1 | ❌ | L3701, L3788, L6367 | `shell=True` 仍在 3 处使用,命令注入未修复 |
| P0-2 | ❌ | L1204, L8609 | 默认 `localhost:8765`(非 `127.0.0.1`),`handle_connection` 无任何认证 |
| P1-1 | ❌ | L3943-3957, L5999-6017 | `check_path_safety` 仅检查文件大小,无 `realpath` 前缀校验 |
| P1-2 | ❌ | L2037, L7365 | `requests.post` 无内网 IP 过滤 |
| P1-3 | ❌ | 系统提示词 | 工具完整参数 schema 仍暴露 |
| P1-4 | ❌ | L8326 | `api_key=None` 默认值,启动时未校验 |
| P2-1 | ❌ | L7823 | `message_count` 仅统计未限流 |
| P2-2 | ⚠️ | L1582, L3580 | `TOOL_MAX_RESULT_LENGTH=100000`,`MAX_OUTPUT_BYTES=1MB`(有缓解) |
| P2-2 | ⚠️ | L1609, L3617 | `TOOL_MAX_RESULT_LENGTH=100000`,`MAX_OUTPUT_BYTES=1MB`(有缓解) |
| P2-3 | ❌ | SQLite | 对话仍明文存储 |
| P2-4 | ❌ | - | 临时文件清理未验证 |
| P2-5 | ❌ | L4191-4251 | 技能 `.sh`/`.py` 直接加载执行 |
@@ -42,7 +42,7 @@
| P3-1 | ❌ | - | 递归深度仍为 `max_recursion_depth=10` |
| P3-2 | ❌ | - | 对话压缩可能丢失工具调用上下文 |
| P3-3 | ❌ | - | 多连接竞争条件未加固 |
| P3-4 | ⚠️ | L1177 | 默认 `localhost`(非 `0.0.0.0` 也非 `127.0.0.1`) |
| P3-4 | ⚠️ | L1204 | 默认 `localhost`(非 `0.0.0.0` 也非 `127.0.0.1`) |
| P3-5 | ❌ | - | 优雅关闭未验证 |
---
@@ -51,10 +51,10 @@
### P0-1: 命令注入漏洞 ❌
- **位置**: `aibox.py` L3664, L3751, L6553, L6715
- **位置**: `aibox.py` L3701, L3788, L6367
- **风险描述**:
```python
# 当前危险实现(4处)
# 当前危险实现(3处)
subprocess.Popen(command, shell=True, ...)
subprocess.run(command, shell=True, capture_output=True, text=True)
```
@@ -72,7 +72,7 @@
### P0-2: WebSocket 无认证机制 ❌
- **位置**: `aibox.py` L8423-8426, L1177
- **位置**: `aibox.py` L8609, L1204
- **风险描述**:
- WebSocket 默认监听 `localhost:8765`(已从 `0.0.0.0` 收敛,但仍非 `127.0.0.1`)
- `handle_connection` 无任何 token、密码或 session 认证
@@ -170,12 +170,12 @@
## ✅ 已有安全机制
1. ✅ **工具结果清洗**: `_sanitize_tool_result` 过滤控制字符(L7071-7087)
2. ✅ **OOM 防护**: `MAX_OUTPUT_BYTES = 1MB`,`_read_with_limit` 截断输出(L3580-3630)
3. ✅ **工具结果大小限制**: `TOOL_MAX_RESULT_LENGTH=100000` 截断(L1582, L7153-7155)
4. ✅ **三层中断机制**: `_is_cancelled` + `create_task` 异步解耦 + 连接关闭取消 Task(L7106, L8431, L8445)
5. ✅ **fail-closed 设计**: 工具异常时安全返回错误信息,不暴露内部状态(L7127-7130)
6. ✅ **对话自动压缩**: Token/消息数超限自动压缩,防止上下文无限增长(L1700-1740)
1. ✅ **工具结果清洗**: `_sanitize_tool_result` 过滤控制字符(L7080-7096)
2. ✅ **OOM 防护**: `MAX_OUTPUT_BYTES = 1MB`,`_read_with_limit` 截断输出(L3617-3670)
3. ✅ **工具结果大小限制**: `TOOL_MAX_RESULT_LENGTH=100000` 截断(L1609, L7111)
4. ✅ **三层中断机制**: `_is_cancelled` + `create_task` 异步解耦 + 连接关闭取消 Task(L6890, L8617, L8650)
5. ✅ **fail-closed 设计**: 工具异常时安全返回错误信息,不暴露内部状态(L7167 附近)
6. ✅ **对话自动压缩**: Token/消息数超限自动压缩,防止上下文无限增长(L1753-2202)
7. ✅ **消息回滚机制**: API 失败时 `_rollback_messages` 回滚对话,防止坏消息污染历史
8. ✅ **提示词软约束**: 系统提示词中明确要求 AI 不要执行危险命令(需配合代码层面硬约束)