背景:对全部 206 个 HTTP 路由 + SocketIO 事件逐个排查(主审 + 2 个子
智能体初筛后复核),另按用户要求专项审计前端渲染面(无新发现)。
完整报告见 _experiments/security_audit_2026-09-02/REPORT.md 第八章。
新漏洞修复:
- 多智能体角色 role_id 路径穿越(高):save_custom_role 直接拼接
"{role_id}.md",POST body 的 role_id 无任何校验,可 ../ 穿越覆盖
其他用户角色文件(跨用户提示词注入),本地已复现写入成功。
修复:新增 validate_role_id 白名单(^[a-z0-9][a-z0-9_-]{0,63}$),
role_store 存储层 + multi_agent API 层(POST/PUT/DELETE)双保险
- open-in-file-manager 漏 _is_host_mode_request 检查(同文件其余三个
端点都有):docker 模式下任意登录用户可触发宿主 GUI 弹窗+探测路径。
修复:补 host 检查,docker 下 403
- /api/admin/secondary/verify 无限流且 CSRF 豁免:admin 会话前提下
可在线爆破二级密码(纵深防御缺失)。修复:5 次/300s 用户维度限流
- WS client_chunk_log / client_stream_debug_log 无连接认证检查且
无限流(日志写盘放大面)。修复:必须已认证连接 + 30 次/60s 滑窗
+ 桶表万级上限回收
- _get_conversation_file_path 直接拼 "{id}.json"(conv_ 前缀恰好阻碍
直接穿越,属防御深度缺失)。修复:^conv_[A-Za-z0-9_-]+$ 白名单,
已核验全部 5 个调用点与 temp_ 前缀排除路径不受影响
- /api/conversations/media/<id> 采信 entry mime_type 并 inline 返回。
修复:text/html、image/svg+xml、xhtml 强制 octet-stream + attachment
(与 file/content 的 SVG 策略对齐,防存储型 XSS 一致性收口)
- /api/status 每次心跳返回宿主绝对 project_path(泄露系统用户名与
目录布局)。修复:docker 模式脱敏为容器视角 /workspace,host 不变
LLM 成本攻击止血(第一轮发现 5 的端点级落地):
- POST /api/tasks(GUI 发消息主入口):30 次/60s/user
- POST /api/conversations/<id>/compress(调 api_client.chat 做摘要):
5 次/300s/user
- 注:对话回顾 review 端点实为纯本地 Markdown 生成(不调 LLM),
其「发送给模型」模式走 /api/tasks,已被上述限流覆盖;
按 token 计费的完整配额方案仍遗留待产品决策
验证:全部 py_compile 通过;冒烟测试 6/6;validate_role_id 8 个恶意
样本全拒 + 3 个合法样本放行 + 穿越写入拦截回归通过;conv_id 白名单
4 组样本符合预期。端点级行为待服务重启后实测。
91 lines
3.8 KiB
Python
91 lines
3.8 KiB
Python
"""API multi-agent message pack.
|
||
|
||
User-visible messages produced by server/multi_agent.py (REST responses).
|
||
Pure data only — do not import anything here; merged into modules.i18n at import time.
|
||
Keys are prefixed with ``multi_agent_api.`` (the core table already owns
|
||
``multi_agent.*`` — no key below duplicates it).
|
||
"""
|
||
|
||
MESSAGES = {
|
||
# ── /api/multiagent/rebuild-index ──
|
||
"multi_agent_api.not_logged_in": {
|
||
"zh-CN": "未登录",
|
||
"en-US": "Not logged in",
|
||
},
|
||
"multi_agent_api.workspace_not_ready": {
|
||
"zh-CN": "工作区未就绪",
|
||
"en-US": "Workspace is not ready",
|
||
},
|
||
"multi_agent_api.context_manager_not_initialized": {
|
||
"zh-CN": "上下文管理器未初始化",
|
||
"en-US": "Context manager is not initialized",
|
||
},
|
||
"multi_agent_api.ma_conversation_manager_not_initialized": {
|
||
"zh-CN": "多智能体对话管理器未初始化",
|
||
"en-US": "Multi-agent conversation manager is not initialized",
|
||
},
|
||
|
||
# ── POST /api/multiagent/roles(创建自定义角色) ──
|
||
"multi_agent_api.role_fields_required": {
|
||
"zh-CN": "role_id/name/body_prompt 必填",
|
||
"en-US": "role_id/name/body_prompt are required",
|
||
},
|
||
"multi_agent_api.role_id_invalid": {
|
||
"zh-CN": "角色 ID 不合法:{role_id}(仅允许小写字母/数字开头,后接小写字母/数字/连字符/下划线)",
|
||
"en-US": "Invalid role ID: {role_id} (must start with lowercase letter/digit, followed by lowercase letters/digits/hyphens/underscores)",
|
||
},
|
||
"multi_agent_api.cannot_override_preset_role": {
|
||
"zh-CN": "不能覆盖预设角色 {role_id}",
|
||
"en-US": "Cannot override preset role {role_id}",
|
||
},
|
||
"multi_agent_api.role_already_exists": {
|
||
"zh-CN": "角色 {role_id} 已存在",
|
||
"en-US": "Role {role_id} already exists",
|
||
},
|
||
|
||
# ── PUT /api/multiagent/roles/<role_id>(更新自定义角色) ──
|
||
"multi_agent_api.role_not_found": {
|
||
"zh-CN": "角色 {role_id} 不存在",
|
||
"en-US": "Role {role_id} not found",
|
||
},
|
||
|
||
# ── DELETE /api/multiagent/roles/<role_id>(删除自定义角色) ──
|
||
"multi_agent_api.cannot_delete_preset_role": {
|
||
"zh-CN": "不能删除预设角色 {role_id}",
|
||
"en-US": "Cannot delete preset role {role_id}",
|
||
},
|
||
"multi_agent_api.role_not_found_or_delete_failed": {
|
||
"zh-CN": "角色 {role_id} 不存在或无法删除",
|
||
"en-US": "Role {role_id} not found or could not be deleted",
|
||
},
|
||
|
||
# ── PUT /api/multiagent/settings(更新多智能体设置) ──
|
||
"multi_agent_api.compress_threshold_too_small": {
|
||
"zh-CN": "压缩阈值不能小于 10000",
|
||
"en-US": "Compression threshold cannot be lower than 10000",
|
||
},
|
||
"multi_agent_api.max_turns_must_be_integer": {
|
||
"zh-CN": "最大轮次必须是整数",
|
||
"en-US": "Max turns must be an integer",
|
||
},
|
||
"multi_agent_api.max_turns_cannot_be_negative": {
|
||
"zh-CN": "最大轮次不能为负数(0 表示无上限)",
|
||
"en-US": "Max turns cannot be negative (0 means unlimited)",
|
||
},
|
||
|
||
# ── POST /api/multiagent/conversations(创建多智能体对话) ──
|
||
"multi_agent_api.conversation_manager_not_initialized": {
|
||
"zh-CN": "对话管理器未初始化",
|
||
"en-US": "Conversation manager is not initialized",
|
||
},
|
||
|
||
# ── GET /api/multiagent/active_sub_agents ──
|
||
"multi_agent_api.missing_conversation_id_param": {
|
||
"zh-CN": "缺少 conversation_id 参数",
|
||
"en-US": "Missing conversation_id parameter",
|
||
},
|
||
"multi_agent_api.sub_agent_manager_not_ready": {
|
||
"zh-CN": "子智能体管理器未就绪",
|
||
"en-US": "Sub-agent manager is not ready",
|
||
},
|
||
} |