# 风险
对于提供大模型的应用,其风险可以分类到模型和应用壳两个层面上
可以参考 owasp top10 for llm
# 模型层
对于应用中的模型层,主要可以产生威胁的攻击模式是 prompt injection 提示词注入和 jailbreaking 模型越狱攻击。模型投毒主要会通过数据集 / 超参数在训练期影响模型的整体表现,但因应用中模型已经处于推理模式,输入不会对内部网络参数产生影响,其在实际使用中的风险可以忽略不计。同理,模型在训练时就已经对原始数据训练集进行蒸馏,使用时攻击者能够获取原始训练数据的可能性基本为零。
# 提示词注入
提示词注入指的是用户输入的内容改变了模型的工作模式,使模型输出了非预期的内容。这一威胁点存在于模型内部处理用户输入的方式:transformer 架构将所有输入编码成 token 后向量化计算,在这一步中模型同时处理所有输入,可能使用户输入的 user prompt 的注意力优先级覆盖了系统输入 system prompt,导致模型按照用户的输入输出了非预期内容。
其主要危害在于
- 泄漏系统提示词,使外部攻击者获知应用如何使模型工作
- 输出非法内容,使模型做出违反行为规范的行为
# 模型越狱攻击
模型越狱攻击是提示词攻击的一种特殊情况,攻击者通过特殊构造的输入使模型忽略掉其安全限制,产生较大的合法合规风险。
# 应用层
对于基于模型的应用层,其产生的安全风险与传统 web 应用较为类似,但也有其独有的风险点。
# 敏感信息泄露
应用可能没有妥善存储用户对大模型的使用信息,导致个人身份信息、用户敏感文件被以不安全的方式传输并存储至应用服务器。
在使用 llm+langchain 或其他架构的知识库检索系统上,用户可能能通过使用特殊构造的查询 prompt 查出不被授权访问的文档内容,其危害一般较大。
# 不正确地处理模型输出
由于模型输出可能被用户以某些方式进行操控,其输出应当被视作不可信的。如果应用未经过检查而信任并使用了模型的输出内容,其可能造成 RCE、sql 注入或更大的危害。
# 可能的攻击面示例
在这一部分中会展示一些成功过的针对大模型的攻击示例,其中包括市面常见大模型应用,也有得物内部的模型的攻击案例
# 用户输入恶意的 prompt 实现系统提示词泄漏
# xAI grok2 获取提示词
# ChatGPT gpt-4 泄漏提示词
# 豆包 泄漏提示词
# 某 App 智能导购助手 泄漏提示词 / 提示词注入导致模型越狱攻击
# 应用不正确地信任了模型输出
# 模型自动渲染输出页面导致 xss/csrf
# 某公司内部模型可操控数据库导致用户可越权查询数据库
在这一场景下,模型会解析用户输入 转化为 sql 语句并查询后返回结果。因其未对用户输入做合法性验证,导致用户可以查询任意数据库中数据。
# 可尝试的防御方式
在探讨大语言模型的运作原理时,我们发现这些模型将系统提示示词、用户提示词以及外部文档数据视为同等级别的输入。因此,在训练时未做针对性防御的情况下,模型极易受到提示词注入的攻击。
为了避免这种情况,最有效的防御策略是在模型内部构建防御几制,在训练阶段就着手强化对系统提示词的保护。可以通过在训练过程中输入针对性数据集,提高对这些数据的学习率,使模型能够在内部识别出潜在的注入行为,并立即采取拒绝措施。鉴于神经网络理论上能够拟合任意函数,这一目标是完全可行的。
对于现有的模型,目前尚未针对攻击进行专门防御,或许可以采用一些通用的防御策略来减轻潜在的攻击威胁,在一定程度上提高模型的安全性,保护其免受恶意攻击后的影响。
通过传统外部方式对模型输出进行鉴别
通过关键词正则匹配、机器学习、双模型对抗等方式对模型的转输出进行处理,如果得到非法输出或存在威胁的结果则进行拦截。不过,这种方式会破坏大模型的流式输出结构,增加用户侧的响应延迟,对用户体验有一定的影响。
仍然通过外部鉴别,但是针对用户输入
用户输入的内容被送至大模型处理之前,先通过外部模型鉴别其威胁度,如果威胁较高则不会送至大模型处理。这种方式仍然会增加用户侧初始响应延迟,但是可以保证模型流式输出,对用户体验影响较小。
将用户输入和外部文档标记为不可信内容
简单但是好用:
不要信任大模型的输出
应用在解析大模型输出作为各种功能的输入使用时,应将其视为为不可信输入,经过合法性检查 / 环境隔离 / 收缩权限后再运行。例如:
1. 前端渲染模型输出的html页面,应当默认禁止运行js 2. 运行模型输出的各类脚本时,应当在容器/沙盒环境中运行,并进行网络限制