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

打印 上一主题 下一主题

主题 894|帖子 894|积分 2682

漏洞简介

LangChain是一个用于开发由语言模型驱动的应用程序的框架。
在LangChain受影响版本中,由于load_prompt函数加载提示文件时未对加载内容进行安全过滤,攻击者可通过构造包含恶意命令的提示文件,诱导用户加载该文件,即可造成任意系统命令执行。
漏洞复现

在项目下编写 test.py​
  1. from langchain.prompts import load_prompt
  2. if __name__ == '__main__':
  3.    loaded_prompt = load_prompt("system.py")
复制代码
同级目录下编写 system.py​ 执行系统命令 dir​
  1. import os
  2. os.system("dir")
复制代码
运行 test.py​ 返回了执行系统命令dir​的结果
[img=720,362.125]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202306271456561.png[/img]​
漏洞分析-_load_prompt_from_file​

langchain.prompts.loading.load_prompt​
[img=720,130.18302828618968]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202306271456563.png[/img]
try_load_from_hub​ 是尝试从给定的路径远程加载文件但是因为我们是加载本地文件,所以接下会跳转到 _load_prompt_from_file​
langchain.prompts.loading._load_prompt_from_file​
[img=720,375.6]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202306271456564.png[/img]
在 _load_prompt_from_file​ 根据文件的后缀,当后缀是 .py​ 时 最终会读取该文件并利用 exec​ 去执行
【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】
 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)
也就相当于,代码可以简写为
  1. if __name__ == '__main__':
  2.    file_path = "system.py"
  3.    with open(file_path, "rb") as f:
  4.        exec(f.read())
复制代码

漏洞分析-try_load_from_hub​

因为网络的原因一直没有办法复现成功,这里就代码层面进行一个详细的分析
  1. from langchain.prompts import load_prompt
  2. if __name__ == '__main__':
  3.    loaded_prompt = load_prompt("lc://prompts/../../../../../../../system.py")
复制代码
langchain.prompts.loading.load_prompt​
[img=720,138.35450027609056]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202306271456565.png[/img]
langchain.utilities.loading.try_load_from_hub​
[img=720,189.9475594997983]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202306271456566.png[/img]
首先匹配了 HUB_PATH_RE = re.compile(r"lc(?Pref@[^:]+)?://(?Ppath.*)")​ 所以需要满足最开始是 lc://​
然后对后面的内容进行匹配,要求第一个字段的值是 prompts​ 最后的后缀要在 {'py', 'yaml', 'json'}​ 中
[img=720,325.0767987065481]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202306271456567.png[/img]
最后拼接请求的url 可以通过 ../../../​ 绕出项目的限制,指向我们设定好的文件,并读取加载实现任意命令执行
漏洞小结

在最新版本上面进行尝试,仍然存在这个漏洞,这个漏洞的本质就是可以加载执行本地或者指定的 python 文件,但是在实际应用中这个问题应该并不是那么好进行利用,因为 python 文件的地址要可控才行。
更多网安技能的在线实操练习,请点击这里>>
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表