记忆威胁扫描(INV-MEM-24)
wesgine 在每次记忆写入时扫描内容中的凭据泄漏和不可见字符攻击。
Always-on,无 opt-out
威胁扫描在 Store.Save 路径中强制执行,不可关闭。
匹配时返回 ErrThreatPatternDetected,拒绝写入。
5 条凭据正则
| 模式 | 匹配示例 |
|---|---|
hardcoded_secret | api_key = "sk-..." |
connection_string_password | postgresql://user:pass@host |
aws_access_key | AKIA... |
bearer_token | Bearer eyJ... |
private_key | -----BEGIN RSA PRIVATE KEY----- |
不可见 Unicode 检测
检测隐藏在文本中的不可见字符:
- 零宽空格(U+200B)
- 零宽非连接符(U+200C)
- 左到右标记(U+200E)
- 右到左标记(U+200F)
- 其他 Unicode 控制字符
U+200D(ZWJ)不在检测范围:它是 Emoji 组合序列和中文排版的合法字符。
写入侧 vs 读取侧
| 时机 | 行为 |
|---|---|
写入(Store.Save) | FirstThreatError() 扫描 → 匹配则拒绝 |
| 读取(recall 路径) | SanitizeForRecall 剥离 invisible unicode |
写入侧更严格(拒绝),读取侧做清洗(剥离)。
与 KB 扫描的区别
| Memory 威胁扫描 | KB 威胁扫描 | |
|---|---|---|
| 扫描器 | FirstThreatError()(5 条正则 + invisible unicode) | ScanKBChunk()(仅 private_key) |
| 粒度 | 条目级拒绝 | chunk 级过滤 |
| 范围 | 所有 5 类凭据 | 仅 PEM 私钥 |
| 误报率 | 低(记忆内容通常不含 DSN 示例) | 极低(只查 PEM 头) |
KB 使用独立扫描器的原因:Memory 的 5 条正则对文档内容系统性误报(设计文档 DSN 示例、IM 配置模板、AWS 示例 Key 全部触发)。
Govern v2 收敛
威胁模式扫描从 Govern v1 的宽泛检测(含 prompt injection / exfiltration / C2 启发式)收敛为两类:
- 凭据泄漏:5 条正则
- 不可见 Unicode:控制字符检测
prompt injection / exfiltration / C2 启发式已移除——误报率过高。
内容质量门控(INV-MEM-31)
在威胁扫描通过后,还有内容质量门控:
- 拦截引擎状态前缀(
PLAN_STATE:/TASK_STATE:/SUBAGENT_RESULT:等) ScopeWorking豁免- 返回
ErrContentQualityRejected
Govern v2 仅保留 R1(引擎状态前缀拦截),R2-R4(大段 JSON、plan 签名、原始代码块)已废除。
在写入管线中的位置
层映射 → Actor 校验 → 去重 → Kind/Session 校验
→ **威胁扫描** → 内容质量门控 → 写入审批 → Embedding → 持久化
威胁扫描在去重和 Kind 校验之后、内容质量门控之前。
相关文档
- 记忆写入管线 →
memory-write-pipeline.md - 流式泄漏扫描 →
leak-scan.md - 知识库系统 →
knowledge-system.md - 密钥管理 →
secret-management.md