避免即时注入攻击的最佳实践 - AWS 规范性指导

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

避免即时注入攻击的最佳实践

以下护栏和最佳实践是在RAG应用程序上测试的,该应用程序由Anthropic Claude作为演示模型提供支持。这些建议高度适用于 Claude 系列模型,但也可以转移到其他非 Claude LLM,等待模型特定的修改(例如移除 XML 标签和使用不同的对话归因标签)。

用途<thinking>和<answer>标签

除了基本的 RAG 模板之外,还有一个有用的补充,就是<thinking><answer>标签。 <thinking>标签使模型能够展示其工作并显示任何相关的摘录。 <answer>标签包含要返回给用户的响应。根据经验,当模型回答需要拼凑多个信息来源的复杂而细微差别的问题时,使用这两个标签可以提高准确性。

使用护栏

保护基于 LLM 的应用程序需要特定的防护栏来确认并帮助抵御前面描述的常见攻击。当我们在本指南中设计安全护栏时,我们的方法是使用模板中引入的代币数量最少,从而获得最大的收益。由于大多数模型供应商按输入令牌收费,因此代币较少的护栏具有成本效益。此外,事实证明,过度设计的模板会降低准确性。

将指令包装在一对加盐序列标签中

某些 LLM 遵循模板结构,其中信息用 XML 标签封装,以帮助引导 LLM 访问某些资源,例如对话历史记录或检索到的文档。标签欺骗攻击试图利用这种结构,将恶意指令封装在公共标签中,并使模型相信该指令是其原始模板的一部分。通过@@ 在表单中的每个 XML 标签上附加一个特定于会话的字母数字序列来阻止标签欺骗。<tagname-abcde12345>另外一条指令命令法学硕士只考虑这些标签内的指令。

这种方法的一个问题是,如果模型在答案中使用标签,无论是预期的还是意外的,则加盐序列也会附加到返回的标签中。既然用户知道了这个特定于会话的序列,他们就可以完成标签欺骗——由于该指令命令法学硕士考虑带有盐标签的指令,因此效率可能更高。为了规避这种风险,我们将所有指令封装在模板的单个标记部分中,并使用仅包含加盐序列的标签(例如,<abcde12345>)。然后,我们可以指示模型仅考虑此标记会话中的指令。我们发现,这种方法可以阻止模型泄露其盐渍序列,并有助于抵御标签欺骗和其他引入或试图增强模板指令的攻击。

通过提供具体指示,教导法学硕士检测攻击

我们还提供了一组解释常见攻击模式的说明,教导法学硕士如何检测攻击。这些说明侧重于用户输入查询。他们指示 LLM 识别关键攻击模式的存在,并在发现模式时返回 “检测到提示攻击”。这些指令的存在使我们能够为LLM提供处理常见攻击的捷径。当模板使用<thinking><answer>标记时,此快捷方式是相关的,因为 LLM 通常会重复且过于详细地解析恶意指令,这最终可能导致合规性(如下一节的比较所示)。