当前位置: 首页 > 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
  • 此前显示售罄的火车票“五一”前大量放出来了?12306回应
  • 五一去哪玩?“时代交响”音乐会解锁艺术假期
  • 图忆|上海车展40年:中国人的梦中情车有哪些变化(上)
  • 前行中的“模速空间”:要攻克核心技术,也要成为年轻人创业首选地
  • 七部门联合发布《终端设备直连卫星服务管理规定》
  • 国台办:民进党当局所谓“对等尊严”,就是企图改变两岸同属一中