LangChain是一个用于开发由语言模型驱动的应用程序的框架。
在LangChain受影响版本中,由于load_prompt函数加载提示文件时未对加载内容进行安全过滤,攻击者可通过构造包含恶意命令的提示文件,诱导用户加载该文件,即可造成任意系统命令执行。
(资料图片仅供参考)
在项目下编写test.py
from langchain.prompts import load_promptif __name__ == "__main__": loaded_prompt = load_prompt("system.py")同级目录下编写system.py 执行系统命令dir
import osos.system("dir")运行test.py 返回了执行系统命令dir的结果
_load_prompt_from_filelangchain.prompts.loading.load_prompt
try_load_from_hub 是尝试从给定的路径远程加载文件但是因为我们是加载本地文件,所以接下会跳转到_load_prompt_from_file
langchain.prompts.loading._load_prompt_from_file
在_load_prompt_from_file 根据文件的后缀,当后缀是.py 时 最终会读取该文件并利用exec 去执行
【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】
① 网安学习成长路径思维导图 ② 60+网安经典常用工具包 ③ 100+SRC漏洞分析报告 ④ 150+网安攻防实战技术电子书 ⑤ 最权威CISSP 认证考试指南+题库 ⑥ 超1800页CTF实战技巧手册 ⑦ 最新网安大厂面试题合集(含答案) ⑧ APP客户端安全检测指南(安卓+IOS)
也就相当于,代码可以简写为
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_promptif __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://
然后对后面的内容进行匹配,要求第一个字段的值是prompts 最后的后缀要在{"py", "yaml", "json"} 中
最后拼接请求的url 可以通过../../../ 绕出项目的限制,指向我们设定好的文件,并读取加载实现任意命令执行
在最新版本上面进行尝试,仍然存在这个漏洞,这个漏洞的本质就是可以加载执行本地或者指定的 python 文件,但是在实际应用中这个问题应该并不是那么好进行利用,因为 python 文件的地址要可控才行。
更多网安技能的在线实操练习,请点击这里>>
X 关闭
Copyright © 2015-2022 西方养生网版权所有 备案号:沪ICP备2020036824号-7 联系邮箱:5 626 629 @qq.com