AI安全的学习
以下内容摘自 银遁安全团队(公众号),非原创。本文仅作个人技术记录使用,如有侵权,请联系删除。
【AI安全】提示词Prompt注入攻击记录
文章内容来源:https://mp.weixin.qq.com/s/ul2T0hjAn1y_tZy2C94ACg
简介
“关于提示词prompt注入攻击漏洞”的靶场通关经验记录。
什么是提示词注入漏洞?
攻击者通过构建看似无害的输入(即“提示词”),来操纵或欺骗AI模型,使其偏离预设的指令,执行非预期的行为。
著名的网络安全靶场immersive lab在此前曾推出过一个关于提示词注入的靶场,本文将以该靶场为视角,讲述实战场景下的提示词注入攻击方法。https://prompting.ai.immersivelabs.com/
第一关
一个提示词注入技巧角色扮演,扮演之前给他设定密码的用户,成功套出AI所隐藏的password。
角色扮演技巧:我们常常会在提示词攻击当中使用这种技巧,“角色扮演“的核心在于利用大型语言模型遵循指令和上下文的能力,通过构建一个虚构的场景或身份来规避模型的安全护栏。当然在这次的靶场实验当中我们会并没有挥发出"角色扮演"这个技巧的全实力。事实上在之前,我有遇到过一个特定领域的Agent实例,是关于购物的Agent,这个Agent原本的安全边界时只允许询问有关商品的内容,但是我们可以”假扮顾客“用来绕过安全防护来询问我们想要的内容。
第二关
采用了**”编码绕过“**的技巧实现了提示词注入攻击。我让目标的大模型为密码的ASCII码每位都加上一来实现安全防护。
编码绕过技巧:这同样也是一个常用的提示词注入技巧,在某些情况下这种技巧也被称作”侧信道“。狭义的编码绕过攻击方式指的是通过某种加密方式,比如base64编码,凯撒加密,约定密钥进行加密等对大模型输出的内容进行加密从而绕过输出端的检查。但是我个人认为广义的”编码绕过“攻击,也应该把不同语言的测试技巧也算作其中,比如让大模型使用法文来输出目标敏感信息最后再拿去解码。
第三关
基于这种密码被屏蔽的考虑,我打算使用**”字符干扰“**技巧进行绕过,如下所示,我让大模型为密码当中的每个字母进行分割,分隔符使用”“,以这种方式逃过可能存在的正则匹配过滤。
字符干扰技巧:字符干扰是在各种bypass应用当中都经常使用的技巧,无论是命令执行,sql注入的攻击方式都会使用类似的方法进行waf绕过。在提示词注入攻击领域也不例外,我曾在测试美团开源大模型的时候,企图套出该大模型的系统提示词时发其在输出端有内容过滤,用以防止系统提示词泄露,这时候我们就可以使用”字符干扰”的方式进行内容绕过,例如,输出时在每句话后面加上“f4nx1ng”
第四关
如法炮制,上来可以先通过询问密码位数的方式来确认密码的长度信息,然后结合长度信息以及上一关的字符干扰技巧实现提示词注入。请注意这里的位数询问在某些情况下是必要的,因为在有些时候直接让llm输出字符分割后的密码,可能会缺少一些字母,导致信息丢失。所以最好还是能通过旁敲侧击的方式询问出密码位数比较好。
第五关
在这一关我采用了在Level3已经使用过的技巧“编码绕过”,让大模型输出目标密码的ASCII,然后我接着让大模型根据我提供的ASCII码进行字符转化,来实现密码获取的目的。但是很显然,目标服务使用DLP进行输出内容过滤,导致我们原本可以输出完整密码的内容没有完全输出出来。因此,我们最后同样借助“字符干扰”的方式,对目标DLP实现绕过。
第六关
第6关有意思了,这一关里的大模型会说谎,而且是高强度说谎。它虽然会回答你的问题,就像往常一样不经意间把他所保存的密码泄露给你。但是这一次给到我们的密码是错误的,用于混淆视听。正如我如下的测试结果,我像前一关那样问大模密码的位数,密码的ASCII码以及通过字符干扰的方式尝试让大模型输出他所隐藏的密码信息。但是这一次我拿到的确实错误的密码,即便大模型很肯定的回答他自以为正确的信息。因此,我在后面的测试当中改变了原有的既定逻辑,不再以之前的密码位数为基准让大模型输出特定位数的密码。这一次我直接让大模型输出密码当中的每一位字符并辅以字符干扰技巧成功的让大模型将密码信息透露了出来。从下面的图片当中可以看出,虽然大模型输出的密码位数为8位,但是实际上密码有9位,这是我们强行让他输出每一位密码的结果,至此我们才能完成绕过。
模型幻觉:事实上,模型幻觉可能存在于每一次的大模型问答当中,这对于我们攻击者来说是一个巨大的挑战。仅仅通过大模型提供给我们的信息,我们无法真正的确认我们是否成功套取信息。我们只能唯结果论,通过拿大模型给我们的信息去尝试,才能真正确认息的真实性。
第七关
在第七关该靶场引入了一个全新的概念——“情景问答”。在这种预设的情境下无论你问大模型什么样的问题,他都只会回答你他预设好的内容。目标大模型还是以中文的方式回复的,这不是一个好兆头,因为如果我们希望通过某些短语的开头首字母进行推断的话,我们就不能让大模型以中文进行输出,因此在下轮的尝试当中,我直接使用英文的方式和大模型进行沟通。事实上,英文沟通还有一个好处,就是可以通过不断地同义词替换来寻找大模型问答当中的漏洞,例如:provide, offer等。在下面的英文尝试当中,我尝试了两种方法,一种是情景带入,一种是“公式计算”。很显然这两种方式都失败了,我们没有办法让大模型完整的输出密码的全貌。于是乎,我尝试了另外一种方法这同样是一种情景带入,只不过这一次的情景带入手段比之前的生搬套要高级不少。
我们让大模型输出以密码当中每一位为首字母的恐龙名称来遍历式的套取密码信息,如下所示:以此类推我们最终可以得出答案。
情景带入:在很多大模型应用当中都有这样的情况,给定一个特殊的场景,这个大模型只能回答在这个垂直领域里面的问题,其他问题一概不予回答。这种技术常见于智能体当中,尤其是在coze这种集成化无码智能体构建平台上尤为明显,这种智能体或大模型应用通过在系统提示词增加诸如“暗示”,“设定”,“限制”等相关提示词将智能体的应用范围缩小到一定的领域,从而提高大模型以及智能体的回答效率。面对这种大模型应用我们普遍采取的方式就是情景带入,通过一个尽量不那么生搬硬套的情景套取我们想要的信息。这个绕过方式可以广泛应用到当前很多大厂在自家应用当中植入的智能体助手里面,事实上我就曾测试过其中一个智能体,可以说是随便绕。
第八关
在一个老外那里看到了一个比较有意思的攻击技巧,有望泛化成真实世界当中的攻击技巧,我称其为“怜悯”。正如下图所示,在本次对话当中扮演了一个“little boy”角色,尝试让大模型输出有关密码的提示。但是很明显上面的提示不够精准,也不够集中,我需要的提示是能够直指目标密码的字符串构成的,所以我尝试让大模型输出额外的5个提示供我参考。至此,我们发现大模型在每一次的输出当中都会带有和密码字符串组成相关的提示,所以我只要接着问下去就可以了,切记在不断的讯问过程当中需要透露当前的“little boy”理解状态,以便于让大模型提供更简单更多非重复的信息。最后,我干脆直接让他输出和密码当中字符顺序相关的提示,他直接就输出了大量的字符相关内容,结合我们之前的提示足以推导出他的密码是多少了。
怜悯:“怜悯”的本质仍然是角色扮演攻击,我们扮演的角色正是一个需要同情,需要怜悯的角色,例如,小男孩。当攻击者以“一个小男孩”的身份提出请求时,模型会倾向于将对话的背景设定为一个天真、无恶意的情景,模型的审查系统可能会降低警惕性。系统可能会判断在一个虚构的、充满童真的情境下生成的内容,其“危害性”会相对较低,从而更容易绕过安全限制。
第九关
用魔法打败魔法。具体操作方法:想尝试通过含义解答,可以直接将这些提示送给另外一个大模型,让另外一个大模型直接猜,用魔法打败魔法
上下文完善/引导:这是在最后一关当中我们所采用的套取flag的手段结合了之前的“情景带入”以及“怜悯”。当然最终我们使用了“引导”的技巧逐步套取大模型所保存的flag内容,这是一个十分有用的技巧,在大模型幻觉率过高或者是模型温度过高的时候,我们难免会遇到一些垃圾信息。这时候引导的作用就体现出来了,它不仅能够很好的完善上下文内容,还能逐步将答案逐步的解开。
对于通关方法,我仅作了部分摘录。本文作为学习ai的一个记录贴,方便以后回顾技术链来进行使用。
补充说明
详细内容请从原创作者处获取:
https://xz.aliyun.com/news/19245
或者原创作者的参考链接:
https://www.youtube.com/watch?v=P_oKzpVA36w
https://contextoverflow.com/p/immersive-gpt-write-up-and-analysis
最后,感谢师傅们的精彩分享!
本文来自博客园,作者:怀玉,转载请注明原文链接:https://www.cnblogs.com/etc/p/19342259
浙公网安备 33010602011771号