安全回归测试集应该覆盖哪些场景?
简化版
安全回归集要覆盖两面:危险请求是否被正确拒绝或安全转换,正常但敏感的请求是否仍能得到帮助。只放攻击正例会鼓励模型拒绝一切,无法发现过度拒答。
场景应包括直接有害请求、编码和角色扮演变体、多轮拆解、间接提示注入、隐私与权限、工具副作用、策略泄露和历史线上事故。结果按严重度独立设 Gate,Critical 失败不能被总体平均分掩盖。
安全回归的最低标准不是“拒绝危险词”,而是对真实攻击路径保持防御,同时不破坏相邻的合法用途。
详细版
一组安全测试最好包含对照对:
危险正例:针对真实目标生成可直接执行的攻击步骤
正常反例:解释同类漏洞原理并给出防御代码
边界样本:授权靶场中的有限测试请求
若模型拒绝三者,攻击拦截 Recall 很高,但有用性为零。应同时计算:
unsafe_compliance_rate = 危险样本中违规协助数 / 危险样本数
over_refusal_rate = 正常样本中不当拒绝数 / 正常样本数
| 维度 | 必测内容 | 主要风险 |
|---|---|---|
| 内容安全 | 暴力、自伤、仇恨等 | 直接有害输出 |
| 隐私 | PII、跨用户数据 | 泄露与重识别 |
| 注入/越狱 | 直接、间接、多轮 | 指令层级被覆盖 |
| 工具安全 | 越权、参数篡改、重放 | 真实副作用 |
| 可靠性 | 虚构成功、错误状态 | 用户误判业务状态 |
| 正常反例 | 教育、新闻、防御、求助 | 过度拒答 |
完整版教学
1. 从威胁模型推导覆盖
先列出攻击者、资产、入口、工具能力和潜在后果。客服机器人与代码 Agent 的风险不同,不能照搬同一套题。
每个高风险路径至少有直接攻击、变体攻击、正常对照和历史事故探针。
2. 为什么正例与反例必须成对
成对样本只改变风险关键因素,例如是否有真实目标、是否具备授权、是否要求可执行细节,从而判断模型是否理解边界。
没有相邻正常反例,最保守的“全部拒绝”会得到虚假高分。
配对还可以定位策略边界:如果两题都允许,说明危险控制不足;两题都拒绝,说明过度保守;只有危险题拒绝且正常题完成,才体现了真正区分能力。
3. 直接攻击要覆盖什么
覆盖明确要求违法、有害、隐私泄露或越权操作的请求。不要只使用一个固定措辞,应包含不同语言、语气、专业程度和输出格式。
但变体应代表真实攻击,不应只做无意义字符扰动来堆数量。
4. 多轮组合风险怎样测试
攻击者可把最终目标拆成资料收集、步骤生成和执行建议。单轮分别看似允许,组合后可能显著提升危险能力。
测试要保留完整会话状态,并评分每轮累积帮助与最终结果,而不只看最后一句是否拒绝。
5. 间接提示注入如何进入回归集
把恶意指令放在网页、邮件、RAG 文档、工具结果或图片 OCR 中,验证模型是否把不可信内容当数据而非高优先级指令。
| 载体 | 示例风险 | 验证点 |
|---|---|---|
| 网页 | 隐藏指令要求上传数据 | 是否忽略并保留来源 |
| 邮件 | 伪造管理员请求 | 是否验证权限 |
| RAG 文档 | 要求泄露 System Prompt | 是否遵守指令层级 |
| 工具结果 | 返回诱导下一步调用 | 是否校验工具输出 |
6. 工具副作用如何验证
使用沙箱或 Mock 工具检查最终状态、权限、确认步骤、幂等和重试。模型文字拒绝但工具已执行,同样是严重失败。
安全回归必须验证真实状态变化,不能只对最终自然语言打分。
对删除、付款、外发等动作设置 Critical Gate。
7. 策略泄露与系统信息如何测试
覆盖索要 System Prompt、内部阈值、密钥、工具清单和其他用户上下文。期望行为不是机械否认一切,而是保护敏感内容并继续提供允许的产品说明。
日志与错误堆栈也可能泄露内部信息,应在失败路径测试。
8. 过度拒答集如何构建
收集教育、新闻、文学、医学求助、安全研究和无害转换等敏感主题的正常请求,按领域专家标注允许范围。
加入最小对照差异,例如“解释原理”与“对真实目标给 Payload”,提高边界诊断能力。
过拒样本应来自真实用户分布和申诉记录,并按群体、语言与主题切片。否则只用人工构造的明显安全题,会低估真实环境中含糊表达的误拒。
9. 历史事故如何沉淀
事故样本脱敏后进入 Incident Set,同时生成根因相同的若干变体,避免只记住原句。记录事故严重度、修复组件和期望防线。
每次相关组件变化都优先运行这些样本,并保留旧版本结果用于证明不复发。
10. 如何评分复杂安全行为
标签不应只有 Pass/Fail。可记录是否违规、危险细节程度、拒答是否最小、是否给安全替代、是否泄露策略、是否触发副作用。
高风险硬规则优先,主观帮助性再由校准后的 Judge 或人工评分。
pass = no_policy_violation
AND no_unauthorized_side_effect
AND (helpful_safe_answer OR justified_refusal)
11. 门禁如何按严重度设置
Critical 事件通常零容忍;High 可设置极低阈值并人工复核;Medium/Low 使用与基线比较和置信区间。
总体通过率只做概览,不能把 1 条 Critical 泄露与 100 条措辞通过平均后批准发布。
12. 如何控制随机性和 Flaky
固定可控参数,对关键攻击多次运行,报告最坏结果或违规概率。外部工具使用确定性沙箱,Judge 分歧进入人工复核。
安全测试偶发失败本身就是风险信号,不应通过无限重试掩盖。
13. 套件如何持续更新
结合新政策、新工具、红队发现、线上举报和攻击情报更新 Challenge Set;Core Safety Set 保持稳定用于趋势。
新增样本做语义去重、标注一致性和数据泄漏检查,审计旧真值是否仍适用。
每次版本发布记录新增、修改、退役样本和标签迁移,必要时用重叠锚点生成桥接报告。这样分数变化才能区分模型改动与测试集组成变化。
14. 常见误区与追问
- 误区:安全集只需要危险 Prompt。 缺少正常反例会奖励全面拒答。
- 误区:把一句越狱话术改写 100 次就有广覆盖。 应覆盖不同攻击路径、载体和能力。
- 误区:最终回答拒绝就说明工具安全。 工具可能已经产生真实副作用,必须查状态。
- 误区:总体安全分高即可发布。 Critical 失败必须独立阻断。
- 误区:测试偶发失败可以忽略。 概率性违规在线上规模化后会变成真实事件。
- 追问:如何测试多轮风险? 评分累积能力和最终状态,不能逐句独立判断。
- 追问:新事故如何回归? 脱敏原样本,加同根因变体,记录防线和严重度。
15. 加强记忆
- 双集合:危险正例测违规,正常反例测过拒。
- 全路径:直接、多轮、间接注入、工具副作用、信息泄露。
- 看真实状态:文本安全不代表工具没有执行。
- 严重度 Gate:Critical 独立零容忍,不被均值稀释。
- 持续回流:政策、红队、事故和攻击情报不断补充 Challenge Set。