# 安全策略 默认策略: - 仅允许配置的稳定 Weixin sender ID; - 查看项目和解释代码可用; - 修改文件、运行命令、外网访问、提交推送必须由 DSH 权限层确认; - 删除文件、读取密钥、发送 session/cookie/token 默认拒绝; - 确认码一次性、短时有效并绑定 sender、conversation、动作摘要; - 入站消息和工具调用写入审计日志; - session 文件、密钥和二维码数据只存本机安全目录; - 插件 transport 只监听本机,不暴露未经鉴权的公网端口; - 入站附件(图片/文件/语音/视频)**先过白名单与去重,再从 CDN 下载**:未授权的发信人无法让本机 对 CDN 发起请求; - 入站文件名一律视为不可信数据,只取 basename 并加随机前缀后写盘,不参与路径拼接; - 语音识别的桥进程是本机受信子进程,**只读本地文件、不联网**(模型下载由 `HF_HOME` 决定); 识别结果一律作为**用户原话**处理,不提升为工具授权。 ## 威胁模型 微信文本不是可信的工具授权。账号被盗、转发消息、重复投递和模型误判都不能绕过 DSH 的工具权限层。任何来自微信的请求都必须经过 sender 白名单、消息去重、权限判定和必要的二次确认。 入站媒体按「先授权、后取件」排序:下载发生在 allowlist 与 dedupe 之后,因此拒绝路径上不会产生任何 出网请求。取回的字节按 `Content-Length` 与实际长度双重限流,解密失败不落盘,写盘用独占模式并做文件名 消毒,避免路径穿越、符号链接抢占与内存耗尽。 ## 语音识别(ASR)的边界 ASR 把音频变成**文本**,这段文本在威胁模型里的位置与用户手打的文字**完全等价**:同样是不可信输入, 同样要过权限层。识别不增加新的信任。 - 转写结果只作为「用户说了什么」交给 Agent,插件自己的说明(`【语音转写】`、失败原因)与之分开标注, 避免模型把插件的记账文字当成用户指令; - 识别为空时**必须**如实说明并明确禁止编造内容——空结果不许被模型补全成一句看起来合理的指令; - 未授权的发信人根本走不到下载与转码,自然不会触发任何 ASR 调用; - 桥进程常驻,但每个请求只写它自己的 stdout;stdout 上任何**非 JSON** 的行都按诊断信息丢弃并记录, 永远不会被当成一条转写结果; - 桥崩溃、超时、拒绝服务都只降级为「附上音频文件」,不会挂起插件,也不会让消息丢失。