什么是大模型(LLM)?
首先大模型是基于神经网络算法实现AI的一种技术,用下面这两张图说明下大模型在AI中的位置。
更具体的说明如下。
再从名字的角度解释下大模型的概念,我们常说的大模型基本指的是大语言模型,英文是LLM(large language model),从名字就可以看到LLM其实就是语言模型。large是形容词,指的是模型规模巨大(一开始的chatgpt参数量在千亿级别),模型训练所需要的算力巨大,所使用的数据量级巨大这几个性质。所以问题聚焦在什么是语言模型。
语言模型是自然语言处理领域(计算机表示和处理自然语言,即是计算机如何与我们说的话打交道)的一个概念,形式化的说明可以参考这张截图,来源于《自然语言处理》一书。
通俗的讲,就拿我们常用的输入法来说,一般在我们打了几个字后,就会出现一个待用词的列表,然后我们就不用打接下来的字了,这个列表中出现的内容有很高的概率和我们接下去想输入的内容匹配。语言模型其实就是这么个东西,你给出一部分,它预测一部分,其本质就是完型填空,只是LLM效果很好,能支持很长的文本序列和上下文感知,看起来很神奇。下面这张图可以很好的诠释LLM输出内容的这个过程。
什么是chatgpt?
Chatgpt是基于LLM的一种产品,功能是对话式问答。Chatpt和其他众多的LLM应用一样,其诞生大致遵循这样一个流程。
这么说有些抽象,下面是先知安全沙龙这篇文章的截图,链接(https://xz.aliyun.com/t/13189)。
总结来说的话,类似chatgpt等大模型应用的产出就是遵循“预训练+微调”的新范式,就是在前文我们说的语言模型的基础上进行优化,使得模型输出更准确,更符合人类主流的价值观和说话方式,但究其根源还是一个用来完型填空的语言模型。
LLM安全
新技术带来新缺陷,LLM作为当下时代最火热的技术概念,不可避免的会带来许多的安全问题。首先我们先对LLM安全进行一个比较体系的描述(自己的主观概括)。
我们应该对传统信息安全的CIA比较熟悉,它指的是信息安全的目标是保障信息对象的完整性,保密性和可用性。当然随着技术的更新迭代,安全指标肯定会随之扩展,不过某种程度来说这不重要,而且这些理论的东西很难说对我们的安全实践有什么直接帮助。在这里之所以提这个东西是想明确一件事情,安全的本质是一种服务,它是为了保障某个对象的安全需求才存在的,正如前面提到的CIA。
而在这里,这个对象指的是LLM(因为LLM是AI模型,所以模型+数据+算法=LLM依然成立)。LLM安全需求的几个主要指标包括LLM的完整性,保密性,隐私性,鲁棒性,公平性等,这是LLM的安全目标,同时对LLM的攻击也是对这些安全指标的破坏。
那如何实现这些安全目标呢?作为攻击者,又如何破坏这些安全目标呢?可以类比攻防领域的ATT&CK矩阵,攻防矩阵将攻击过程分解成一个个环节,每个环节都集成了相关的攻击和防护技战术。迁移到LLM安全领域,从攻防的角度来说,防的一种比较好的方法是在LLM全生命周期的各个环节嵌入安全要素,具体就是在每个环节进行相关的安全实践活动,与之相应的就是与攻相关的安全破坏活动。
总结来说,LLM安全体系就是在LLM的全生命周期的各个环节,通过模型、算法、数据三个维度实施的安全实践活动/安全破坏活动来保障/破坏LLM的完整性,保密性,隐私性,鲁棒性,公平性等安全指标。
通过这个方法可以从一个全局的视野来指导我们形成一个对LLM安全的大概的框架认知,不至于两眼一抹黑。在有了一个框架之后,我们再慢慢的填充相关知识。类似的划分如下图,来源于百度大模型安全白皮书。
链接(https://shadu.baidu.com/product/llmsec)
下面是OWASP LLM security top 10的截图,针对LLM的比较高的十个危险项。如果我们构造了一个自己的LLM的攻防矩阵的话,这些风险项都可以分类到LLM ATT&CK矩阵不同的生命周期环节中。
下面这是十大风险项在LLM应用环节的可能存在的触发位置,清晰图片可以查看文章后面链接。
如何对LLM进行安全测试
在前文我们从攻防的角度大致认知了LLM的安全体系(当然,这是指的LLM本身和集成LLM的系统,不包括滥用LLM的一系列安全问题)。在LLM的整个生命周期中,一般对于我们普通安全测试人员来说实际能接触且能造成实战攻防效果的应该就是LLM使用阶段了,在这个阶段存在的攻击向量可以分为两类,一类是LLM模型安全,一类是LLM系统功能安全。
LLM模型安全
如果不赋予LLM额外的能力,仅就LLM模型自身的安全来说,基本在内容安全这块。也很好理解,LLM的形式本来就是根据用户提示提供输出,在不赋予LLM额外能力的情况下,比如下文要说的agent,LLM就只是根据输入单纯的输出文本或者图片内容。
内容安全分类的话,可以分为数据泄露和输出内容安全。
有价值的数据泄露基本包括训练数据泄露,提示词泄露,用户敏感数据泄露和企业敏感数据泄露这几类,下面举几个数据泄露的案例。
训练数据泄露
提示词泄露
敏感数据泄露
输出内容安全是指输出内容要合法合规且符合主流的道德伦理观念。LLM的原理根基还是基于统计学习的,所以其本身并没有这些限制,虽然训练的环节增加了RLHF等步骤,但也只是在概率上减少非预期内容的产出,所以我们可以构造一些提示词测试LLM在针对输出内容安全是否较好的进行了安全限制。最基本的我们可以直接向LLM提问违规内容,比如让LLM生成恶意代码,让LLM构造钓鱼邮件。
不过随着LLM的普及和不断的更新迭代,直接的提问已经失效,需要一些技巧来绕过安全限制,顺便给这些技巧起了个新名词,提示注入。这些安全限制包括但不限于风险名单,规则引擎,模型检测,听起来很像风控的防护体系对吧,这不在本文的讨论范围。总之提示注入类似一个攻防的过程,像我们绕WAF一样,比如比较著名的奶奶漏洞,是通过一种名为角色扮演的技巧来诱导模型输出违规内容,下面这张截图是类似的案例。
直接提问是会拒绝的,然后通过扮演开发者就会获得成功的回应。
下面这张先知文章的截图还包含了一些其它的技巧,链接上文已给出。
LLM系统功能安全
当把LLM集成到系统中或者把LLM的能力作为一种服务应用(比如web服务的形式)所衍生的一系列问题就被划分到了系统功能安全的类别,这里面也可以分为两大类。
一类是因为赋予LLM额外能力造成的安全问题,能力赋予或者以插件的形式,或者以agent的形式,但其本质都是要依靠API的调用。所以这又回到了我们熟悉的领域,对API的安全测试,只不过形式发生了变化,不再是抓包FUZZ具体的参数,而是与LLM的对话或者其它的输入形式,但依然是新瓶装老酒,换汤不换药。
比如下面这个截图,因为赋予了代码执行能力所造成的RCE。
具体的案例。
下面这是LLM靶场的截图,是通过扮演开发者的角色获取删除用户的权限,进而让LLM调用相关API删除用户,比较基础,是想说明此类形式的安全问题。
另一类问题就是基于LLM的应用服务本身可能存在的安全问题,这个LLM应用可以是一个APP,也可以是一个web服务,这块的安全测试内容就是我们平常的常规测试了,从认证,授权,访问控制再到会话管理,具体的业务逻辑,这些都可以测起来了。
比如下面因为web缓存欺骗攻击造成的chatgpt账户接管漏洞,截图来自相关公众号,如下。
还有下面这个未授权访问敏感信息的案例。
ok,正文内容到这里结束,文章没有涉及具体的技术细节,只是提供一个大概的思路,抛砖引玉,希望能作为一个LLM安全测试入门的思路参考。本文都是个人主观总结,如有不准确的地方,欢迎指正。下面是列举的一些LLM的参考资料。
LLM安全资源
PortSwigger的LLM靶场
https://portswigger.net/web-security/llm-attacks
owasp llm security top 10 页面
一个gpt安全的知识库
https://github.com/mo-xiaoxi/GPTSecurity
M01N Team公众号的大模型安全系列文章
https://mp.weixin.qq.com/s/DfIBsVmUqCtWdZGR65wpLg
一个学习提示注入的网站
https://learnprompting.org/zh-Hans/docs/prompt_hacking/intro
大语言模型(LLM)安全测评基准V1.0 发布版