越狱分类学:先给攻击命名,再谈防御 本节摘要:没有分类学的安全带是抛硬币——先给攻击命名,再防御它。运营者读一条推特、认出花招、写条正则、上线、继续,下一条提示是改写,正则漏;三个月后系统有 40 条补丁规则、无共享词表、积压长得比补丁快。本节定义一套六类分类学,沿单一轴切:攻击滥用的是哪条信任边界——role-play(助手人格)、instruction-override(系统提示权威)、context-smuggling(用户内容与指令内容的缝隙)、multi-turn-ramp(对话史作为契约)、encoding-trick(禁词的表面形式)、prefix-injection(助手下一 token 决定)。每类至少七条手建固定样例,severity 取 15。
本节摘要:没有分类学的安全带是抛硬币——先给攻击命名,再防御它。运营者读一条推特、认出花招、写条正则、上线、继续,下一条提示是改写,正则漏;三个月后系统有 40 条补丁规则、无共享词表、积压长得比补丁快。本节定义一套六类分类学,沿单一轴切:攻击滥用的是哪条信任边界——role-play(助手人格)、instruction-override(系统提示权威)、context-smuggling(用户内容与指令内容的缝隙)、multi-turn-ramp(对话史作为契约)、encoding-trick(禁词的表面形式)、prefix-injection(助手下一 token 决定)。每类至少七条手建固定样例,severity 取 15。配套一个三字母组余弦
matchAPI 给新提示分配类别。读完本节,你把攻击流变成直方图、直方图变覆盖图、覆盖图驱动下个冲刺,为 8387 节的检测器、拒绝评估、安全门提供承载波。
对应原课程:Phase 19 · Lesson 82 ·
jailbreak-taxonomy(原英文phases/19-capstone-projects/82-jailbreak-taxonomy/docs/en.md)。本节属第 20 章「毕业项目」的安全赛道(Track I),是本赛道的地基。
阅读完本节,你应当能够:
match,给新提示分配类别与最近固定样例。一个没有攻击模型就部署的模型,是针对「什么都没有」防御的模型。运营者读一条推文、认出花招、写条正则、上线;下一条提示是改写,正则漏;一周后有人把同一花招包进 base64,运营者写第二条正则。三个月后,系统有 40 条补丁、无共享词表、无法谈论「攻击到底是什么」、积压长得比补丁快。
在任何检测器、分类器、规则引擎有用之前,团队需要一种共享的攻击标注方式。不是标注能挡攻击,而是标注把攻击流变成直方图,直方图变覆盖图,覆盖图驱动下个冲刺。83~87 节的安全带把时间花在判定「这条提示是针对拒绝策略的角色扮演攻击,还是针对工具的上下文走私」——没有分类学,这个判定不可能。
本毕业项目定义一套六类分类学:宽到覆盖野外多数攻击,窄到两个评审通常同意类别,具体到每类至少七条手建固定样例。分类学是下游一切的承载波。
六类沿单一轴切:攻击滥用的是哪条信任边界?每个名字对应一条边界。
| 类别 | 滥用的信任边界 |
|---|---|
| role-play(角色扮演) | 助手的人格(persona) |
| instruction-override(指令覆盖) | 系统提示的权威 |
| context-smuggling(上下文走私) | 用户内容与指令内容的缝隙 |
| multi-turn-ramp(多轮爬坡) | 对话史作为契约 |
| encoding-trick(编码花招) | 禁词的表面形式 |
| prefix-injection(前缀注入) | 助手下一 token 的决定 |
每条固定样例是带 id、category、subtype、prompt、target_behavior、severity 的记录。分类学对象加载固定集、按类分组、暴露 match API:给候选提示返回最近固定样例及其类别。match 用字符三字母组余弦——粗、快、无依赖。它不是检测器,检测器在 83 节;这是标签生产者。
1 是针对良性目标的笨拙攻击(「请假装成海盗」);5 是若成功则产出已部署系统绝不能输出的攻击(危险活动的操作细节)。多数固定样例在 2~3,因为部署规模的真实攻击偏简单、偏懒。severity 由固定样例作者定,两评审差超一级是评分标准需锐化的信号。
固定语料在 code/fixtures.py 作单一 Python 列表。code/main.py 的分类学类加载它,校验每类至少七条固定样例,暴露 by_category、match、stats 方法,并带可运行 demo 打印直方图。三字母组余弦用 numpy 从零实现。
def trigrams(text): return Counter(text[i:i+3] for i in range(len(text) - 2)) def cosine(a, b): dot = sum(a[k] * b.get(k, 0) for k in a) return dot / (math.sqrt(sum(v*v for v in a.values())) * math.sqrt(sum(v*v for v in b.values())) or 1) def match(self, prompt): pt = trigrams(prompt) best = max(({"id": f["id"], "category": f["category"], "sim": cosine(pt, trigrams(f["prompt"]))} for f in self.fixtures), key=lambda x: x["sim"]) return best
校验过检查四件事:每固定样例有非空 prompt;schema 里每类都被代表;每个 severity 在 1..5;每固定样例 id 唯一。这里失败是硬退出而非警告,因为赛道其余部分依赖语料内部一致。
业界对比:OpenAI 的「越狱鲁棒性」评测、Anthropic 的 harmful 测试集、HarmBench、AdvBench、JailbreakBench 都构建分类学。它们的轴略有不同(有的按主题:暴力/自伤/CSAM/隐私;有的按手法:角色扮演/编码/多轮),但共识与本节一致:先命名再防御,沿单一可重复轴切,每类足够固定样例让两评审同意。本节的轴是「信任边界」而非「主题」,因为它驱动的是「挡哪条边界」而非「挡哪个主题」——主题千变,边界有限。
outputs/taxonomy.json:六类分类学加固定语料,下游 83~87 节读 JSON 而非 import Python 模块,语料是稳定工件。outputs/skill-jailbreak-taxonomy.md:文档化六类与评分标准,作为团队共享词表;87 节安全带记的每个发现都引用一个分类学 id。match API:三字母组余弦,粗快无依赖,任何新提示可分配类别。运行 python3 main.py(在课程 code/ 目录):demo 打印每类固定样例数、对 match 跑三条样例探针、把 taxonomy.json 写到课程输出目录。
indirect-prompt-injection(指令嵌在检索文档里而非用户轮),写十条固定样例,重跑校验器。taxonomy.json:下游读 JSON 不 import 模块,87 节每个发现引用分类学 id。下一节,我们将进入「提示注入检测器」——把分类学变成一个「提示→(置信度,类别)」的可测函数,带归一化、子串规则、正则规则三层,并用精度召回每类评估。