# 安全策略

本插件把 QQ 消息转给 DSH Agent，涉及工具权限与凭据。支持的版本：最新 `main` 与最近一个 tag。

## 报告渠道

- **不要**在公开 issue 里贴 access_token、QQ 号、服务器地址、Agent 工具输出。
- 发现权限绕过、命令注入、凭据泄漏一类问题，走私信：开一个只写「安全问题，请私聊」的 issue（不写细节），或直接联系维护者 [@arrow1031](https://github.com/arrow1031)，再要不加联系方式里的群私聊群主一下也行（不一定能及时回，但是问题正常合理的情况下肯定会想办法处理）。
- 目标响应时间：48 小时内首次回复；确认后 7 天内给出修复计划。

## 拥有者设置通道（qqconfig）的威胁模型

0.10 起拥有者可以在 QQ 私聊里让机器人改一部分设置。这条通道按「能被社工、也能被自己手滑」设计：

- **身份不可伪造**：判定依据是当前 QQ 会话最近一条消息的发言人，不是工具参数里的字符串；插件重启后待确认的 token 全部失效（只存在内存里）。
- **场域限制**：只在拥有者私聊里可用；群里调用直接拒绝。
- **字段白名单**：`auth.*` / `onebot.*` / `imageGen.*` / `webSearch.*` / `proactive.model` / `proactive.speakProvider` / `proactive.speakModel` / `mode` / `adapterPath` 等硬拒绝，即使有人误加进白名单也会被 `DENY_PREFIXES` 二次挡下——机器人无法通过这条通道给自己扩权。
- **两步确认 + 修订号**：`propose` 不落盘；`apply` 时若配置已被设置页改过（revision 变化）则作废。
- **落盘不经手 YAML**：只调 DSH settings 服务（schema 校验、原子写、热重载）；服务不可用时拒绝，不退化成手写 `cordis.patch.yml`。
- **限流与审计**：默认每小时 6 次 / 每天 30 次；每次结果追加到 `QQ_msg/qqbot-config-audit.jsonl`。
- 总开关 `auth.ownerSettings`，关掉即彻底禁用。

发现任何绕过（非拥有者触发写入、白名单外的字段被改、审计缺失）请按上面的渠道私信。

## 流程授权（0.12 起，默认关）

给「子代理 / 队友 / 工作流」这四个高危编排工具加一道私聊动态码，默认 `flowAuth.enabled=false`（关着时行为与 0.11 相同）：

- **默认关就等于没装**：关着时既不接管工具面、也不拦截 `/auth` `/flow` 消息。
- **动态码只在私聊**：只认拥有者 + 私聊 + 消息首位；命中即拦截，不进 Agent 回合，动态码不落会话历史（还会先剥掉零宽等不可见字符，防 `/auth` 被前置字符绕过）。
- **一次一用 + 30 秒**：一条授权只放行一次调用，`grantTtlSeconds` 默认 30 秒；同一个 30 秒窗口的动态码不能重放；连续错 5 次锁 15 分钟；待授权申请本身也会过期。
- **身份快照**：闸门读的是本回合开始时固化的发言人，排队期间别人插话不会改判已有回合（工具层同样读快照）。
- **产物有边界**：只打包本会话目录里本轮的新文件，符号链接与隐藏文件跳过，文件名统一加 `./` 前缀并拒绝含换行的名字。
- **恢复码**：scrypt 哈希存配置、明文只在终端打印一次；用掉后插件会把对应哈希删掉，写盘失败才需要手动清理。
