
json-sanitizer के साथ CVE-2020-13973
JSON जैसी सामग्री दिए जाने पर, JSON Sanitizer इसे वैध JSON में परिवर्तित करता है।
इसे डेटा-पाइपलाइन के किसी भी छोर पर जोड़ा जा सकता है ताकि Postel के सिद्धांत को संतुष्ट करने में मदद मिल सके:
जो आप करते हैं उसमें रूढ़िवादी रहें, जो आप दूसरों से स्वीकार करते हैं उसमें उदार रहें
दूसरों से JSON जैसी सामग्री पर लागू करने पर, यह सुव्यवस्थित JSON उत्पन्न करेगा जो आपके द्वारा उपयोग किए जाने वाले किसी भी पार्सर को संतुष्ट करना चाहिए।
अपने आउटपुट पर भेजने से पहले लागू करने पर, यह एन्कोडिंग में छोटी-मोटी गलतियों को सुधारेगा और आपके JSON को HTML और XML में एम्बेड करना आसान बनाएगा।

कई अनुप्रयोगों के पास JSON आउटपुट उत्पन्न करने के लिए बड़ी मात्रा में कोड होता है जो तदर्थ विधियों का उपयोग करता है।
अक्सर ये आउटपुट सभी नेटवर्क पर भेजे जाने से पहले फ्रेमवर्क कोड की एक छोटी मात्रा से गुज़रते हैं। यह छोटी मात्रा का फ्रेमवर्क कोड यह सुनिश्चित करने के लिए इस लाइब्रेरी का उपयोग कर सकता है कि तदर्थ आउटपुट मानकों के अनुरूप हों और अत्यधिक शक्तिशाली डिसीरियलाइज़र जैसे जावास्क्रिप्ट के eval ऑपरेटर को पास करने के लिए सुरक्षित हों।
एप्लिकेशन में अक्सर वेब सेवा APIs भी होती हैं जो विभिन्न स्रोतों से JSON प्राप्त करती हैं। जब यह JSON तदर्थ विधियों का उपयोग करके बनाया जाता है, तो यह लाइब्रेरी इसे एक ऐसे रूप में ढाल सकती है जिसे पार्स करना आसान हो।
इस लाइब्रेरी को अनुरोधों और प्रतिक्रियाओं को भेजने और प्राप्त करने वाले कोड में हुक करके, यह लाइब्रेरी सॉफ्टवेयर आर्किटेक्ट्स को सिस्टम-व्यापी सुरक्षा और सुव्यवस्थितता गारंटी सुनिश्चित करने में मदद कर सकती है।
सैनिटाइज़र JSON जैसी सामग्री लेता है, और इसे JS eval के अनुसार व्याख्यायित करता है। विशेष रूप से, यह इन गैर-मानक निर्माणों से निपटता है।
सैनिटाइज़र लापता विराम चिह्न, अंत उद्धरण, और बेमेल या लापता बंद कोष्ठक को ठीक करता है। यदि इनपुट में केवल श्वेत-स्थान है तो वैध JSON स्ट्रिंग null प्रतिस्थापित किया जाता है।
आउटपुट RFC 4627 द्वारा परिभाषित सुव्यवस्थित JSON है। आउटपुट इन अतिरिक्त गुणों को संतुष्ट करता है:
"</script" (केस-असंवेदनशील) शामिल नहीं होगा, इसलिए इसे बिना अतिरिक्त एन्कोडिंग के HTML स्क्रिप्ट एलिमेंट के अंदर एम्बेड किया जा सकता है।"]]>" शामिल नहीं होगा, इसलिए इसे बिना अतिरिक्त एन्कोडिंग के XML CDATA सेक्शन के अंदर एम्बेड किया जा सकता है।eval बिल्टिन (कोष्ठक में लपेटे जाने के बाद) या JSON.parse द्वारा पार्स किया जा सकता है। विशेष रूप से, आउटपुट में एम्बेडेड JS न्यूलाइन (U+2028 पैराग्राफ सेपरेटर या U+2029 लाइन सेपरेटर) वाला कोई स्ट्रिंग शाब्दिक नहीं होगा।चूंकि आउटपुट सुव्यवस्थित JSON है, इसे eval को पास करने से कोई साइड-इफ़ेक्ट नहीं होगा और कोई मुक्त चर नहीं होगा, इसलिए यह न तो कोड-इंजेक्शन वेक्टर है और न ही रहस्यों के बहिर्वाह के लिए वेक्टर है।
यह लाइब्रेरी केवल यह सुनिश्चित करती है कि JSON स्ट्रिंग → जावास्क्रिप्ट ऑब्जेक्ट चरण का कोई साइड-इफ़ेक्ट न हो और कोई मुक्त चर हल न करे, और यह नियंत्रित नहीं कर सकती कि क्लाइंट-साइड कोड बाद में परिणामी जावास्क्रिप्ट ऑब्जेक्ट की व्याख्या कैसे करता है। इसलिए यदि क्लाइंट-साइड कोड पार्स किए गए डेटा के एक हिस्से को लेता है जो एक हमलावर द्वारा नियंत्रित है और इसे eval या innerHTML जैसे शक्तिशाली इंटरप्रेटर के माध्यम से वापस भेजता है, तो उस क्लाइंट-साइड कोड में अनपेक्षित साइड-इफ़ेक्ट हो सकते हैं।
var myValue = eval(sanitizedJsonString); // सुरक्षित
var myEmbeddedValue = eval(myValue.foo); // संभावित रूप से असुरक्षित
इसके अतिरिक्त, JSON को सैनिटाइज़ करना किसी एप्लिकेशन को Confused Deputy हमलों से नहीं बचा सकता
var myValue = JSON.parse(sanitizedJsonString);
addToAdminstratorsGroup(myValue.propertyFromUntrustedSource);
सैनिटाइज़ विधि इनपुट स्ट्रिंग को बिना नया बफर आवंटित किए वापस कर देगी जब इनपुट पहले से ही वैध JSON है जो उपरोक्त गुणों को संतुष्ट करता है। इस प्रकार, यदि सामान्यतः सुव्यवस्थित इनपुट पर उपयोग किया जाता है, तो इसका न्यूनतम मेमोरी ओवरहेड होता है।
सैनिटाइज़ विधि O(n) समय लेती है जहाँ n UTF-16 कोड-इकाइयों में इनपुट की लंबाई है।
| निर्माण | नीति |
|---|
'...' | एकल उद्धरण वाले स्ट्रिंग को JSON स्ट्रिंग में परिवर्तित किया जाता है। |
\xAB | हेक्स एस्केप को JSON यूनिकोड एस्केप में परिवर्तित किया जाता है। |
\012 | ऑक्टल एस्केप को JSON यूनिकोड एस्केप में परिवर्तित किया जाता है। |
0xAB | हेक्स पूर्णांक शाब्दिक को JSON दशमलव संख्याओं में परिवर्तित किया जाता है। |
012 | ऑक्टल पूर्णांक शाब्दिक को JSON दशमलव संख्याओं में परिवर्तित किया जाता है। |
+.5 | दशमलव संख्याओं को JSON के अधिक सख्त प्रारूप में बदल दिया जाता है। |
[0,,2] | सरणियों में रिक्तियां null से भर दी जाती हैं। |
[1,2,3,] | पिछले अल्पविराम हटा दिए जाते हैं। |
{foo:"bar"} | अनउद्धृत संपत्ति नाम उद्धृत किए जाते हैं। |
//comments | JS शैली की पंक्ति और ब्लॉक टिप्पणियाँ हटा दी जाती हैं। |
(...) | समूहीकरण कोष्ठक हटा दिए जाते हैं। |