# 安全与诊断访问 ## 1. 威胁模型 保护对象包括:用户消息、角色设定、记忆、文件、私箧密文(用户独立持钥,平台不可恢复)、BYOK/Provider/MCP 凭据、工具输入输出、模型 Prompt、诊断数据和审计记录。 主要威胁: - 跨用户或跨角色 IDOR; - Prompt Injection 诱导工具越权或秘密外传; - 恶意插件获得进程权限; - Header 透传泄露凭据; - 诊断接口成为管理员旁路;账户恢复、管理员或诊断接口试图读取私箧明文; - 工具重试造成重复副作用; - 日志、APM、CDN 和浏览器缓存保存敏感数据; - 删除后索引、缓存或派生内容继续使用; - 恶意社区内容、角色卡、媒体或插件供应链; - 支付 Webhook 重放、金额篡改、重复退款或重复结算; - 创作者账户接管、虚假交易、洗钱、拒付与恶意退款; - 相机、麦克风、屏幕、位置或声音克隆越权; - 推荐系统泄露私密特征或放大有害内容;欠费或封禁流程删除角色与记忆数据。 ## 2. 插件与工具安全 - [产品宪章](../product/product-charter.md)定义的核心禁域不能被 Prompt、插件、管理员或普通自托管配置关闭;自托管档位可裁剪能力,不得混淆职责或关闭禁域。 - 只有 bundled Core plugin 可以在主进程运行。 - 声明式/远程插件默认受限;部署者信任的本地代码插件也必须运行在独立进程或容器。 - 语言 VM 不算安全隔离。 - 插件依赖和权限必须在 Manifest 声明。 - 工具输入视为模型产生的不可信输入,必须 Schema 校验和 Policy 判定。Policy 按四维综合裁决而非只看工具名称:**能力**(动作自身与可逆性)、**数据**(读取或传出的数据及敏感度)、**后果**(现实副作用、传播范围与费用)、**情境**(界域、设备状态、对象与用户状态);亲密程度、角色信任或"过去允许过"不能替代具体授权。 - 文件路径 canonicalize 后必须位于授权根目录;网络使用 allowlist;命令执行限制资源和时间。 - 无隔离后端时拒绝危险工具,禁止 unconfined fallback。 ## 3. 凭据与客户端认证 - 1.0 使用 OAuth 2.1:Web 为安全 HttpOnly Session Cookie,Tauri 为 Authorization Code + PKCE,公共客户端为短期 Bearer,自动化为限 scope Service Account API key。 - 用户登录、API、Service Account、诊断和 Provider 凭据只通过 HTTP Header 传递;不进入 query、业务 body、SSE data 或 WebSocket URL。对象存储预签名 URL 是短期、对象绑定 capability,仅按上传契约作为受控例外。 - Cookie 状态变更验证 Origin 和 CSRF token;Tauri 回调只允许已登记 loopback/deep link。 - 2.0 才设计自研加密登录、刷新和设备令牌协议;1.0 不自创密码协议。 - 密钥存 Secret Store,只在执行边界注入。 - 浏览器、Prompt、记忆、工具结果和普通日志都不出现密钥。 - 记忆提取器和插件只能提出 Candidate,Core 在写入和召回前执行所有权、敏感度与审批策略;设备 Restricted 数据不得自动写入记忆。 - 记忆召回先在数据库查询层授权和过滤,再访问全文、向量或图投影;禁止跨域召回后应用层过滤,临时/Working Context 也不能跳过 Conversation、Branch 和 Run 隔离。 - 记忆来源中的 Prompt Injection 只能作为不可信内容处理,不得改变 actor、scope、审批、敏感度或删除策略。 - APM 与代理对 `Authorization`、Cookie、Provider keys、`Hunjing-Diagnostic-Token` 全量脱敏。 - Header 与 body 注入应限制目标 host;URL path/query 不注入秘密。 - 支持密钥撤销、轮换和按数据域分配。 ## 4. 设备与媒体安全 - 设备能力同时受 OS 权限、`device_grant`、角色范围、用途和期限约束。 - 摄像头、麦克风和屏幕采集必须有持续可见指示与即时停止。 - 人脸、声纹、精确位置和屏幕内容为 Restricted;不进入推荐、普通日志或自动记忆。 - 声音克隆需要可验证授权、用途/传播范围、撤回和滥用举报。 - 上传媒体先做类型验证、恶意文件扫描、内容安全和许可检查。 - Tauri command 使用最小 allowlist;WebView 内容不能直接调用通用 Shell。 ## 5. 社区、协作与市场安全 - Community、Workspace、Personal Domain 与 Finance 使用不同授权策略。 - 公开角色版本不包含私密记忆、关系、对话、设备授权或密钥。 - 举报和审核保留证据摘要、处置、申诉和操作者审计;审核模型不独立执行永久高影响处置。 - 插件和数字商品发布前检查签名、恶意代码、权限、许可证、来源和隐私声明。 - 购买不等于启用插件,也不等于批准权限。 - 内容推荐禁止使用 Restricted 数据,并提供关闭个性化、屏蔽和重置。 ## 6. 支付与结算安全 - 支付和结算只接受服务端价格快照;客户端金额不可信。 - Provider Webhook 验签、校验时间窗、按 event ID 幂等,并通过重放测试。 - Order、PaymentAttempt、Refund、Dispute、Ledger、Entitlement 和 Payout 分离。 - Ledger 不可变;退款和冲正写新分录,不修改历史金额。 - 同一退款、结算批次和 Payout 使用稳定幂等键。 - KYC、银行和税号优先由合规 Provider 托管;本地只存引用、状态和脱敏信息。 - 反欺诈限制不能静默没收创作者余额;冻结、申诉和释放过程可审计。 ## 7. 诊断双重授权 ### 7.1 流程 ```mermaid sequenceDiagram participant U as User participant A as API participant G as Grant Service participant D as Diagnostics participant L as Audit Log U->>A: re-authenticate and request Run diagnostics A->>G: issue scoped grant G-->>U: one-time opaque token U->>D: Bearer session + diagnostic headers D->>G: validate hash, scope, target, expiry, uses G-->>D: allow or deny D->>L: record access result D-->>U: redacted response, no-store ``` 普通登录态证明“是谁”;诊断授权证明“为何、在什么范围、多久、读取哪个 Run”。任一单独存在都不足以读取。 ### 7.2 请求头 | Header | 规则 | | --- | --- | | `Authorization` | 普通 `Bearer` 登录令牌 | | `Hunjing-Diagnostic-Token` | opaque token,`hjd_` 前缀,不带 Bearer | | `Hunjing-Diagnostic-Purpose` | 固定枚举 | | `Hunjing-Request-ID` | 推荐 | Purpose:`user_inspection`、`support_case`、`security_investigation`、`automated_evaluation`。 令牌不得放 query、body、Cookie、SSE data 或 WebSocket URL。重复头、逗号合并、控制字符和未知 Purpose 一律拒绝。 ### 7.3 Grant 数据库只保存 token hash: - issuer、subject、personal domain; - 绑定 `run_id`,可进一步绑定 `turn_id`; - scopes、diagnostic level、purpose; - support case; - issued/expires/used/revoked; - max uses、region、creation trace。 默认有效期 15 分钟、单次、绑定一个 Run。Sensitive level 需要重新认证和逐次确认。 ### 7.4 Scopes - `diagnostics:turn:summary` - `diagnostics:model:usage` - `diagnostics:tool:summary` - `diagnostics:tool:sensitive` - `diagnostics:context:manifest` - `diagnostics:audit:read` 管理员角色不自动获得这些 scope。支持人员只能读取用户主动绑定工单生成的支持包。 ## 8. 响应和审计 诊断响应必须设置: ```http Cache-Control: no-store, private Pragma: no-cache Content-Security-Policy: default-src 'none' X-Content-Type-Options: nosniff ``` 每次成功和失败访问记录 actor、grant、purpose、目标、scope、结果、IP/设备摘要、时间和 trace。审计本身不保存被访问的敏感正文。 对象错配返回 404,减少资源枚举;token 失效、过期、撤销、scope/region 不符返回统一权限错误,不向调用方区分细节。 ## 9. 数据分级 | 级别 | 示例 | 默认观测 | | --- | --- | --- | | Public | 插件 ID、事件类型 | 可记录 | | Internal | 逻辑模型、耗时、状态 | 结构化记录 | | Sensitive | 用户消息摘要、脱敏工具参数 | 受控诊断 | | Secret | Token、Key、Cookie、签名 URL | 永不记录 | | Restricted | 私密原文、高敏文件 | 仅明确授权支持包、限期加密 | 隐藏 chain-of-thought 不属于可申请诊断内容;只允许用户可见的思路摘要和供应商返回的计数。PersonalDomain 数据默认不用于模型训练;自愿贡献需独立、明确、可撤销的同意,且不进入默认观测与诊断。审计链至少能回答:谁、在何时、基于何种授权和输入、对什么对象、执行了什么、结果如何、关联哪条 trace。 ## 10. 删除与保留 - 撤权和删除立即阻止普通查询与召回。 - 诊断授权不能绕过删除墓碑。 - Provider 原始请求/响应默认不保存;支持包到期自动删除。 - 常规 usage 与审计保留期独立于消息原文,并遵守最小化原则。 - 备份到期恢复后必须重放删除清单,防止已删数据复活。