漏洞分析 | 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及以上

漏洞原理分析

根本原因

该漏洞的根本原因是服务端在接收用户输入或用户可控参数后,未作处理或未进行严格过滤,将用户的输入直接拼接到模板中进行渲染,造成模板注入攻击。

技术细节

  1. 漏洞函数jinja2_formatter()

    • 该函数使用jinja2格式化模板,调用render方法并传入关键字参数对模板进行渲染
    • 官方补丁显示,该函数增加了安全告警,指出jinja2模板不具备沙盒保护机制
  2. 格式化映射

    • DEFAULT_FORMATTER_MAPPING字典定义了不同格式化方式对应的函数
    • jinja2对应的格式化函数是jinja2_formatter
  3. 调用链

    • PromptTemplate类的format函数使用DEFAULT_FORMATTER_MAPPING中与template_format对应的函数处理模板字符串
    • 攻击者通过load_prompt加载恶意JSON文件触发漏洞
  4. 文件加载流程

    load_prompt → _load_prompt_from_file → load_prompt_from_config → _load_prompt → PromptTemplate
    

漏洞利用方法

利用步骤

  1. 构造恶意JSON文件(attack_prompt.json)
  2. 通过load_prompt加载该JSON文件
  3. 利用jinja2模板特性执行任意Python代码

技术细节

  • 利用jinja2可以直接访问Python对象及其方法的特性
  • 通过构造继承链来执行恶意操作
  • 获取subprocess.Popen类的方法:
    • 通过__class__获取字典对象所属的类
    • 通过__bases__[0]获取基类
    • 使用__subclasses__()获取子类列表
    • 在子类列表中寻找可利用的类

修复方案

  1. 升级建议

    • 立即升级LangChain至0.0.312或更高版本
  2. 临时缓解措施

    • 对用户输入的JSON文件进行严格验证
    • 禁用或限制jinja2模板中危险功能的使用
  3. 产品防护

    • 网宿云WAF已支持对该漏洞利用攻击的防护

防护建议

  1. 实施输入验证和过滤机制
  2. 使用最小权限原则运行应用程序
  3. 定期更新依赖库和框架
  4. 部署WAF等防护设备拦截攻击尝试

总结

该漏洞由于LangChain框架中对用户输入缺乏充分验证,结合jinja2模板引擎的特性,导致远程代码执行风险。开发人员应及时更新受影响版本,并对用户提供的模板文件进行严格审查。

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文件触发漏洞 文件加载流程 : 漏洞利用方法 利用步骤 构造恶意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模板引擎的特性,导致远程代码执行风险。开发人员应及时更新受影响版本,并对用户提供的模板文件进行严格审查。