Jinja has a sandbox breakout through malicious filenames
Description
Jinja is an extensible templating engine. In versions on the 3.x branch prior to 3.1.5, a bug in the Jinja compiler allows an attacker that controls both the content and filename of a template to execute arbitrary Python code, regardless of if Jinja's sandbox is used. To exploit the vulnerability, an attacker needs to control both the filename and the contents of a template. Whether that is the case depends on the type of application using Jinja. This vulnerability impacts users of applications which execute untrusted templates where the template author can also choose the template filename. This vulnerability is fixed in 3.1.5.
AI Insight
LLM-synthesized narrative grounded in this CVE's description and references.
A bug in Jinja compiler prior to 3.1.5 allows arbitrary Python code execution if attacker controls both template filename and content, bypassing sandbox.
Vulnerability
Overview A bug in the Jinja compiler (versions 3.x before 3.1.5) allows an attacker who controls both the filename and content of a template to execute arbitrary Python code. This occurs regardless of whether Jinja's sandbox is enabled, as the compiler incorrectly processes filename inputs leading to code injection [1].
Exploitation
Conditions Successful exploitation requires the attacker to have control over both the template filename and its content. The specific conditions depend on the application using Jinja—typically applications that execute untrusted templates where the template author can also choose the filename [1].
Impact
An attacker with the required access can execute arbitrary Python code on the server, leading to full compromise of the application and its data [1].
Mitigation
Users should upgrade to Jinja version 3.1.5 or later, which fixes the vulnerability. There is no known workaround for affected versions [1].
AI Insight generated on May 20, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
jinja2PyPI | >= 3.0.0, < 3.1.5 | 3.1.5 |
Affected products
144- osv-coords142 versionspkg:apk/chainguard/airflowpkg:apk/chainguard/airflow-bitnami-compatpkg:apk/chainguard/airflow-compatpkg:apk/chainguard/ansible-operatorpkg:apk/chainguard/ansible-operator-compatpkg:apk/chainguard/apache-beam-python-3.11-sdkpkg:apk/chainguard/checkovpkg:apk/chainguard/dask-gatewaypkg:apk/chainguard/dask-gateway-serverpkg:apk/chainguard/emissarypkg:apk/chainguard/emissary-apiextpkg:apk/chainguard/emissary-oci-entrypointpkg:apk/chainguard/kservepkg:apk/chainguard/kserve-agentpkg:apk/chainguard/kserve-agent-compatpkg:apk/chainguard/kserve-managerpkg:apk/chainguard/kserve-manager-compatpkg:apk/chainguard/kserve-qpextpkg:apk/chainguard/kserve-qpext-compatpkg:apk/chainguard/kserve-routerpkg:apk/chainguard/kserve-router-compatpkg:apk/chainguard/kserve-storage-controllerpkg:apk/chainguard/kubeflow-jupyter-web-apppkg:apk/chainguard/kubeflow-pipelines-visualization-serverpkg:apk/chainguard/kubeflow-volumes-web-apppkg:apk/chainguard/localstackpkg:apk/chainguard/localstack-compatpkg:apk/chainguard/mlflowpkg:apk/chainguard/mlflow-bitnamipkg:apk/chainguard/mlflow-iamguarded-compatpkg:apk/chainguard/nemopkg:apk/chainguard/nvidia-apex-12.3pkg:apk/chainguard/nvidia-apex-12.3-wheelpkg:apk/chainguard/py3.10-ambassadorpkg:apk/chainguard/py3.10-jinja2pkg:apk/chainguard/py3.10-torchvision-cuda-11.8pkg:apk/chainguard/py3.10-torchvision-cuda-12.3pkg:apk/chainguard/py3.10-vllm-cuda-11.8pkg:apk/chainguard/py3.10-vllm-cuda-12.6pkg:apk/chainguard/py3.10-wheels-torchvision-cuda-11.8pkg:apk/chainguard/py3.10-wheels-torchvision-cuda-12.3pkg:apk/chainguard/py3.10-wheels-vllm-cuda-11.8pkg:apk/chainguard/py3.11-ambassadorpkg:apk/chainguard/py3.11-jinja2pkg:apk/chainguard/py3.11-torchaudio-cuda-12.3pkg:apk/chainguard/py3.11-torchvision-cuda-11.8pkg:apk/chainguard/py3.11-torchvision-cuda-12.3pkg:apk/chainguard/py3.11-wheels-torchaudio-cuda-12.3pkg:apk/chainguard/py3.11-wheels-torchvision-cuda-11.8pkg:apk/chainguard/py3.11-wheels-torchvision-cuda-12.3pkg:apk/chainguard/py3.12-ambassadorpkg:apk/chainguard/py3.12-jinja2pkg:apk/chainguard/py3.12-torchvision-cuda-12.3pkg:apk/chainguard/py3.12-wheels-torchvision-cuda-11.8pkg:apk/chainguard/py3.12-wheels-torchvision-cuda-12.3pkg:apk/chainguard/py3.13-ambassadorpkg:apk/chainguard/py3.13-jinja2pkg:apk/chainguard/py3.8-torchvision-cuda-11.8pkg:apk/chainguard/py3.8-wheels-torchvision-cuda-11.8pkg:apk/chainguard/py3.9-torchvision-cuda-11.8pkg:apk/chainguard/py3.9-torchvision-cuda-12.3pkg:apk/chainguard/py3.9-wheels-torchvision-cuda-11.8pkg:apk/chainguard/py3.9-wheels-torchvision-cuda-12.3pkg:apk/chainguard/py3-jinja2pkg:apk/chainguard/py3-supported-jinja2pkg:apk/chainguard/reflexpkg:apk/chainguard/supersetpkg:apk/chainguard/superset-cipkg:apk/chainguard/superset-entrypointpkg:apk/chainguard/superset-iamguarded-compatpkg:apk/wolfi/airflowpkg:apk/wolfi/airflow-bitnami-compatpkg:apk/wolfi/airflow-compatpkg:apk/wolfi/ansible-operatorpkg:apk/wolfi/ansible-operator-compatpkg:apk/wolfi/checkovpkg:apk/wolfi/dask-gatewaypkg:apk/wolfi/dask-gateway-serverpkg:apk/wolfi/emissarypkg:apk/wolfi/emissary-apiextpkg:apk/wolfi/emissary-oci-entrypointpkg:apk/wolfi/kservepkg:apk/wolfi/kserve-agentpkg:apk/wolfi/kserve-agent-compatpkg:apk/wolfi/kserve-managerpkg:apk/wolfi/kserve-manager-compatpkg:apk/wolfi/kserve-qpextpkg:apk/wolfi/kserve-qpext-compatpkg:apk/wolfi/kserve-routerpkg:apk/wolfi/kserve-router-compatpkg:apk/wolfi/kserve-storage-controllerpkg:apk/wolfi/kubeflow-jupyter-web-apppkg:apk/wolfi/kubeflow-pipelines-visualization-serverpkg:apk/wolfi/kubeflow-volumes-web-apppkg:apk/wolfi/mlflowpkg:apk/wolfi/mlflow-bitnamipkg:apk/wolfi/mlflow-iamguarded-compatpkg:apk/wolfi/py3.10-ambassadorpkg:apk/wolfi/py3.10-jinja2pkg:apk/wolfi/py3.11-ambassadorpkg:apk/wolfi/py3.11-jinja2pkg:apk/wolfi/py3.12-ambassadorpkg:apk/wolfi/py3.12-jinja2pkg:apk/wolfi/py3.13-ambassadorpkg:apk/wolfi/py3.13-jinja2pkg:apk/wolfi/py3-jinja2pkg:apk/wolfi/py3-supported-jinja2pkg:apk/wolfi/reflexpkg:apk/wolfi/supersetpkg:apk/wolfi/superset-cipkg:apk/wolfi/superset-entrypointpkg:apk/wolfi/superset-iamguarded-compatpkg:pypi/jinja2pkg:rpm/almalinux/fence-agents-commonpkg:rpm/almalinux/fence-agents-computepkg:rpm/almalinux/fence-agents-ibm-powervspkg:rpm/almalinux/fence-agents-ibm-vpcpkg:rpm/almalinux/fence-agents-kubevirtpkg:rpm/almalinux/fence-agents-virshpkg:rpm/almalinux/fence-virtpkg:rpm/almalinux/fence-virtdpkg:rpm/almalinux/fence-virtd-cpgpkg:rpm/almalinux/fence-virtd-libvirtpkg:rpm/almalinux/fence-virtd-multicastpkg:rpm/almalinux/fence-virtd-serialpkg:rpm/almalinux/fence-virtd-tcppkg:rpm/opensuse/oci-cli&distro=openSUSE%20Tumbleweedpkg:rpm/opensuse/python-Jinja2&distro=openSUSE%20Leap%2015.5pkg:rpm/opensuse/python-Jinja2&distro=openSUSE%20Leap%2015.6pkg:rpm/rocky-linux/fence-agents?distro=rocky-linux-9&epoch=0pkg:rpm/suse/python-Jinja2&distro=SUSE%20Linux%20Enterprise%20High%20Performance%20Computing%2015%20SP4-ESPOSpkg:rpm/suse/python-Jinja2&distro=SUSE%20Linux%20Enterprise%20High%20Performance%20Computing%2015%20SP4-LTSSpkg:rpm/suse/python-Jinja2&distro=SUSE%20Linux%20Enterprise%20High%20Performance%20Computing%2015%20SP5-ESPOSpkg:rpm/suse/python-Jinja2&distro=SUSE%20Linux%20Enterprise%20High%20Performance%20Computing%2015%20SP5-LTSSpkg:rpm/suse/python-Jinja2&distro=SUSE%20Linux%20Enterprise%20Module%20for%20Public%20Cloud%2015%20SP4pkg:rpm/suse/python-Jinja2&distro=SUSE%20Linux%20Enterprise%20Module%20for%20Python%203%2015%20SP6pkg:rpm/suse/python-Jinja2&distro=SUSE%20Linux%20Enterprise%20Server%2015%20SP4-LTSSpkg:rpm/suse/python-Jinja2&distro=SUSE%20Linux%20Enterprise%20Server%2015%20SP5-LTSSpkg:rpm/suse/python-Jinja2&distro=SUSE%20Linux%20Enterprise%20Server%20for%20SAP%20Applications%2015%20SP4pkg:rpm/suse/python-Jinja2&distro=SUSE%20Linux%20Enterprise%20Server%20for%20SAP%20Applications%2015%20SP5pkg:rpm/suse/python-Jinja2&distro=SUSE%20Linux%20Micro%206.0pkg:rpm/suse/python-Jinja2&distro=SUSE%20Linux%20Micro%206.1
< 2.10.4-r2+ 141 more
- (no CPE)range: < 2.10.4-r2
- (no CPE)range: < 2.10.4-r2
- (no CPE)range: < 2.10.4-r2
- (no CPE)range: < 1.37.1-r0
- (no CPE)range: < 1.37.1-r0
- (no CPE)range: < 2.61.0-r1
- (no CPE)range: < 3.2.432-r0
- (no CPE)range: < 2024.1.0-r13
- (no CPE)range: < 2024.1.0-r13
- (no CPE)range: < 3.9.1-r8
- (no CPE)range: < 3.9.1-r8
- (no CPE)range: < 3.9.1-r8
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 1.9.2-r3
- (no CPE)range: < 2.14.3-r2
- (no CPE)range: < 1.9.2-r3
- (no CPE)range: < 4.1.0-r0
- (no CPE)range: < 4.1.0-r0
- (no CPE)range: < 2.19.0-r2
- (no CPE)range: < 2.19.0-r2
- (no CPE)range: < 2.19.0-r2
- (no CPE)range: < 1.23.0-r6
- (no CPE)range: < 24.04.01-r1
- (no CPE)range: < 24.04.01-r1
- (no CPE)range: < 3.9.1-r8
- (no CPE)range: < 3.1.5-r0
- (no CPE)range: < 0.18.1-r2
- (no CPE)range: < 0.18.1-r3
- (no CPE)range: < 0.6.6-r0
- (no CPE)range: < 0.6.6-r0
- (no CPE)range: < 0.18.1-r2
- (no CPE)range: < 0.18.1-r3
- (no CPE)range: < 0.6.6-r0
- (no CPE)range: < 3.9.1-r8
- (no CPE)range: < 3.1.5-r0
- (no CPE)range: < 2.3.1-r1
- (no CPE)range: < 0.18.1-r2
- (no CPE)range: < 0.18.1-r3
- (no CPE)range: < 2.3.1-r1
- (no CPE)range: < 0.18.1-r2
- (no CPE)range: < 0.18.1-r3
- (no CPE)range: < 3.9.1-r8
- (no CPE)range: < 3.1.5-r0
- (no CPE)range: < 0.18.1-r2
- (no CPE)range: < 0.18.1-r2
- (no CPE)range: < 0.18.1-r2
- (no CPE)range: < 3.9.1-r8
- (no CPE)range: < 3.1.5-r0
- (no CPE)range: < 0.18.1-r1
- (no CPE)range: < 0.18.1-r1
- (no CPE)range: < 0.18.1-r1
- (no CPE)range: < 0.18.1-r1
- (no CPE)range: < 0.18.1-r1
- (no CPE)range: < 0.18.1-r1
- (no CPE)range: < 3.1.5-r0
- (no CPE)range: < 3.1.5-r0
- (no CPE)range: < 0.6.7-r0
- (no CPE)range: < 4.1.1-r1
- (no CPE)range: < 4.1.1-r1
- (no CPE)range: < 4.1.1-r1
- (no CPE)range: < 4.1.1-r1
- (no CPE)range: < 2.10.4-r2
- (no CPE)range: < 2.10.4-r2
- (no CPE)range: < 2.10.4-r2
- (no CPE)range: < 1.37.1-r0
- (no CPE)range: < 1.37.1-r0
- (no CPE)range: < 3.2.432-r0
- (no CPE)range: < 2024.1.0-r13
- (no CPE)range: < 2024.1.0-r13
- (no CPE)range: < 3.9.1-r8
- (no CPE)range: < 3.9.1-r8
- (no CPE)range: < 3.9.1-r8
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 0.14.1-r0
- (no CPE)range: < 1.9.2-r3
- (no CPE)range: < 2.14.3-r2
- (no CPE)range: < 1.9.2-r3
- (no CPE)range: < 2.19.0-r2
- (no CPE)range: < 2.19.0-r2
- (no CPE)range: < 2.19.0-r2
- (no CPE)range: < 3.9.1-r8
- (no CPE)range: < 3.1.5-r0
- (no CPE)range: < 3.9.1-r8
- (no CPE)range: < 3.1.5-r0
- (no CPE)range: < 3.9.1-r8
- (no CPE)range: < 3.1.5-r0
- (no CPE)range: < 3.9.1-r8
- (no CPE)range: < 3.1.5-r0
- (no CPE)range: < 3.1.5-r0
- (no CPE)range: < 3.1.5-r0
- (no CPE)range: < 0.6.7-r0
- (no CPE)range: < 4.1.1-r1
- (no CPE)range: < 4.1.1-r1
- (no CPE)range: < 4.1.1-r1
- (no CPE)range: < 4.1.1-r1
- (no CPE)range: >= 3.0.0, < 3.1.5
- (no CPE)range: < 4.10.0-76.el9_5.4.alma.1
- (no CPE)range: < 4.10.0-76.el9_5.4.alma.1
- (no CPE)range: < 4.10.0-76.el9_5.4.alma.1
- (no CPE)range: < 4.10.0-76.el9_5.4.alma.1
- (no CPE)range: < 4.10.0-76.el9_5.4.alma.1
- (no CPE)range: < 4.10.0-76.el9_5.4.alma.1
- (no CPE)range: < 4.10.0-76.el9_5.4.alma.1
- (no CPE)range: < 4.10.0-76.el9_5.4.alma.1
- (no CPE)range: < 4.10.0-76.el9_5.4.alma.1
- (no CPE)range: < 4.10.0-76.el9_5.4.alma.1
- (no CPE)range: < 4.10.0-76.el9_5.4.alma.1
- (no CPE)range: < 4.10.0-76.el9_5.4.alma.1
- (no CPE)range: < 4.10.0-76.el9_5.4.alma.1
- (no CPE)range: < 3.54.1-1.1
- (no CPE)range: < 3.1.2-150400.12.11.1
- (no CPE)range: < 3.1.2-150400.12.11.1
- (no CPE)range: < 0:4.10.0-76.el9_5.4
- (no CPE)range: < 3.1.2-150400.12.11.1
- (no CPE)range: < 3.1.2-150400.12.11.1
- (no CPE)range: < 3.1.2-150400.12.11.1
- (no CPE)range: < 3.1.2-150400.12.11.1
- (no CPE)range: < 3.1.2-150400.12.11.1
- (no CPE)range: < 3.1.2-150400.12.11.1
- (no CPE)range: < 3.1.2-150400.12.11.1
- (no CPE)range: < 3.1.2-150400.12.11.1
- (no CPE)range: < 3.1.2-150400.12.11.1
- (no CPE)range: < 3.1.2-150400.12.11.1
- (no CPE)range: < 3.1.2-7.1
- (no CPE)range: < 3.1.4-slfo.1.1_2.1
- pallets/jinjav5Range: >= 3.0.0, < 3.1.5
Patches
1767b23617628fix f-string syntax error in code generation (#1852)
3 files changed · +28 −1
CHANGES.rst+3 −0 modified@@ -8,6 +8,9 @@ Unreleased - The sandboxed environment handles indirect calls to ``str.format``, such as by passing a stored reference to a filter that calls its argument. :ghsa:`q2x7-8rv6-6q7h` +- Escape template name before formatting it into error messages, to avoid + issues with names that contain f-string syntax. + :issue:`1792`, :ghsa:`gmj6-6f8f-6699` - Sandbox does not allow ``clear`` and ``pop`` on known mutable sequence types. :issue:`2032` - Calling sync ``render`` for an async template uses ``asyncio.run``.
src/jinja2/compiler.py+6 −1 modified@@ -1141,9 +1141,14 @@ def visit_FromImport(self, node: nodes.FromImport, frame: Frame) -> None: ) self.writeline(f"if {frame.symbols.ref(alias)} is missing:") self.indent() + # The position will contain the template name, and will be formatted + # into a string that will be compiled into an f-string. Curly braces + # in the name must be replaced with escapes so that they will not be + # executed as part of the f-string. + position = self.position(node).replace("{", "{{").replace("}", "}}") message = ( "the template {included_template.__name__!r}" - f" (imported on {self.position(node)})" + f" (imported on {position})" f" does not export the requested name {name!r}" ) self.writeline(
tests/test_compile.py+19 −0 modified@@ -1,6 +1,9 @@ import os import re +import pytest + +from jinja2 import UndefinedError from jinja2.environment import Environment from jinja2.loaders import DictLoader @@ -87,3 +90,19 @@ def test_block_set_vars_unpacking_deterministic(tmp_path): content, )[:10] assert found == expect + + +def test_undefined_import_curly_name(): + env = Environment( + loader=DictLoader( + { + "{bad}": "{% from 'macro' import m %}{{ m() }}", + "macro": "", + } + ) + ) + + # Must not raise `NameError: 'bad' is not defined`, as that would indicate + # that `{bad}` is being interpreted as an f-string. It must be escaped. + with pytest.raises(UndefinedError): + env.get_template("{bad}").render()
Vulnerability mechanics
Generated on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
6- github.com/advisories/GHSA-gmj6-6f8f-6699ghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2024-56201ghsaADVISORY
- github.com/pallets/jinja/commit/767b23617628419ae3709ccfb02f9602ae9fe51fghsax_refsource_MISCWEB
- github.com/pallets/jinja/issues/1792ghsax_refsource_MISCWEB
- github.com/pallets/jinja/releases/tag/3.1.5ghsax_refsource_MISCWEB
- github.com/pallets/jinja/security/advisories/GHSA-gmj6-6f8f-6699ghsax_refsource_CONFIRMWEB
News mentions
0No linked articles in our index yet.