Jinjava基于JavaType反序列化绕过CVE-2025-59340
Jinjava 是基于 Django 模板语法Java模板引擎,专为渲染Jinja模板设计,支持复杂内容管理系统和大规模 Web 应用开发,应用场景广泛。
Jinjava 不仅支持 Jinja 模板的核心功能,并且针对 HubSpot CMS 的特定需求进行了优化,目前已经在生产环境中成功应用于数千个网站。
一、基本情况
Jinjava 的核心技术基于 Java 8 及以上版本,充分利用 Java 的强大功能和灵活性,不仅支持基本的模板渲染,还提供了丰富的扩展功能。
Jinjava支持多种资源加载器,包括类路径资源和文件系统资源加载器,确保模板加载灵活和安全性,提供高效、灵活模板渲染解决方案。
栋科技漏洞库关注到Jinjava存在一个通过基于JavaType的反序列化绕过沙盒漏洞,漏洞被追踪为CVE-2025-59340,CVSS 3.X评分为6.7。
二、漏洞分析
CVE-2025-59340漏洞位于Jinjava v2.8.1之前版本,虽然当前沙盒限制阻止对getClass()等危险方法的直接访问,阻止Class对象的实例化。
但通过使用mapper.getTypeFactory().constructFromCanonical(),可指导底层的ObjectMapper,将攻击者控制的输入反序列化为任意类。
因此,攻击者可以通过上述措施,绕过阻止对象实例化保护,使得创建半任意类实例成为可能,而无需直接调用受限制的方法或类字面量。
因此,攻击者可以逃离沙箱并实例化诸如java.net.URL之类的类,从而就能够实现访问本地文件和URL的能力(例如,file:///etc/passwd)。
通过进一步的链接,这种原始功能可能会导致远程代码执行(RCE),此漏洞已在版本2.8.1中得到修复。
具体来说,jinjava模板公开了一个内置变量__int3rpr3r___,它提供了对jinjavaInterpreter实例的直接访问。
此变量以前被滥用,并添加了保护措施以防止JinjavaInterpreter实例调用方法(请参阅将解释器添加到黑名单)。
然而,与JinjavaInterpreter实例的属性交互仍然不受限制。
从__int3rpr3t3r___可以遍历到config字段,该字段公开了一个ObjectMapper。
通过在此ObjectMapper上调用readValue(String content,JavaType valueType),攻击者可以实例化通过JavaType指定的任意类。
尽管jinjava在JinjavaBeanELResolver中明确限制了Class、ClassLoader等危险类,但JavaType类本身并不受限制。
因此,攻击者可以利用JavaType构造(constructFromCanonical)实例化半任意类,而无需直接调用受限方法。
三、影响范围
Jinjava < v2.8.1
四、修复建议
Jinjava >= v2.8.1
五、参考链接
