流式泄漏扫描(LeakScan)
wesgine 在 LLM 流式输出过程中实时扫描凭据泄漏。
工作原理
LLM 的流式输出(stream delta)经过 LeakScan 过滤器:
LLM stream delta
↓
LeakScan buffer
↓ 每 200 字节扫描一次
发送给客户端
↓ stream 结束
最终扫描(无条件)
扫描目标
与 Memory 的威胁扫描(INV-MEM-24)使用相同的模式:
| 模式 | 示例 |
|---|---|
| 硬编码密钥 | api_key = "sk-..." |
| 连接字符串密码 | postgresql://user:pass@host |
| AWS Access Key | AKIA... |
| Bearer Token | Bearer eyJ... |
| PEM 私钥 | -----BEGIN RSA PRIVATE KEY----- |
双 Buffer(INV-LEAK-01)
LeakScan 维护两个 buffer:
| Buffer | 内容 |
|---|---|
| 文本 buffer | 模型的正常回复 |
| Thinking buffer | 模型的推理过程 |
最终扫描
stream 结束时对两个 buffer 各做无条件最终扫描:
- 不受 200 字节间隔限制
- 防止凭据在最后残留字节中逃逸
为什么需要最终扫描
考虑以下场景:
delta 1: "The API key is sk-abc" ← 扫描通过(不完整)
delta 2: "123def" ← 补全了完整密钥
[stream 结束]
如果没有最终扫描,buffer 中残留的 sk-abc123def 永远不会被检测。
检测后行为
发现凭据泄漏时:
- 替换为
[REDACTED] - 记录安全事件
- 不中断 stream(继续发送后续内容)
与其他安全机制的关系
| 机制 | 扫描时机 | 目标 |
|---|---|---|
| Memory 威胁扫描 | 写入 Memory 时 | 防止凭据进入持久化 |
| LeakScan | LLM 输出时 | 防止凭据发送给用户 |
| SanitizeEnv | exec 启动时 | 防止凭据进入子进程 |
| RedactSecrets | API 响应时 | 防止凭据出网 |
四层防护各自独立。
相关文档
- 记忆威胁扫描 →
memory-threat-scanning.md - 密钥管理 →
secret-management.md - Exec 安全 →
exec-security-model.md