agent-Specialization/modules/i18n_messages/api_multi_agent.py
JOJO 57043b0084 fix(security): 第二轮全量 API 审计修复(角色穿越/宿主 GUI/限流收口)
背景:对全部 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 组样本符合预期。端点级行为待服务重启后实测。

Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-02 19:37:34 +08:00

91 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""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",
},
}