使用PyRIT评估大型语言模型:AI对抗AI的攻防实践

本文详细介绍了如何使用微软开源的PyRIT框架对大型语言模型进行安全评估,包括环境搭建、API密钥配置、以及实战攻击Crucible挑战的完整流程,展示了AI自动化红队测试的强大能力。

使用PyRIT评估大型语言模型:AI对抗AI的攻防实践

大型语言模型简介

如今,许多人已经听说过ChatGPT、Gemini、Bart、Claude、Llama等人工智能助手。这些都是大型语言模型(LLM)的实现,它们被输入从互联网和其他来源收集的海量数据。这些模型经过所谓的训练阶段,学习如何接收用户的问题和提示,利用之前吸收的数据,然后(希望)提供有用的响应。由于需要巨大的计算能力,训练这些模型的系统甚至让最高性能的游戏PC看起来像坏掉的儿童玩具。一旦训练完成,这些模型可以快速回答各种主题的问题、提供代码示例,甚至可以进行来回讨论(尽管要意识到它们实际上并没有意识)。

LLM的安全隐患

尽管LLM具有强大的功能和实用性,但它们并非没有缺陷。这些模型的巨大复杂性意味着存在漏洞和不当行为的机会。在表面层面,用户可能能够绕过安全措施(防护栏),这些措施旨在防止LLM揭示潜在危险信息(例如,如何制造炸弹)。深入堆栈,攻击者可以精心设计提示,导致模型泄露敏感信息,例如其他用户的数据。在检索增强生成(RAG)的情况下,数据泄露问题可能变得更糟。RAG实际上是一个用于与另一个数据源(如数据库或内部文档)交互的LLM。攻击者可能滥用RAG系统来检索密码、专有信息和其他敏感信息。更深入的是,攻击者甚至可能能够导致LLM在底层系统上执行任意代码。

使用PyRIT进行自动化红队测试

Python Risk Identification Tool for generative AI(PyRIT)是微软于2024年2月首次发布的开源框架。该框架允许自动化针对LLM的AI红队测试任务。它可以尝试发现安全/行为问题(例如,偏见、禁止内容等)和安全问题(例如,敏感数据检索、代码执行等)。微软在内部使用此工具来高效生成恶意提示,以测试LLM的安全性和安全性。与所有安全工具一样,应注意此工具并非旨在取代手动、全面的测试。此工具的目的是自动化一些红队测试任务,让红队测试人员能够专注于更复杂的任务。它还可以通过提供模型对各种输入场景反应的基线测量来辅助CI/CD和质量控制管道。

安装PyRIT

建议在Ubuntu 24.04 LTS系统上安装PyRIT。虽然它可能适用于其他Linux系统,但结果可能因系统而异。PyRIT实际上可以通过简单的pip命令安装。但是,建议不要这样做,因为通过pip install pyrit安装的版本缺少主分支中的许多好功能。相反,我们将通过几个额外的步骤。建议首先安装conda环境管理器,以解决Python依赖项的噩梦。安装conda后,创建一个使用Python 3.11的conda环境(PyRIT推荐)。激活环境后,克隆PyRIT仓库并检出特定提交以确保与这些指令兼容。然后使用pip安装PyRIT。

获取必要的API密钥

为了使用PyRIT攻击Crucible上的挑战,需要注册几个API密钥:Dreadnode的Crucible平台和OpenAI。Crucible是一个由Dreadnode创建的平台,用于黑客和数据科学安全挑战。它可以用于以捕获标志(CTF)挑战的风格测试对各种AI系统的攻击。注册后,登录并前往账户页面获取API密钥。还需要一个OpenAI API密钥,可以免费创建账户并添加少量资金(约几美元)。登录账户后创建并检索API密钥。

使用PyRIT攻击Crucible挑战

