GitHub Advisoryadvisory · Maven
GHSA-m49c-g9wr-hv6v jinjava has Sandbox Bypass via JavaType-Based Deserialization
CRITICAL
Official page ↗
- Aliases
- CVE-2025-59340
- Ecosystem
- Maven
- Packages
- com.hubspot.jinjava:jinjava
- Severity
- Critical
- CVSS vector
- CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
- Weaknesses
- CWE-1336
- Reviewed
- 2025-09-17
Affected packages
• Maven com.hubspot.jinjava:jinjava: >= 2.8.0, < 2.8.1 → fixed in 2.8.1
• Maven com.hubspot.jinjava:jinjava: >= 2.7.0, < 2.7.5 → fixed in 2.7.5
Description
Summary
jinjava’s current sandbox restrictions prevent direct access to dangerous methods such as `getClass()`, and block instantiation of Class objects. However, these protections can be bypassed.
By using mapper.getTypeFactory().constructFromCanonical(), it is possible to instruct the underlying ObjectMapper to deserialize attacker-controlled input into arbitrary classes. This enables the creation of semi-arbitrary class instances without directly invoking restricted methods or class literals.
As a result, an attacker can escape the sandbox and instantiate classes such as java.net.URL, opening up the ability to access local files and URLs(e.g., file:///etc/passwd). With further chaining, this primitive can potentially lead to remote code execution (RCE).
Details
jinjava templates expose a built-in variable `____int3rpr3t3r____`, which provides direct access to the jinjavaInterpreter instance.
This variable was previously abused and protections were added to prevent call method from `JinjavaInterpreter` instances (see Add interpreter to blacklist).
However, interacting with the properties of `JinjavaInterpreter` instances remains unrestricted.
From `____int3rpr3t3r____`, it is possible to traverse to the `config` field, which exposes an ObjectMapper. By invoking `readValue(String content, JavaType valueType)` on this ObjectMapper, an attacker can instantiate arbitrary classes specified via `JavaType`.
Although jinjava explicitly restricts dangerous classes such as `Class`, `ClassLoader`, and so on inside `JinjavaBeanELResolver`, the `JavaType` class itself is not restricted.
As a result, an attacker can leverage `JavaType` construction (`constructFromCanonical`) to instantiate semi-arbitrary classes without directly calling restricted methods.
This allows sandbox escape and the creation of powerful primitives.
Impact
Escape the Jinjava sandbox and instantiate a wide range of classes using JavaType.
This capability can be used to read arbitrary files and to perform full read SSRF by creating network-related objects.
In certain environments, depending on the available classes, this primitive can even lead to complete remote code execution.
Related
Alias · CVE (1)
- CVE-2025-59340 jinjava is a Java-based template engine based on django template syntax, adapted to render jinja templates. vulnerability
Weakness · CWE (1)
- CWE-1336 Improper Neutralization of Special Elements Used in a Template Engine weakness
References
- https://github.com/HubSpot/jinjava/security/advisories/GHSA-m49c-g9wr-hv6v web
- https://nvd.nist.gov/vuln/detail/CVE-2025-59340 advisory
- https://github.com/github/advisory-database/pull/8141 web
- https://github.com/HubSpot/jinjava/commit/66df351e7e8ad71ca04dcacb4b65782af820b8b1 web
- https://github.com/HubSpot/jinjava package
- https://github.com/HubSpot/jinjava/releases/tag/jinjava-2.7.5 web
- https://github.com/HubSpot/jinjava/releases/tag/jinjava-2.8.1 web