这份文档假设读者会把它部署到有真实客户数据的环境。先读第 1 节,那是设计上的既有缺陷,不是配置问题。
1. 三条必须知道的事实
- 管理后台没有登录。
/admin/*是内网管理面板,靠"不放公网"保护,不是靠认证。任何能访问 8765 端口的人都能改智能体、看客户聊天记录、下发设备指令。→ 只绑内网 / 尾巴上必须加反代 basic auth 或 VPN(见 06 第 4 节)。 - WebSocket 没有鉴权。
client_id(设备号)就是身份。猜到设备号就能冒充设备上线、接收服务端下发的指令(其中包含客户消息内容)。→ 服务端只监听内网;设备号不要用可枚举的短串。 /ext默认关闭。未配EXT_TUNNEL_SECRET时所有/ext/*返回 403。这是唯一默认安全的部分。
2. 威胁模型
| 威胁 | 现实性 | 缓解 |
|---|---|---|
| 服务端端口被公网扫到,后台裸奔 | 高(默认配置就会这样) | 只绑内网 / 反代加认证 / 防火墙白名单 |
| 冒充设备接入,窃取消息 | 中 | 内网隔离;轮换设备号;不要把 8765 暴露 |
客户账号(/ext)越权看别人的数据 | 中 | 三道门 + 两级可见范围(组织 ∩ 账号),未授权一律 403 不暴露 id |
| 聊天内容流出到第三方 LLM | 高(用了云端模型就是事实) | 用本地 ollama;或明确告知客户;记忆/知识库尽量减少明文敏感信息 |
| 客户在消息里注入指令(prompt injection) | 高 | 记忆清理与人工导入分离、工具逐项授权、敏感工作流额外授权 |
| 模型被诱导执行危险指令(删好友/解散群) | 中 | 这些指令默认不给智能体授权;要用就逐台开 |
| 执行端丢失(平板 / 手机) | 中 | 服务端解绑设备 → 记忆绑定失效;改管理后台口令 |
3. 默认安全设计(已实现)
- 工具逐项授权:联网、建表、建任务、读写某张表、跑某个工作流、下发某个指令号,全部是独立开关,默认全关。设备端
error()一律上报 302 进审计。 - 没有删表能力:工具集里永远没有
table_delete,工作流 delete 节点一律拒绝。 /ext只读为主:设备/智能体/知识库/表格只可查看;可写的只有"开关 LLM 推送""改模型参数""长期记忆条目"。越权字段在处理函数里被忽略,不是界面上藏起来。- 可见范围两级:组织级配置 ∩ 账号级配置,取交集。不配 = 跟随组织。
- 记忆可回看:唯一会删数据的功能(记忆清理)留 before/after 清单,且只删
source='agent'。 - 会话安全:
/extcookie 带指纹,改密后旧会话自动失效。 - 没有硬编码密钥:所有密钥走
.env或数据库;开源仓里应有.env.example而无.env。
4. 上线前必做(按优先级)
- 监听只绑内网/本机:
HOST=127.0.0.1(venv 方式)或 compose 的ports: ["127.0.0.1:8765:8765"],外网通过反代进;8765 别直接暴露。 - 反代对
/admin加 basic auth / 仅内网可达;/ext用X-Tunnel-Secret。 MYSQL_PASSWORD、EXT_TUNNEL_SECRET用长随机串,别用默认值;每季度轮换。DEBUG=false、RELOAD=false、EXT_COOKIE_SECURE=true(HTTPS)。- LLM key 只存在数据库的智能体行里,别写进
.env或代码;离职/换人时在后台改掉。 - 执行端:单独一台平板(推荐)或手机 + 单独的企业微信账号;关闭无关通知;别在设备上留客户资料截图。
- 备份(见 06)并真的演练一次恢复。
- 给客户的数据留存说明要写清楚:消息会进
messages表、会被送去哪个模型。
5. 合规与免责
- 本项目通过安卓无障碍服务模拟人工操作企业微信。这属于本机自动化,不是协议破解;但它可能违反企业微信的服务条款,账号存在被限制的风险。风险由部署者承担。
- 不要用它做群发广告、批量加人、爬取通讯录——这些是平台明确限制的行为,也是本项目不为其做任何优化的方向。
- 客户聊天内容属于个人信息/商业信息。接入云端 LLM 等于把这些内容交给第三方。请自行完成必要的告知与授权(尤其涉及欧盟/国内个保法场景)。
- 商标 "SevFish / SevFishComVBot" 不随代码授权(Apache-2.0 §6)。二次分发请改名。
6. 报告安全问题
发现漏洞请不要开公开 issue。用仓库的 Security 页面私密报告(或 issue 里先说明"想私下沟通"),通常 7 天内回复。