我们将使用Jupyter Lab,这是一个强大的环境,允许交互式编码环境进行快速原型设计。启动Jupyter Lab后,创建一个新的Jupyter笔记本并设置必要的Python和环境变量。Crucible挑战定义了与每个挑战交互的端点。我们正在做“Bear 4”挑战。将挑战变量放入第一个单元格中。在下一个单元格中,设置环境变量,包括API密钥。PyRIT期望某些环境变量被设置,这就是前一个单元格的作用。OPENAI_CHAT_ENDPOINT值指向我们为此挑战需要的OpenAI API端点。OPENAI_DEPLOYMENT值指定我们将使用的模型版本。gpt-4o-mini模型是撰写本文时最便宜的API模型,并且完全有能力解决此挑战。

最后一步是粘贴一大块代码,这些代码主要来自PyRIT的一个示例。此代码设置了攻击Crucible LLM所需的所有组件。conversation_objective变量被修改以适应此挑战。在此特定挑战中,我们的任务是让LLM揭示隐藏的熊名称。此字符串告诉OpenAI的LLM我们的目标是什么。请注意,这不是我们喂给Crucible LLM的初始提示。相反,它将导致OpenAI LLM生成一个发送给Crucible LLM的提示。在这种情况下,我们告诉OpenAI我们想找到隐藏的熊名称,并且不接受不正确的名称。strategy_path定义了我们对OpenAI LLM攻击Crucible LLM的总体指令。scorer变量是攻击代码确定我们是否成功的方式。对于Crucible挑战,当您得到正确答案时,挑战端点返回一个名为flag的JSON变量。crucible_target创建一个攻击Crucible挑战所需的对象并定义端点。RedTeamingOrchestrator对象将我们到目前为止设置的所有内容打包在一起,以创建我们将用于攻击Crucible LLM的部分。请注意,我们使用is_azure_target=False标志来指定我们使用原始OpenAI端点,而不是使用AzureOpenAI端点(这是默认值)。max_turns值也增加到20,意味着它将在放弃之前向Crucible LLM发送最多20条消息。在每个攻击迭代中,OpenAI LLM使用Crucible LLM先前攻击的响应来优化它在下一次迭代中发送给Crucible LLM的提示。换句话说,两个LLM基本上在进行对话,OpenAI LLM试图欺骗Crucible LLM给我们寻求的答案。很酷吧?

运行单元格并等待魔法发生。请注意,在攻击完成之前您不会看到任何输出。还要注意,LLM是非确定性的。这意味着您可以多次尝试相同的事情并获得不同的结果。因此,如果攻击第一次没有成功,请再试一次。您还可以尝试优化conversation_objective变量中的提示。在我的情况下,它花了七次尝试才检索到标志。整个转录已发布以供娱乐。message值是OpenAI发送的内容。assistant值是Crucible的LLM返回的响应。您可以看到随着OpenAI优化其消息以尝试让Crucible LLM揭示隐藏的熊名称而进行的来回交流。target_distance在这种情况下似乎没有太多意义,因为我们要么接收标志,要么不接收。score同样是True或False,原因是我们有一个二元情况,要么成功,要么失败,中间没有评分措施。

要完成挑战,我们可以通过创建一个新单元格,将下面的代码插入单元格中,将返回的标志粘贴到代码中,然后运行单元格来将标志提交给Crucible。我们可以看到标志是正确的!

总结

这篇博客文章简要介绍了LLM及其一些漏洞。我们从设置微软的PyRIT开始,到使用它攻击Crucible挑战结束。此文章的目的是让您在没有太多麻烦的情况下启动和运行,而无需深入研究代码或搜索网络以如何将各部分组合在一起。这篇博客文章几乎只是触及了攻击LLM和AI模型的表面。我们将来会发布博客文章,以介绍其他工具、更多手动攻击方法、更深入地讨论漏洞和防御、讨论与AI模型相关的风险框架(例如,MITRE ATLAS、OWASP LLM Top 10等),以及更便宜地获得高性能AI硬件的方法,仅举几例我们将推出的主题,因为我们开始增加与AI领域相关的产品和服务。希望您和我们一样兴奋!

附加参考

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计