flawopen.com/Vulnerabilities/Server-Side Template Injection (SSTI)
Server-Side Template Injection (SSTI): कारण और समाधान
ऐसी कंपनी की कल्पना करें जो “नमस्ते, {{ name }}” वाले तय पत्र छापती है। सुरक्षित तरीके में प्रिंटर को स्थिर template और ग्राहक का नाम डेटा के रूप में अलग-अलग मिलता है। असुरक्षित तरीके में छापने से पहले ग्राहक का पाठ template निर्देशों में जोड़ दिया जाता है। यदि engine उस पाठ को template syntax समझे, तो Server-Side Template Injection होता है। प्रभाव engine, configuration, उपलब्ध objects और process privileges पर निर्भर करता है; expression का मूल्यांकन अपने आप OS command चलने का प्रमाण नहीं है।
मुख्य अवधारणाएँ और subsystem शब्द
- Template engine
- Jinja या Twig जैसा server-side घटक जो template syntax parse कर, template और context data से output बनाता है।
- Template-source injection
- दोष जिसमें बाहरी text parsing से पहले template source में जुड़ जाता है और data के बजाय syntax माना जाता है।
- Context data
- विश्वसनीय fixed template को अलग से दिए गए values। सही अलगाव
{{ 7 * 7 }}जैसे value को source की तरह फिर से parse होने से रोकता है। - CWE-1336
- Template engine में विशेष elements का अनुचित neutralization। यह बाहरी input को template syntax के रूप में असुरक्षित ढंग से process करने का वर्णन करता है।
चरण-दर-चरण हमले का प्रवाह
हमलावर का input template sink तक पहुँचता है
Form field, stored profile value या अन्य बाहरी string ऐसे code तक पहुँचती है जो template बनाता या compile करता है। दोष source बनाने में है, किसी value को सामान्य रूप से render करने में नहीं।
ऐप data और template निर्देश मिलाता है
ऐप untrusted string को template source में interpolate करता है (जैसे f-string को render_template_string देना) और static template तथा अलग context value इस्तेमाल नहीं करता।
Engine संयुक्त source को parse करता है
Engine अपनी भाषा और configuration के अनुसार expression समझता है। हानिरहित arithmetic expression evaluation दिखा सकता है; इससे file, secret या system command तक पहुँच सिद्ध नहीं होती।
प्रभाव engine और deployment पर निर्भर है
आगे का असर उपलब्ध objects/functions, sandbox, engine प्रतिबंध और web process privileges पर निर्भर है। कुछ configurations में RCE संभव है, लेकिन हर SSTI का स्वचालित परिणाम नहीं।
तंत्र और मूल कारण
SSTI तब होता है जब application बाहरी input से प्रभावित text को parsing से पहले template program का हिस्सा बनने देती है। Flask/Jinja में vulnerable pattern request data से नया source string बनाकर render_template_string() को देना है; HTML escaping output context की रक्षा करता है, पर untrusted template source को data नहीं बनाता। सुधार है fixed template load करना और value को अलग context में देना। यदि users को templates लिखने देना जरूरी हो, तो न्यूनतम data model दें और resource limits वाले isolated worker में render करें। Sandbox अतिरिक्त सुरक्षा है, secrets या शक्तिशाली application objects खोलने का कारण नहीं।
# VULNERABLE: request data becomes template source before parsing.
from flask import Flask, request, render_template_string
app = Flask(__name__)
@app.route("/greet")
def greet():
name = request.args.get("name", "Guest")
# A value such as {{ 7 * 7 }} is interpreted by the template engine.
source = f"<h1>Welcome, {name}!</h1>"
return render_template_string(source)
# HARDENED: fixed template source; request data stays a context value.
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route("/greet")
def greet():
name = request.args.get("name", "Guest")
return render_template("greet.html", name=name)
# templates/greet.html is trusted, static source:
# <h1>Welcome, {{ name }}!</h1>
हमले का क्रम और वैचारिक उदाहरण
- 1स्रोत: बाहरी input से प्रभावित value template बनाने वाले path तक पहुँचती है।
- 2असुरक्षित संयोजन: ऐप value को अलग context data की तरह देने के बजाय template source में डालता है।
- 3व्याख्या: Engine संयुक्त source parse करता है। अधिकृत test environment में हानिरहित arithmetic expression evaluation की पुष्टि कर सकता है।
- 4सशर्त प्रभाव: आगे की पहुँच engine, exposed objects, configuration और process privileges पर निर्भर है; केवल expression evaluation से RCE न मानें।
इंजीनियरिंग सुरक्षा और रोकथाम नियम
- ✓Source स्थिर रखें: Trusted templates को files या controlled loader से लोड करें; user input केवल context value के रूप में दें। Request data को source में concatenate न करें।
- ✓SSTI और HTML injection में अंतर रखें: HTML escaping output contexts की रक्षा करता है; यह उस flow को ठीक नहीं करता जहाँ untrusted input template source की तरह parse हो।
- ✓User-authored templates सीमित करें: यदि यह feature जरूरी है, तो engine के sandbox को इस उपयोग के लिए अपनाएँ, न्यूनतम data model दें, और resource-limited isolated worker में render करें। Engine की सुरक्षा सलाह मानें।
- ✓प्रभाव सीमित करें: Renderer को non-root service के रूप में चलाएँ और files, network तथा secrets तक न्यूनतम पहुँच दें। यह containment है, मुख्य fix नहीं।
- ✓Regression tests जोड़ें:
{{ 7 * 7 }}जैसा हानिरहित marker data के रूप में दें और पुष्टि करें कि वह data ही रहे; यह भी जाँचें कि templates केवल trusted loader से आते हैं।