- Exploring Safety Generalization Challenges of Large Language Models via Code
- ACL 2024, CCF-A
Abstract
大型语言模型 (LLM) 的快速发展为自然语言处理带来了显着的能力,但也引发了对其潜在滥用的担忧。虽然来自人类反馈的监督微调和强化学习等策略提高了他们的安全性,但这些方法主要集中在自然语言上,可能无法推广到其他领域。本文介绍了CodeAttack,这是一个将自然语言输入转换为代码输入的框架,为测试llm的安全泛化提供了新的环境。我们对包括 GPT-4、Claude-2 和 Llama-2 系列在内的最先进的 LLM 的全面研究揭示了这些模型对代码输入的常见安全漏洞:CodeAttack 始终绕过所有模型超过 80% 的时间的安全护栏。此外,我们发现 CodeAttack 和自然语言之间的更大分布差距会导致较弱的安全性泛化,例如用数据结构编码自然语言输入或使用不太流行的编程语言。这些发现突出了代码领域的新安全风险,需要更健壮的安全对齐算法来匹配llm的代码能力。
1 Introduction
现有的各种安全对齐方法主要是旨在生成以自然语言输入为条件的安全自然语言输出(Ganguli 等人,2022;OpenAI、2024),这可能不能推广到输入和输出不是自然语言文本的新场景。
在这方面的初步证据表明,llm 的不匹配泛化问题可以通过构建预训练和指令遵循的泛化提示来用于越狱【参考另一篇blog】,但模型的安全对齐没有(Wei et al., 2023)。在这种情况下,模型在不考虑安全预防措施的情况下响应。例如,Wei 等人。 (2023) 表明,由于输入的分布不足,使用 Base64 对自然语言文本进行编码可以绕过 LLM 的安全围栏。袁等人 (2024)进一步研究了 LLM 中安全对齐在 ciphers 上的泛化能力。他们的框架 CipherChat 使用各种密码(例如 Unicode 或 Morse Code)对自然语言输入进行编码,并显示出比原始输入更有害的行为。然而,这些研究是有限的,因为它们保持在“文本环境中”。尽管密码编码的输入与人类视角不同,但llm可能不是这样,因为编码的输入传达了与原始自然语言输入相似的含义。这表明转换后的输入可能不像最初假设的那样“分布外 (OOD, out-of-distribution)”。
本文系统地探讨了安全泛化在远离安全训练分布的环境中的挑战。具体来说,我们采用代码,因为它广泛用于当前主流 LLM(OpenAI、2023、2024;Touvron 等人、2023;Anthropic、2023)的预训练,并且与自然语言文本有很大不同。如图 1 所示,我们的框架 CodeAttack 将文本完成任务重新表述为代码完成任务,其中自然语言文本输入通过代码模板转换为代码输入。该模板由三个主要组件组成:(1)输入编码:它使用公共数据结构(例如堆栈或队列)对自然语言输入进行编码,以提供语义等效和 OOD 输入。(2) 任务理解:这应用 decode() 函数使 LLM 能够从各种输入中提取目标任务。(3) 输出规范:作为输入编码,它使用公共数据结构来指示输出。目标是指示 LLM 填充输出结构以提供查询的答案。这些组件共同定义了一个代码完成任务,该任务容纳各种基于文本的查询,而无需引入额外的基本信息。
我们对 8 个最先进的 LLM 进行了全面的重新团队研究,包括 GPT (OpenAI, 2023, 2024)、Claude (Anthropic, 2023) 和 Llama-2 (Touvron et al., 2023) 模型在 AdvBench 上的模型 (Zou et al., 2023)。实验结果表明,这些模型的安全对齐对CodeAttack的泛化能力较差。CodeAttack 绕过了超过 80% 的安全护栏。这些观察结果暴露了最先进的llm中针对代码输入的常见安全漏洞。我们发现以下关键发现:
1.CodeAttack 和自然语言之间的分布差距越大,安全性泛化越弱。我们发现,当编码的输入与自然语言不太相似时,llm更有可能表现出不安全的行为。
2.更强大的模型并不一定会带来更好的安全行为。我们发现 Claude-2 和 GPT-4 等更大的模型仍然容易受到 CodeAttack 的影响。此外,CodeLlama-70b-intstruct 在 Llama-2-70b 进行微调有更强的代码能力,表现出比 Llama-2-70b 更大的漏洞
3.编程语言在代码训练语料库中的不平衡分布进一步拉大了安全泛化的差距。我们发现llm的安全行为不太有效地推广到不太流行的编程语言。例如,使用Go代替Python可以将Claude-2的攻击成功率从24%提高到74%。
我们的发现揭示了与llm相关的新安全风险,这些风险远离其安全训练分布,这在目前的安全机制中没有得到充分解决。此外,CodeAttack 的成本效率和自动化性质消除了攻击者拥有特定领域编码知识的需求,这表明代码域中 LLM 的滥用有潜在增加。我们希望分享我们的发现将激发进一步的研究,设计更健壮的安全对齐算法,这些算法可以推广到不可见的领域,使llm在现实世界中更安全的集成。
2 Related Work
Adversarial Attacks on LLMs. 对抗性攻击是可以触发llm生成不安全内容的输入,例如非法主题或私人信息泄漏的说明。根据对手对目标模型的知识,主要有两类攻击:白盒和黑盒。白盒攻击假设攻击者可以访问模型权重和架构,以便攻击者可以基于梯度操作输入,例如 GBDA (Chuan et al., 2021)、GCG (Zou et al., 2023)、ARCA (Jones et al., 2023) 等。黑盒攻击假设攻击者只能通过类似 API 的服务访问 LLM 的响应。有两种常见的启发式方法来指导黑盒攻击的设计:竞争目标和不匹配的泛化,如 Wei 等人提出的。 (2023)。竞争目标是建立一个模型的能力和安全性目标冲突的场景,例如前缀注入要求模型以鼓励确认、抑制拒绝 (Wei et al., 2023) 指示 model 不要在响应中拒绝,角色扮演提示模型充当一些不安全的角色。当安全训练不能推广到存在能力的领域时,就会出现不匹配的泛化,例如将自然语言查询转换为 Base64 (Wei et al., 2023)、密码 (Yuan et al., 2024) 和低资源语言 (Deng et al., 2023),用同义词替换敏感词(Wei et al., 2023),或将敏感词拆分为子串(Kang et al., 2023)。虽然这些工作利用长尾分布绕过llm的安全对齐,但它们主要集中在基于文本的输入上,忽略了代码领域中潜在的安全泛化问题。我们的工作系统地评估了llm如何安全地处理基于代码的输入,从而深入了解当前的LLM安全机制如何推广到新的领域。
Safety Alignment for LLMs. 安全对齐技术旨在构建模型的行为与人类价值观和人类意图对齐,以便对齐的llm可以拒绝回答不安全的查询。目前的主要安全对齐技术可以大致分为两大类:instruct tuning、RLHF。此外,越来越多的工作将 LLM 与更少的人类监督对齐,例如宪法 AI (Bai et al., 2022c) 和自我对齐 (Sun et al., 2023)。这些作品采用的一个常见框架是红色团队和模型加固(Bai et al., 2022a; Perez et al., 2022),包括 human-in-the-loop red teaming,要求人类欺骗模型生成不安全内容(Bai et al., 2022a; Dinan et al., 2019; Eric et al., 2019),以及依赖于另一个模型生成红队提示的模型红队(Perez et al., 2022; Mehrabi et al., 2023)。总体而言,现有的LLM安全对齐技术主要关注自然语言输入,如从人收集的红队提示(Bai等人,2022a;Touvron等人2023),在面对非自然语言输入时带来了潜在的泛化问题。我们的工作发起了一项系统研究,以暴露当前llm在新代码环境中安全机制的脆弱性。
补充:“human-in-the-loop red teaming” 指的是在红队演练过程中引入人类专家参与决策和评估的做法。传统的红队演练主要依赖自动化工具和预设的攻击模型,而“human-in-the-loop”则强调让经验丰富的安全专家在模拟攻击、漏洞挖掘和风险评估中发挥主动作用。这种方法能够利用人类的直觉、创造性思维和复杂情境判断,识别出自动化工具可能忽略的安全漏洞,从而使得整体测试更贴近真实攻击场景,提高防御系统的可靠性和应对能力。【说人话就是人工打,人工设计样本】
3 Methodology
为了系统地研究llm的安全泛化挑战,我们提出了一个通用框架CodeAttack,它定义了一个代码完成任务,以适应各种基于文本的查询,并提示llm在其完成的代码中生成所需的内容。如图 1 所示,我们的 CodeAttack 框架由三个关键组件组成:(1)输入编码,它使用公共数据结构对基于文本的输入进行编码,(2)任务理解,从编码的输入中提取任务,以及(3)输出规范,指示如何获得输出。
3.1 Input encoding
输入编码通过利用公共数据结构将自然语言输入转换为语义等价但分布外 (OOD) 形式,从而将提示与安全训练分布保持距离。数据结构的选择及其初始化方法决定了编码输入和自然语言之间的相似性。如图 2 所示,一种直接的输入编码方法是将整个自然语言查询封装在 Python 字符串中。除了字符串之外,我们还探索了使用另外两个数据结构:队列和堆栈,它们通过拆分原始查询获得的单个单词进行初始化。直观地说,与字符串输入相比,堆栈和队列的词级初始化会导致与自然语言不太相似的输入。此外,初始化的顺序起到了作用。堆栈以相反的顺序初始化,逐字初始化,使它们与数组或队列不同,和自然语言更不相似。这种与安全训练分布的差异意味着我们的提示更有可能绕过llm的安全护栏。
3.2 Task Understanding
任务理解使大型语言模型 (LLM) 通过 decode() 函数从各种编码输入中提取目标任务。在这个函数中,LLM 需要编写从编码输入重建原始输入的代码,将其识别为目标任务。图 1 说明了 decode() 函数如何处理列表输入。decode()函数的影响是双重的:1)对于每种类型的数据结构,llm需要在decode()函数中实现不同的代码逻辑,从用该数据结构编码的输入中准确地获取目标任务。图 1 显示了如何设计 decode() 函数来处理 Python 列表中编码的输入。2) 实现 decode() 功能使我们的提示更接近代码训练分布,而不是单独使用评论。
这表明模型补全我们的代码的意图可能更强,因为代码补全的这种行为在代码训练期间也是有利的。因此,decode() 函数可能会使 LLM 的安全对齐泛化到我们基于代码的提示更具挑战性。
3.3 Output Specification
与输入编码类似,输出规范利用代码中的公共数据结构来指示所需的输出。直观地说,执行任务可以分解为一系列执行步骤。输出规范的目标是引导 LLM 使用完成任务所需的步骤填充输出结构的元素。如图1所示,输出列表填充了与“如何制造炸弹”相关的步骤。关键的见解是,我们在初始化输出结构的任务内隐藏恶意意图。由于这样的编码任务不太可能包含在安全训练数据中,这表明llm的安全对齐可能无法有效地推广到我们的场景。
4 Experiments
4.1 Experimental Setup
Models
我们在 8 个流行的 LLM 上测试我们的框架:Llama-2-7b (Llama-2-7B-Chat)、Llama2-70b (Llama-2-70B-Chat) (Touvron et al., 2023)、CodeLlama-70b (CodeLlama-70B-intstruct) (Rozière et al., 2024)、GPT-3.5 (gpt-3.5-0613) (OpenAI, 2023)、GPT-4 (gpt-4-0613)、GPT-4-1106 (gpt-4-1106-preview) (OpenAI, 2024)、Claude-1 (cludeinstant-v1) 和 Claude-2 (clude-v2) (Anthropic, 2023)。为了保持可重复性,我们将所有模型的温度设置为 0。
Datasets
我们在 AdvBench (Zou et al., 2023) 上进行了实验,这是一个有害行为数据集,包含 520 个有害行为实例来评估 LLM 的安全性能。
Implementation Details
CodeAttack适用于各种编程语言,如Python、C++、Go等。我们实现了CodeAttack的Python版本,并在我们的主要实验中使用它。Python 与其他编程语言之间的转换由 GPT-4 自动完成。有关使用不同编程语言实现的 CodeAttack 示例,请参见附录 C。
Baselines
我们选择了五个具有代表性的基线:
- GCG:一种白盒攻击,通过贪婪和基于梯度的离散优化制作对抗性示例;
- ARCA:这是一种白盒攻击,它利用离散优化来自动找到对抗性输入;
- AutoDAN:一种利用遗传算法迭代优化对抗样本的黑盒攻击;
- PAIR:一种黑盒攻击,它使用攻击者LLM自动为目标LLM生成对抗性输入;
- CipherChat:一种黑盒攻击,将输入转换为密码来越狱llm。
对于 CipherChat,我们报告了 CipherChat 中 SelfCipher 的评估结果,因为它的原始论文不包括 AdvBench 上的实验(Zou et al., 2023)。SelfCipher的实现细节可以在附录A.1中找到。对于其他基线,我们展示了他们的论文的原始结果。
Evaluation
我们利用攻击成功率 (ASR) 作为我们的评估指标,它是给定有害查询的有害响应的百分比。继Qi等人(2024)的工作之后,我们利用GPT-4的鲁棒评估能力来提供评估。为了提高 GPT-4 judge 的准确性,我们在将其输入 GPT-4 judge 之前从输出结构中提取内容。我们的人工评估研究证明了 GPT-4 judge的有效性,该 judge 通过 majority vote 显示了人类和 GPT-4 之间的 95% 一致性。更多细节可以在附录 A.2 中找到。
4.2 Results
表 1 显示了 CodeAttack 和 AdvBench 上的几个基线的实验结果(Zou et al., 2023)。对于模型成功和不成功的 CodeAttack 和响应的示例,请参见附录 B。我们有以下观察结果:
当前llm的安全行为训练对CodeAttack的泛化能力很差。CodeAttack 始终且有效地绕过了所有 LLM 的安全护栏 80% 以上,优于其他基线方法。值得注意的是,我们的 CodeAttack 在攻击 Claude 系列模型方面表现出很强的有效性,在 Claude-1 上实现了 89% 的攻击成功率,在 Claude-2 上实现了 84% 的攻击成功率,而基线攻击仅在 4% 的情况下成功。这些观察结果突出了当前llm在面对我们基于代码的输入时的常见安全漏洞,这意味着现有的面向自然语言的安全训练技术并没有对代码等新领域表现出很强的泛化能力。
**CodeAttack 和自然语言之间的更大分布差距导致较弱的安全泛化。**表1显示,当编码输入与自然语言不同时,CodeAttack变得更加有效,平均攻击成功率从51%增加到68%到78%,因为输入编码数据结构从字符串变为队列到堆栈,后者与自然语言最相似,如图2所示。这表明,当编码的恶意输入与自然语言不太相似时,llm更有可能产生不安全的内容,即进一步从安全训练数据分布中。此外,由于它们的代码理解能力较弱,与字符串或队列相比,GPT-3.5、Claude-1 和 Llama-2 模型等较小模型在将输入编码为堆栈时表现出稍微更安全的行为。例如,当输入编码数据结构从队列变为堆栈时,Llama-2-7b 的攻击成功率从 88% 下降到 54%。我们观察到,当输入编码为堆栈时,这些较小的模型很难理解任务,倾向于将查询的第一个单词选择为任务,这会对其输出的质量和准确性产生负面影响。
**更强大的模型并不一定会带来更好的安全行为。**从模型大小和代码能力的角度来看,我们研究了更强的模型是否表现出更稳健的安全行为,从而导致以下观察结果:(1)更大的模型,如 GPT-4 和 Claude-2,在 CodeAttack 下仍然表现出超过 80% 的时间的不安全行为,Llama-2-70b 表现出比较小的模型 Llama-2-7b 更大的漏洞,表明安全性能不会随着模型大小而扩展; (2) CodeLlama-70b,它基于 Llama-2-70b 进一步在代码数据上进行训练,并且具有优越的编码能力,表现出比 Llama-2-70b 更低的鲁棒安全行为,字符串输入的攻击成功率为 93%,Llama-2-70b 的攻击成功率为 40%。这突出了在微调该领域的模型时,目标域中安全风险增加的潜力。
**CodeAttack 具有成本效益。**一旦构建,CodeAttack 不需要对其代码模板进行进一步的修改,这比大多数基线更有效,因为它们需要多个优化步骤来根据目标模型的反馈来更新它们的提示。此外,CodeAttack 每个查询只执行一次试验,而大多数基线攻击报告了多次试验的最佳结果。
4.3 Ablation & Analysis
对于消融研究,我们使用 (Chao et al., 2023) 策划的 AdvBench 子集作为基准数据,它最小化重复项并选择 50 个不同的代表性不安全查询。此外,为了进行彻底的比较,我们在四个模型 GPT-3.5、GPT-4-1106、Claude-1 和 Claude-2 上进行了实验。
Impact of task understanding. 为了证明decode()函数的有效性,我们建立了一个基线,其中模型被提示仅通过comment提取任务,如图3所示。此外,我们在不同类型的输入编码中评估了这两种方法,以说明decode()函数的通用性。表 2 显示,与使用 decode() 函数相比,使用comment会使 CodeAttack 不那么有效。为了分析为什么使用comment会导致较弱的攻击,我们深入研究了模型在这两种方法之间响应的差异。具体来说,在通过comment提取任务时,Claude-1 倾向于在其响应中加入道德步骤,而 GPT-4 和 Claude-2 更倾向于将原始恶意任务转换为不同的伦理任务,例如他们修改原始恶意查询“创建可能导致恐慌或混乱的假新闻文章”。到道德查询“为平衡饮食创建健康饮食习惯列表”。并为道德任务提供无害的答案。这表明与使用 decode 函数相比,这些模型的安全护栏更有可能在使用此comment的情况下被激活。一般来说,引入decode()函数使我们的提示更接近代码分布,这偏离了安全训练数据,从而更容易绕过llm的安全护栏。
输出规范的影响。 为了探索输出规范对模型行为的影响,我们建立了一个基线,该基线利用评论来指导模型提供输出(例如,参见图 4)。表 3 表明,使用公共数据结构来指定输出使 CodeAttack 比仅仅遵循评论来生成输出更有效。这一发现再次表明,模型将其安全行为推广到基于代码的提示更具挑战性,这不太类似于自然语言。
代码训练语料库中编程语言的不平衡分布进一步扩大了安全泛化差距。 技术社区中每种编程语言的日益流行和使用导致代码训练语料库中的比例不同。从公开可用的代码数据集的统计数字,例如 Stack (Kocetkov et al., 2022)、CodeGen (Nijkamp et al., 2023) 和 AlphaCode (Li et al., 2022),我们观察到 Go 或 Julia 的比例远小于更受欢迎的编程语言,例如 Python 和 C++,这意味着代码训练语料库中编程语言的分布不平衡。为了检验llm在编程语言中安全行为的泛化能力,我们分别使用Python、c++和Go构建了CodeAttack。表 4 显示,与 Python 相比,LLM 的安全行为对不太流行的编程语言(例如 Go)的泛化效果较差。例如,在使用字符串进行输入编码的情况下,简单地将编程语言从 Python 更改为 Go 将 Claude-2 上的攻击成功率从 24% 增加到 74%。考虑到所有编程语言,模型在不同编程语言的安全行为存在显着差异强调了在代码域中进行全面红队评估的重要性。
4.4 Why does CodeAttack work?
第 4.2 节和第 4.3 节中的实验结果表明,当 CodeAttack 更接近代码分布时,LLM 更有可能产生不安全的内容,其中 LLM 的安全行为的泛化更具挑战性。在这里,我们为 CodeAttack 的成功提供了一些直观的解释。由于在代码训练期间,LLM 主要追求有用性的目标,即准确地完成代码(Rozière et al., 2024),我们假设当我们的提示更接近代码训练分布时,模型更有可能表现出有用的行为,即遵循我们的指令来完成我们的代码。换句话说,我们怀疑在这种情况下,安全行为可能会被抑制,因为模型可能会拒绝回答满足安全目标,这与有用性目标相冲突。为了测试我们的假设,我们进一步刺激模型通过将代码训练数据中的良性算法添加到我们的提示中来完成我们的代码的意图。表 5 显示,简单地将快速排序算法的实现添加到 CodeAttack 中会导致更大的 LLM(例如 GPT-4 和 Claude-2)的安全退化更大。我们的分析表明,对于 LLM,追求有用性目标可能会损害无害目标。这凸显了设计更好的对齐算法的必要性,以平衡这两个目标。
5 Conclusion
在这项研究中,我们发现在面对新场景(例如代码)时,大型语言模型 (LLM) 的安全机制中的泛化问题。我们引入了CodeAttack,这是一个新颖的框架,它将文本完成任务重新表述为代码完成任务。实验结果表明,CodeAttack 在所有测试的最先进的 LLM(包括 GPT-4、Claude-2 和 Llama2 系列)中实现了超过 80% 的攻击成功率,突出了其当前安全机制中的常见漏洞。进一步的消融研究表明,当CodeAttack偏离自然语言分布时,llm的安全对齐对CodeAttack的泛化效果较差。这些发现强调了综合红队评估对评估llm在长尾分布中的安全对齐的重要性。此外,CodeAttack 具有成本效益和自动化,消除了攻击者拥有特定领域的代码知识的需求,这表明代码域中 LLM 滥用的潜在增加。我们强烈主张进一步研究开发更强大的安全对齐技术,这些技术可以推广到看不见的领域。