当前位置: 首页 > news >正文

Jinja2模板引擎SSTI漏洞

1. 引入

再研究大模型相关应用的漏洞CVE-2025-25362时(参考1),看到作者给了比较详细的分析(参考2)。下面对这个漏洞做个介绍。

2. 漏洞类型

这个漏洞属于CWE-1336,它主要关注在使用模板引擎进行脚本化处理时,由于未能正确处理特殊元素而引发的安全问题。模板引擎通常用于将数据和预定义的模板相结合,以生成动态内容,如网页、配置文件等。当用户输入被嵌入到模板中且没有进行充分的验证和过滤时,攻击者可能会利用特殊元素注入恶意代码,从而导致安全漏洞(参考3)。

3. 漏洞复现

具体代码如下,运行这段代码,就能输出/home目录下的内容。替换popen中的命令,就能执行任意恶意命令。

from jinja2 import Environment# 创建一个 Jinja2 环境
env = Environment()# 模拟用户输入,攻击者可以构造恶意输入
user_input = "{{ self.__init__.__globals__.__builtins__.__import__('os').popen('ls /home').read() }}"# 模板字符串,包含用户输入
template_string = f"Hello, {user_input}!"# 从字符串加载模板
template = env.from_string(template_string)# 渲染模板
result = template.render()print(result)

具体来说,这段代码做了这些事:

(1)从 Jinja2 库中导入Environment类,并创建了一个 Jinja2 环境实例env。在实际应用中,Jinja2 环境用于管理模板的加载、渲染等操作。但这里直接使用默认的Environment,没有采取额外的安全措施,为漏洞埋下了隐患。

(2)攻击者构造了恶意输入user_input。在 Jinja2 模板语法中,双花括号{{ }}用于包裹表达式,这些表达式在模板渲染时会被求值。这里攻击者利用 Python 的属性访问和内置函数调用机制,通过self.init.globals.builtins.import(‘os’)导入os模块,再使用popen(‘ls /home’).read()执行系统命令ls /home并读取命令输出。如果这段恶意输入未经过滤就被用于模板渲染,攻击者就能获取/home目录下的文件列表,造成信息泄露。

(3)将恶意输入user_input嵌入到模板字符串template_string中。在正常情况下,模板字符串会包含一些变量占位符,用于填充动态数据。但此处直接将未经处理的用户输入插入,使得恶意代码成为模板的一部分。

(4)env.from_string(template_string)从字符串template_string创建了一个模板对象template。接着,template.render()方法对模板进行渲染,在渲染过程中,Jinja2 会解析并执行模板中的表达式。由于模板中包含恶意表达式,os.popen(‘ls /home’).read()会被执行,最终result中包含了/home目录下的文件列表信息,并通过print(result)输出。

4. 总结

上面给了复现漏洞的代码,代码中由于对用户输入没有进行任何验证和过滤,直接将其用于模板渲染,导致 Jinja2 模板引擎在处理模板时执行了攻击者注入的恶意代码,从而引发了严重的安全问题,如敏感信息泄露、服务器被恶意控制等。在实际开发中,应避免这种不安全的用法,采取输入验证、使用安全的模板引擎配置(如SandboxedEnvironment)等措施来防止 SSTI 漏洞。

5. 参考

  1. https://www.cve.org/CVERecord?id=CVE-2025-25362
  2. https://github.com/explosion/spacy-llm/issues/492
  3. https://cwe.mitre.org/data/definitions/1336.html

相关文章:

  • 加密壳(二)将shellcode写入PE
  • STL——红黑树的封装及map/set的模拟实现
  • 数字孪生火星探测车,星际探索可视化
  • 泛目录二级目录【实用指南】,无极站群系统2025升级版
  • leetcode125.验证回文串
  • java蓝桥杯b组
  • 20-算法打卡-哈希表-赎金信-leetcode(383)-第二十天
  • 用sed替换文本 笔记250419
  • Linux 进程间通信详解
  • 鼠标移动操作
  • C++原码、反码和补码
  • YuE本地部署完整教程,可用于ai生成音乐,歌曲
  • 6. 话题通信 ---- 使用自定义msg,发布方和订阅方cpp,python文件编写
  • Linux cmp 命令使用详解
  • Python语法系列博客 · 第8期[特殊字符] Lambda函数与高阶函数:函数式编程初体验
  • git合并分支并推送
  • FPGA系列之DDS信号发生器设计(DE2-115开发板)
  • firewalld 防火墙
  • 从零开始学A2A五:A2A 协议的安全性与多模态支持
  • 第三届世界科学智能大赛新能源赛道:新能源发电功率预测-数据处理心得体会1
  • 2025上海半马鸣枪,多个“首次”冲击一城双白金
  • “30小时不够”,泽连斯基建议延长停火至30天
  • 大理州工业投资(集团)有限公司党委副书记、副总经理赵云接受审查调查
  • 马上评丨敦煌网美国爆火,“市场之腿”总能跨越关税壁垒
  • 华夏银行去年净赚超276亿增近5%,个人贷款不良率升至1.8%
  • 特朗普:“百分之百”相信能与欧盟达成贸易协议