कृपया कंप्यूटर सुरक्षा लोगों के लिए अपनी भाषा को विश्लेषण योग्य / श्रव्य बनाएं।
सुरक्षा लोगों को जहाजों से पहले एक कार्यक्रम में कमजोरियों को खोजने में सक्षम होना चाहिए। आदर्श रूप से, हमें जल्दी बुलाया जाता है और कोडबेस पर टिप्पणी करता है क्योंकि यह विकसित होता है, लेकिन अक्सर नहीं।
जब भाषा या कोर पुस्तकालयों का एक नया संस्करण सामने आता है, तो जो चीज़ें पहले सुरक्षित थीं वे अब नहीं हो सकती हैं:
- पुस्तकालय और अधिक शक्तिशाली हो सकते हैं: जैसे URL लाइब्रेरी अब समर्थन करती है
javascript:
- तार या बाइट्स को कोड में बदलने के लिए नए तरीके हो सकते हैं: उदाहरण के लिए
eval
या डीरिएरलाइज़ेशन लाइब्रेरी
- भाषा प्रतिबिंब तकनीक अधिक शक्तिशाली हो सकती है: जैसे स्थानीय चर को उजागर करना
इन परिवर्तनों में से कोई भी अपमानजनक प्राधिकरण की मात्रा को बढ़ा सकता है जो एक कार्यक्रम है, लेकिन चूंकि प्राधिकरण द्वारा उपयोग किए जाने वाले प्राधिकरण की राशि का उपयोग किया जाता है (जब गैर-दुर्भावनापूर्ण ग्राहकों के साथ व्यवहार किया जाता है) नहीं बदला है, तो सुरक्षा लोक को एक गहन के बिना यह पता लगाने के लिए कठोर दबाया जाता है। फिर से लेखा परीक्षा।
तो, कृपया हमारे बारे में सोचें जब भाषा को डिजाइन और संस्करण करना। नीचे कुछ सुझाव दिए गए हैं:
कुछ आदतों को परिभाषित करें जिन्हें एक कार्यक्रम में विघटित किया जा सकता है।
HTML5 इस तरह से विशेष रूप से खराब है। उन्होंने स्पष्ट रूप से सुरक्षा में बहुत सोचा है और कुछ बहुत ही स्मार्ट लोगों को रखा है, लेकिन नए प्रोग्राम तत्वों <video>
को पुराने लोगों के संदर्भ में निर्दिष्ट करने के बजाय , या एक सामान्य अमूर्तता पैदा कर रहे हैं कि नए <video>
और पुराने <img>
दोनों के संदर्भ में निर्दिष्ट किया जा सकता है, <video>
अभी तक नहीं है अपने स्वयं के सुरक्षा परिणामों के साथ एक और एक बंद कार्यक्रम तत्व।
अपनी भाषा को स्थैतिक विश्लेषण के लिए उत्तरदायी बनाएं (भले ही वैधानिक रूप से टाइप न की गई हो)।
सुरक्षा लोक अक्सर पैटर्न का पता लगाने के लिए स्थैतिक विश्लेषण का उपयोग करते हैं, और एक कार्यक्रम के कुछ हिस्सों की कोशिश करने और शासन करने के लिए ताकि वे वास्तव में मुश्किल बिट्स पर ध्यान केंद्रित कर सकें।
यह स्पष्ट होना चाहिए कि कौन से पहचानकर्ता स्थानीय चर हैं और कौन से नहीं हैं।
उदाहरण के लिए, जावास्क्रिप्ट के पुराने संस्करणों के समान गलती न करें, जिससे यह बताना असंभव हो जाता है कि क्या x
नीचे में एक स्थानीय चर संदर्भ है (कल्पना के पुराने संस्करण के शाब्दिक पढ़ने के अनुसार):
if (Math.random() > 0.5) {
Object.prototype.x = 0;
}
function f() {
var x = 1;
(function () {
alert(x); // Might alert 0, might alert 1.
})();
}
डीकोप्रोजेबल सुरक्षा के लिए अनुमति दें
बहुत सारे सुरक्षित सिस्टम एक सुरक्षित कर्नेल के चारों ओर डिज़ाइन किए गए हैं जो सुरक्षा गुणों को संरक्षित करते हैं, ताकि सुरक्षा लोक थोड़ी मात्रा में कोड का विश्लेषण करने और अधिकांश प्रोग्रामरों को {कष्टप्रद, पांडित्यपूर्ण, विरोधाभास: सुरक्षा लोक से निपटने के लिए मुक्त कर सकें। ।
अपनी भाषा में ऐसा कर्नेल लिखना संभव होना चाहिए। यदि आपकी भाषा के सुरक्षा गुणों में से एक है, तो यह है कि केवल URL का एक निश्चित उप-समूह कभी प्राप्त किया जाएगा, क्या कर्नेल लेखक अपने कोड के माध्यम से सभी URL प्राप्त करने के लिए कुछ कर सकते हैं? या स्थिर बिल्ड चेक (जैसे आयात को देखने) एक ही कार्य कर सकते हैं।
समाचारपत्र जैसी कुछ भाषाएं एक वस्तु क्षमताओं वाले मॉडल का उपयोग करती हैं। यह कमाल है और डिकोमात्मक सुरक्षा प्राप्त करने का एक शानदार तरीका है।
लेकिन अगर आप ऐसा नहीं कर सकते हैं, तो मॉड्यूल ग्राफ को सांख्यिकीय रूप से विश्लेषण योग्य बनाने से आपको काफी लाभ मिल सकता है। अगर मैं यह साबित कर सकता हूं कि एक मॉड्यूल फ़ाइल I / O मॉड्यूल (टीसीबी में एक मॉड्यूल में कॉलिंग कोड को छोड़कर) तक नहीं पहुंच सकता है, तो मैं उस मॉड्यूल से समस्याओं के पूरे वर्गों को नियंत्रित कर सकता हूं।
एम्बेडेड स्क्रिप्टिंग भाषाओं के अधिकार को सीमित करें
बहुत सारी उपयोगी प्रणालियों को एक स्थिर कोर के रूप में व्यवस्थित किया जाता है जो गतिशील (यहां तक कि कार्यात्मक) भाषाओं में लिखे गए बहुत सारे कोड को मारता है।
और स्क्रिप्टिंग भाषाओं को एम्बेड करना एक प्रणाली को और अधिक एक्स्टेंसिबल बना सकता है।
लेकिन एक स्क्रिप्टिंग भाषा में VM का पूर्ण अधिकार नहीं होना चाहिए।
यदि आप एम्बेडेड स्क्रिप्टिंग भाषाओं की अनुमति देना चुनते हैं, तो इनवोकरों के लिए यह सीमित करना आसान है कि वे क्या कर सकते हैं। एक वस्तु-क्षमता मॉडल (ऊपर समाचार पत्र पर टिप्पणी देखें) यहां बहुत उपयुक्त है; इसलिए जब किसी स्क्रिप्टिंग भाषा में कोड का मूल्यांकन किया जाता है, तो कॉल करने वाले को उस कोड के निष्पादन के लिए और सभी वैश्विक चर को कोड में पास करना चाहिए ।
eval
एक स्क्रिप्टिंग भाषा के रूप में खुद को एम्बेड करने वाली भाषा के रूप में व्यवहार करें
यदि आपकी भाषा अपने स्वयं के संकलक को कोड में स्ट्रिंग बदलने के लिए आमंत्रित कर सकती है, तो इसे सैंडबॉक्स करने की अनुमति दें जैसा कि आप किसी भी एम्बेडेड स्क्रिप्टिंग भाषा में करेंगे।
एक सरल संगामिति मॉडल का उपयोग करें
जब कोई सुरक्षा संपत्ति बनी रहती है तो हम यह जानने की कोशिश करते हैं कि दौड़ की स्थितियों के बारे में चिंता करने के लिए हम सुरक्षा लोगों को पसंद नहीं करते।
कृपया थ्रेड पर बसने से पहले लगभग असंभव-से-सुरक्षित डिफ़ॉल्ट विकल्प के रूप में थ्रेडिंग के विकल्पों पर विचार करें।
ई।, वेरिलॉग और जावास्क्रिप्ट में पाया गया है कि एक साधारण एक घटना लूप कंसर्ट है।
भ्रम की स्थिति को प्रोत्साहित न करें
कुछ भाषाएँ गोंद भाषाएँ हैं, और वे बहुत से अलग-अलग भाषाओं में तार के साथ काम करती हैं।
उदाहरण के लिए, जावास्क्रिप्ट अक्सर HTML, CSS, XML, JSON और यहां तक कि जावास्क्रिप्ट के तार भी रचना करता है। प्रोग्रामर के लिए यह याद रखना बहुत मुश्किल है कि जब वे अन्य भाषाओं में तार बनाने के लिए संयोजन करते हैं, तो सादे टेक्स्ट स्ट्रिंग्स को अच्छी तरह से एनकोड करें, इसलिए जेएस प्रोग्राम, अनजाने में, भ्रम की समस्याओं के सभी प्रकार के उद्धरण हैं: XSS सबसे खराब।
यदि आप स्ट्रिंग संरचना सुविधाओं को शामिल करना चाहते हैं , तो प्रोग्रामर के सुरक्षा बोझ को कम करने का प्रयास करें। डीएसएल, हाइजीनिक मैक्रोज़, और एम्बेडेड टेम्प्लेटिंग लैंग्वेज, लाइब्रेरी या लैंग्वेज डेवलपर्स पर सही तरीके से भागने और एंड-डेवलपर से दूर जाने के लिए बोझ उठाकर ऐसा करने का एक शानदार तरीका हो सकता है।