Langchain任意命令执行-CVE-2023-34541
#python #网络安全 #learning #poc

脆弱性简介

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" )

runâtest.py返回执行系统命令的结果

Image description

漏洞分析:-_ load_prompt_from_file

langchain.prompts.loading.load_prompt

Image description

try_load_from_hub试图从给定路径远程加载文件,但是由于我们正在加载本地文件,因此下一步是跳到loadprompt_from_file

langchain.prompts.loading._load_prompt_from_file

Image description

根据loadPrompt_from_fileâ到文件后缀,后缀为.py。

也就是说,代码可以缩写为

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

漏洞分析:-try_load_from_hub

由于网络,无法重现成功,这是对代码级别的详细分析

来自langchain.prompts import load_prompt _ _

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

langchain.prompts.loading.load_prompt

Image description

langchain.utilities.loading.try_load_from_hub

Image description

它是匹配的,首先是hub_path_re = re.compile(r“ lc(?pref@[^:]+)+)?://(?ppath。)),因此需要满足初始的是 * *lc:// *然后匹配以下内容,需要第一个字段的值提示

in

Image description

最后,剪接请求的URL可以通过绕过项目的限制来设置的文件,并读取和加载以实现任意命令执行

脆弱性摘要

尝试最新版本,此漏洞仍然存在。此漏洞的本质是它可以加载和执行本地或指定的python文件,但是此问题在实际应用程序中不容易利用这个问题,因为Python文件的地址必须仅仅是可以控制的。

>

支持链接


来源:-https://tutorialboy24.blogspot.com/2023/07/langchain-arbitrary-command-execution.html