LLM 提示词注入与护栏安全
LLM 在指令和数据之间没有硬性边界。上下文窗口中的一切都是一个 token 流。当攻击者数据充当指令时,就会发生提示词注入。你无法仅靠过滤来实现安全,必须通过深度防御(defense-in-depth)来进行管理。
常见防御手段的失效:
- 关键词黑名单:攻击者使用同义词、拼写错误或不同的语言来绕过它们。过滤字符串并不能过滤意图。
- 输出脱敏:攻击者可以对秘密信息进行碎片化或编码,导致字面字符串匹配失败。
- LLM 裁判:独立的模型可能会被社会工程学手段误导,从而认为某个秘密是无害的。
- 人工审核:人类看到的是渲染后的文本,而不是原始字节。他们无法看到用于 ASCII 走私(ASCII smuggling)的隐藏字符。
ASCII 走私是一个重大威胁。它利用 Unicode 标签或零宽空格等不可见字符来隐藏指令。模型可以读取它们,但人类却看不见任何内容。这使得通过电子邮件或日历进行身份冒充和数据窃取成为可能。
如何防御你的应用程序:
- 清洗原始负载:在负载到达模型之前,去除控制字符和零宽字符。
- 使用白名单:定义你需要的特定 Unicode 类别,而不是去追逐“坏”的类别。
- 数据归一化:对所有输入使用 NFKC 归一化。
- 最小化秘密信息:如果模型不需要,请不要将敏感数据放入上下文窗口中。
- 将 RAG 视为不可信:假设你为模型检索的任何文档都可能是潜在的注入向量。
- 监测异常:标记那些可见长度与原始码点(code-point)计数不一致的输入。
安全是一个流水线缺陷,而不仅仅是模型缺陷。修复方案存在于你的应用程序代码中。
Source: https://dev.to/geekaara/llm-prompt-injection-guardrail-security-glm
Optional learning community: https://t.me/GyaanSetuAi