作者:jifeng
随着大模型热度持续,基于大模型的各类应用层出不穷。Langchain 作为一个以 LLM 模型为核心的开发框架,可以帮助我们灵活地创建各类应用,同时也为大模型的应用引入新的安全隐患。从今年 4 月 Langchain 被爆出在野 0day 漏洞开始,各类安全问题不断出现。腾讯安全平台部将持续关注大模型的应用安全,详细解读在大模型应用时代,如何与时俱进地保持安全策略,以保障大模型安全、可靠地应用。
一 :从攻击面浅谈 Langchain 工作流程及安全
Langchain 作为一个大语言模型应用开发框架,高效地解决了开发大语言模型应用的痛点问题。Langchain 最主要的特色是可以将 LLM 应用研发过程中的交互 Prompt、LLM 模型调用、语言模型与环境互动的自适应等方式融为一体。
Langchain 提供各类模块支持,按照复杂性依次是模块、提示、内存、索引、链、代理,为了快速地理解使用流程及安全问题,我们可以通过本地知识库问答的这类应用来了解 Langchain 的工作流程。
如下图所示,从 1、2、3、4、5、6 阶段看,本地各类文档数据可以通过 Text 类划分为长度更短的段落,利用 embedding 模型进行向量化,存入向量数据库。8、9、10 阶段是把提问进行语义的向量化处理,经过处理后的 query 向量和已有文章段落向量进行匹配。11、12 阶段是可以设定检索匹配度最高的 top-K 个段落,通过把 K 个段落和用户提问组合输出到提示词的模版当中。13、14、15 阶段是最终输送给语言模型的 Prompt 和语言模型的输出。
从安全攻防角度看,上述各阶段的安全问题主要存在于如何通过控制输入信息来影响模型输出内容,相关影响的阶段主要是 8、9、10 阶段和 13、14、15 阶段。
图一 ,摘自imclumsypanda绘制,略做修改[1]
链(Chain)是 langchain 中连接输入输出的应用角色,主要应用于 13、14、15 阶段。开发者可以基于链快速实现输入 prompt 预处理、输出后处理等操作,开发一个简单的 LLM 应用。langchain 内也实现了 LLMBashChain、LLMMathChain、SQLDatabaseChain 等链,开发者可以直接调用这些链,完成大模型应用的快速部署。链中数据流处理不当,很容易产生各类漏洞,下面将介绍的 CVE-2023-29374 就是 langchain 预置的 LLMMathChain 中的漏洞。
二:Langchain 的典型安全漏洞 : CVE-2023-29374 分析
从业务视角看,Langchain 可以应用到自然语言生成、对话系统、问答系统、总结与翻译、语义搜索、数据抽取、智能写作、知识抽取、代码理解等领域中,任何对不安全输入过滤对疏忽或 Langchain 自身安全问题都可能影响到人工智能服务本身。下面将通过前段时间热议的一个安全漏洞来说明其安全影响。
CVE-2023-29374 是 Langchain 的一个任意代码执行漏洞,使用 0.0.131 及之前版本的 Langchain,并调用 Langchain LLMMathChain 链的程序,存在包含任意命令执行的安全风险,可能导致 OpenAI key 等敏感信息泄漏、Langchain 服务端被控等问题。
图二、利用漏洞返回passwd文件内容[2]
LLMMathChain 类是提供数学相关操作的链,提供数学公式处理、数学运算等数学操作的支持,用户可以基于该 chain 实现与大语言模型交互、处理数学相关的问题。
通过"LLMMathChain"关键字搜索 github 可以发现,包含 LLMMathChain 的代码量在 1 千条以上。
图三、github上存在LLMMathChain的引入数量
LLMMathChain 的代码主要在 Langchain/chains/llm_math/base.py 中,简单分析代码可以发现,CVE-2023-29374 漏洞的问题主要在 LLMMathChain 的_process_llm_result 方法中。
当 LLMMathChain 完成与大语言模型的交互,获取到大语言模型的返回结果后,会调用_process_llm_result 方法处理大语言模型返回的数据。_process_llm_result 方法没有进行任何过滤处理,直接提取输出中以"```python"起始的字符串,交给 PythonREPL 对象处理,而该对象的功能就是执行输入的字符串。
图四、存在安全问题的函数
这意味着只要大语言模型返回包含"```python[malicious code]"的数据,即可触发该漏洞,造成[malicious code]部分被执行。
总的来看,CVE-2023-29374 的问题在于 Langchain 并没有对数据进行处理就直接交给了敏感函数,虽然触发代码执行的数据是由大语言模型返回的,但用户可以通过 Prompt engineering 来控制大语言模型的输出,进而触发该漏洞。
三:此类安全问题汇总
除上述漏洞外,之后的后半年时间内 Langchain 有 12 个漏洞被证实,包括 SQL 注入和命令执行漏洞。特别是针对大模型的 SQL 注入攻击,这可能开启了一种新的攻击模式,这类攻击在大模型集成的 web 应用程序中尤其危险,可能导致数据破坏和信息泄露风险。
图五、SQL注入攻击PoC演示 [3]
不仅是 Langchain 产品,我们还看到其他类似产品同样存在类似的安全问题,包括 LlamaIndex,pandas-ai 等等。
存在漏洞的产品 | 漏洞类型 | 存在模块 |
---|---|---|
Langchainv.0.0.232(CVE-2023-39659) | 命令执行 | PythonAstREPLTool._run |
Langchainv.0.0.245(CVE-2023-39631) | 命令执行 | numexpr |
Langchainv.0.0.232(CVE-2023-38893) | 命令执行 | from_math_prompt |
Langchainv.0.0.131(CVE-2023-29374) | 命令执行 | LLMMathChain |
Langchainv.0.0.64(CVE-2023-36189) | SQL 注入 | SQLDatabaseChain |
llama_index v.0.7.13(CVE-2023-39662) | 命令执行 | PandasQueryEngine |
pandas-ai v.0.9.1(CVE-2023-39661) | 命令执行 | _is_jailbreak |
pandas-ai v.0.8.0(CVE-2023-39660) | 命令执行 | init |
图六、部分存在于大模型应用框架的漏洞
四:我们当前发现的类似安全问题
为了测试 langchain 最新版(0.0.288)代码安全程度,我们分别从 codeql 扫描和代码审计两个途径对 langchain 做了检测。通过 codeql 自动化扫描 langchain 没有发现可利用的安全风险,但通过人工审计,我们发现 Langchain 未公开的任意代码执行漏洞,可以造成 Langchain 服务端敏感信息泄漏、命令执行等问题,相关的漏洞信息已同步给 Langchain 团队。
从目前我们掌握的情况分析来看,Langchain 的不安全性集中在某些 chain 的实现部分还有其引入的第三组件当中,而某些漏洞甚至是修复后的继续绕过,其直接的安全危害可能是服务器的内部信息泄露或是远程被控,所以及时更新官方版本,关注安全公告是非常有必要。
五:启发&趋势分析
大语言模型持续成为业界关注重点,大语言模型本身的幻觉、诱导等问题是业界重点研究对象,而大语言模型伴生组件的安全性少有关注。在整个大模型的基础设施中,模型依赖、上层应用等组件的安全性同样是大模型安全的重要保障,如果相应组件出现安全问题,一旦造成核心数据、模型资产泄漏,企业的损失是不可估量的。
从我们对 Langchain 的审计来看,大模型组件的安全性,尤其是独立开发者、小团队开发的组件安全性不容乐观。在大家日常使用这类组件、应用时,应该对输入、输出尤为谨慎,做好过滤,避免产生安全问题。
以 Langchain 为依托的各类的大模型应用逐渐普及并应用在日常生活当中,这表明伴随 AI 技术面向生产生活的安全问题会迅速扩大。我们一般会认为算法安全、模型安全所造成的实际风险会较低一些,但当这些问题同 AI 相关的基础软件、应用安全问题结合起来后,值得我们额外的关注。分场景,分风险类型的安全加固是 AI 各类应用能走得稳、走得好的一个前提条件。
作为腾讯安全团队的一员,我们也将持续关注大模型应用研发安全、算法安全,prompt 攻防安全、底层基础设施漏洞挖掘等方向,以保障大模型安全、可靠的使用。欢迎大家一起交流探讨,共同进步。
参考资料
2.https://twitter.com/rharang/status/1641899743608463365
3.SQLDatabaseChain has SQL injection issue · Issue #5923 · langchain-ai/langchain · GitHub
声明:本文来自腾讯技术工程,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。