flawopen.com/SSTI/FreeMarker और Velocity
क्या FreeMarker और Velocity टेम्पलेट उपयोगकर्ता इनपुट के साथ सुरक्षित हैं?
विश्वसनीय टेम्पलेट में डाले गए उपयोगकर्ता मान डेटा ही रहते हैं। उपयोगकर्ता-नियंत्रित टेम्पलेट स्रोत अलग है: इससे टेम्पलेट भाषा में expressions लिखे जा सकते हैं। उपलब्ध क्षमताएँ संस्करण, wrapper या introspector, model objects और ऐप की अनुमतियों पर निर्भर करती हैं। यह न मानें कि हर template injection ऑपरेटिंग सिस्टम कमांड चलाएगा; अविश्वसनीय टेम्पलेट स्रोत को executable logic मानें और उसे ऐप प्रक्रिया से बाहर render करें।
// जोखिम: request data को template source की तरह parse करना String src = "Hello " + userSuppliedName; Template t = new Template("t", src, cfg); t.process(model, writer); // जोखिम: user-controlled VTL string evaluate करना Velocity.evaluate(context, writer, "log", userTemplate);
// विश्वसनीय classpath template; model में केवल scalar मान Configuration cfg = new Configuration( Configuration.VERSION_2_3_34); cfg.setTemplateLoader(new ClassTemplateLoader( App.class, "/templates")); cfg.setNewBuiltinClassResolver( TemplateClassResolver.ALLOWS_NOTHING_RESOLVER); cfg.setObjectWrapper(new SimpleObjectWrapper( Configuration.VERSION_2_3_34)); Template t = cfg.getTemplate("hello.ftl"); Map<String,Object> model = Map.of( "name", userSuppliedName); t.process(model, writer); // Velocity: विश्वसनीय template और सीमित introspection (defense in depth) Properties p = new Properties(); p.setProperty("resource.loaders", "class"); p.setProperty("resource.loader.class.class", ClasspathResourceLoader.class.getName()); p.setProperty("runtime.introspector.uberspect", SecureUberspector.class.getName()); VelocityEngine engine = new VelocityEngine(); engine.init(p); Template vt = engine.getTemplate("hello.vm", "UTF-8"); VelocityContext vc = new VelocityContext(); vc.put("name", userSuppliedName); vt.merge(vc, writer);
Java इंजन खतरनाक क्षमताएँ क्यों उजागर कर सकते हैं
टेम्पलेट data model पर expressions चलाते हैं, लेकिन उपलब्ध Java सतह configuration पर निर्भर है। FreeMarker का default wrapper मनमाने POJO की JavaBean properties और methods उजागर कर सकता है; उपलब्ध members wrapper और access policy पर निर्भर हैं। Velocity का default Uberspect VTL properties को public Java methods से जोड़ता है। इसका अर्थ यह नहीं कि हर model में unrestricted reflection है: service objects, class loaders, request objects या अन्य शक्तिशाली क्षमताएँ model में हों तो जोखिम बढ़ता है। String maps और सरल मान दें, और हर trusted template को केवल आवश्यक fields दिखाएँ।
FreeMarker का built-in ?new, TemplateModel लागू करने वाली classes को instantiate कर सकता है। Apache uploaded templates के लिए class resolution सीमित करने की सलाह देता है; SAFER_RESOLVER कुछ classes की अनुमति देता है, जबकि ALLOWS_NOTHING_RESOLVER सभी resolution रोकता है। यह restricted wrapper और न्यूनतम data model का विकल्प नहीं है।
जोखिम घटाएँ और सीमाएँ समझें
- ✓FreeMarker: अविश्वसनीय templates के लिए
new_builtin_class_resolverकोALLOWS_NOTHING_RESOLVERपर रखें औरSimpleObjectWrapperजैसा wrapper उपयोग करें जो मनमाने POJO अस्वीकार करे। केवल उद्देश्य-विशिष्ट सरल मान दें। - ✓Velocity: अविश्वसनीय templates पर
SecureUberspectorउपयोग करें और context में केवल आवश्यक सरल मान रखें। यह दस्तावेज़ित reflection तथा object-creation मार्ग रोकता है; यह OS sandbox नहीं है। - ✓दोनों: एप्लिकेशन templates को भरोसेमंद और tamper-protected स्रोत से लोड करें। Request parameters या उपयोगकर्ता द्वारा बदली जा सकने वाली database rows को template source न बनाएँ।
- ✓यदि user-authored templates उत्पाद की जरूरत हैं: उन्हें न्यूनतम-अधिकार वाली अलग प्रक्रिया में render करें, जिसमें network, secrets या ऐप की writable files न हों; इंजन के बाहर CPU, memory और समय सीमित करें।
इंजन प्रतिबंधों को defense-in-depth मानें, process isolation नहीं। समर्थित versions चलाएँ, वर्तमान आधिकारिक मार्गदर्शन के अनुसार config जाँचें, और renderer से secrets व privileged objects दूर रखें।
अक्सर पूछे जाने वाले प्रश्न
यह संबंधित लेकिन अलग जोखिम है। उपयोगकर्ता-नियंत्रित view name अपने-आप expression injection नहीं बनता। Thymeleaf या Spring Expression Language evaluation तक वास्तविक data flow जाँचें और अविश्वसनीय input से expression fragments न बनाएँ। Integrations अपडेट रखें और trusted app logic से views चुनें।
Template लेखक engine और data model द्वारा उजागर क्षमताएँ इस्तेमाल कर सकते हैं; इसका अर्थ हमेशा OS command execution नहीं होता। Template edit permission को संवेदनशील code-authoring privilege मानें, इसे trusted maintainers तक सीमित रखें और बदलावों का audit करें।
Mustache जैसा logic-less engine expressions और method calls की सतह घटा सकता है, लेकिन output encoding, template source control और helpers की क्षमताएँ भी महत्वपूर्ण हैं। इस trust model के लिए बना engine चुनें और rendering isolate करें; सामान्य JVM engine को sandbox न मानें।
आधिकारिक स्रोत और संदर्भ
- Apache FreeMarker — uploaded template सुरक्षा FAQ
- Apache FreeMarker — SimpleObjectWrapper API
- Apache FreeMarker — TemplateClassResolver API
- Apache Velocity — developer guide
- Apache Velocity 2.3 — ClasspathResourceLoader API
- PortSwigger — Server-Side Template Injection
- CWE-1336 — Server-Side Template Injection