漏洞分析 | LangChain代码注入漏洞(CVE-2023- 36281)
字数 1165 2025-08-18 11:36:36
LangChain代码注入漏洞(CVE-2023-36281)分析报告
漏洞概述
LangChain是一个LLM(大型语言模型)编程框架,通过可组合性使用LLM构建应用程序。在0.0.171至0.0.312版本中,存在一个严重的代码注入漏洞,远程攻击者可以通过load_prompt函数的JSON文件来执行任意代码。
受影响版本
- 受影响版本范围:0.0.171 ≤ LangChain < 0.0.312
- 修复版本:0.0.312及以上
漏洞原理分析
根本原因
该漏洞的根本原因是服务端在接收用户输入或用户可控参数后,未作处理或未进行严格过滤,将用户的输入直接拼接到模板中进行渲染,造成模板注入攻击。
技术细节
-
漏洞函数:
jinja2_formatter()- 该函数使用jinja2格式化模板,调用render方法并传入关键字参数对模板进行渲染
- 官方补丁显示,该函数增加了安全告警,指出jinja2模板不具备沙盒保护机制
-
格式化映射:
DEFAULT_FORMATTER_MAPPING字典定义了不同格式化方式对应的函数jinja2对应的格式化函数是jinja2_formatter
-
调用链:
PromptTemplate类的format函数使用DEFAULT_FORMATTER_MAPPING中与template_format对应的函数处理模板字符串- 攻击者通过
load_prompt加载恶意JSON文件触发漏洞
-
文件加载流程:
load_prompt → _load_prompt_from_file → load_prompt_from_config → _load_prompt → PromptTemplate
漏洞利用方法
利用步骤
- 构造恶意JSON文件(
attack_prompt.json) - 通过
load_prompt加载该JSON文件 - 利用jinja2模板特性执行任意Python代码
技术细节
- 利用jinja2可以直接访问Python对象及其方法的特性
- 通过构造继承链来执行恶意操作
- 获取
subprocess.Popen类的方法:- 通过
__class__获取字典对象所属的类 - 通过
__bases__[0]获取基类 - 使用
__subclasses__()获取子类列表 - 在子类列表中寻找可利用的类
- 通过
修复方案
-
升级建议:
- 立即升级LangChain至0.0.312或更高版本
-
临时缓解措施:
- 对用户输入的JSON文件进行严格验证
- 禁用或限制jinja2模板中危险功能的使用
-
产品防护:
- 网宿云WAF已支持对该漏洞利用攻击的防护
防护建议
- 实施输入验证和过滤机制
- 使用最小权限原则运行应用程序
- 定期更新依赖库和框架
- 部署WAF等防护设备拦截攻击尝试
总结
该漏洞由于LangChain框架中对用户输入缺乏充分验证,结合jinja2模板引擎的特性,导致远程代码执行风险。开发人员应及时更新受影响版本,并对用户提供的模板文件进行严格审查。