CVE-2023-34541 LangChain 任意命令执行

admin 2023年6月27日17:32:40评论71 views字数 1274阅读4分14秒阅读模式

漏洞简介

LangChain是一个用于开发由语言模型驱动的应用程序的框架。

在LangChain受影响版本中,由于load_prompt函数加载提示文件时未对加载内容进行安全过滤,攻击者可通过构造包含恶意命令的提示文件,诱导用户加载该文件,即可造成任意系统命令执行。

漏洞复现

在项目下编写 test.py

from langchain.prompts import load_prompt
if __name__ == '__main__':
    loaded_prompt = load_prompt("system.py")

同级目录下编写 system.py 执行系统命令 dir

import os
os.system("dir")

运行 test.py 返回了执行系统命令dir的结果

CVE-2023-34541  LangChain 任意命令执行

漏洞分析-_load_prompt_from_file

langchain.prompts.loading.load_prompt

CVE-2023-34541  LangChain 任意命令执行

try_load_from_hub 是尝试从给定的路径远程加载文件但是因为我们是加载本地文件,所以接下会跳转到 _load_prompt_from_file

langchain.prompts.loading._load_prompt_from_file

CVE-2023-34541  LangChain 任意命令执行

_load_prompt_from_file 根据文件的后缀,当后缀是 .py 时 最终会读取该文件并利用 exec 去执行

也就相当于,代码可以简写为

if __name__ == '__main__':
    file_path = "system.py"
    with open(file_path, "rb") as f:
        exec(f.read())

漏洞分析-try_load_from_hub

因为网络的原因一直没有办法复现成功,这里就代码层面进行一个详细的分析

from langchain.prompts import load_prompt

if __name__ == '__main__':
loaded_prompt = load_prompt("lc://prompts/../../../../../../../system.py")

langchain.prompts.loading.load_prompt

CVE-2023-34541  LangChain 任意命令执行

langchain.utilities.loading.try_load_from_hub

CVE-2023-34541  LangChain 任意命令执行

首先匹配了 HUB_PATH_RE = re.compile(r"lc(?Pref@[^:]+)?://(?Ppath.*)") 所以需要满足最开始是 lc://然后对后面的内容进行匹配,要求第一个字段的值是 prompts 最后的后缀要在 {'py', 'yaml', 'json'}

CVE-2023-34541  LangChain 任意命令执行

最后拼接请求的url 可以通过 ../../../ 绕出项目的限制,指向我们设定好的文件,并读取加载实现任意命令执行

漏洞小结

在最新版本上面进行尝试,仍然存在这个漏洞,这个漏洞的本质就是可以加载执行本地或者指定的 python 文件,但是在实际应用中这个问题应该并不是那么好进行利用,因为 python 文件的地址要可控才行。

原文始发于微信公众号(合天网安实验室):CVE-2023-34541 LangChain 任意命令执行

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月27日17:32:40
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CVE-2023-34541 LangChain 任意命令执行https://cn-sec.com/archives/1838159.html

发表评论

匿名网友 填写信息