अमेरिकी सरकार सुरक्षित परियोजनाओं के लिए गतिशील भाषाओं को अस्वीकार क्यों करती है?


120

मैं कुछ लोगों को जानता हूं जो वर्तमान में अमेरिकी सेना (कम सुरक्षा स्तर, गैर-मुकाबला मानव संसाधन प्रकार डेटा) के लिए एक परियोजना पर काम कर रहे हैं।

परियोजना कोड की एक प्रारंभिक स्थिति की समीक्षा के लिए सेना को प्रस्तुत किया गया था, और उन्होंने किसी प्रकार के सुरक्षा विश्लेषक उपकरण के माध्यम से कार्यक्रम चलाया। इसने कोड में ज्ञात सुरक्षा मुद्दों की रिपोर्ट लौटा दी और अंतिम उत्पाद के वितरण से पहले आवश्यक परिवर्तनों को लागू किया।

जिन वस्तुओं को हल करने की आवश्यकता है, उनमें से एक परियोजना का हिस्सा हटा दिया गया था जिसे रूबी में लिखा गया था क्योंकि यह एक गतिशील भाषा है।

एक सुरक्षित सेटिंग में गतिशील भाषा का उपयोग न करने की पृष्ठभूमि / कारण क्या है? क्या सरकार नई तकनीकों को अपनाने के लिए धीमी है? या डायनेमिक भाषाएं स्थिर भाषाओं (ala C ++ या Java ) की तुलना में एक अतिरिक्त सुरक्षा जोखिम पैदा करती हैं ?


56
केवल यह सुनिश्चित करने का तरीका है कि आपके परिचित अपने नियोक्ता से इसका कारण पूछें। लेकिन मैं एक अनुमान लगा सकता हूं: स्थैतिक प्रकार की जाँच एक और परत है जो मिशन-महत्वपूर्ण सॉफ़्टवेयर की शुद्धता में मदद करती है। यह निश्चित रूप से बग से छुटकारा नहीं दिलाएगा, लेकिन यह सही दिशा में एक कदम है: कंप्यूटर आपके लिए कुछ काम कर रहा है। (हां, मुझे पता है कि यह पवित्र युद्ध क्षेत्र है)।
एंड्रेस एफ।


75
आप PHP + जावास्क्रिप्ट में मिसाइल नियंत्रण सॉफ्टवेयर रिटेन नहीं चाहते हैं।
ट्यूलेंस कोर्डोवा

16
मानव संसाधन डेटा है नहीं "कम सुरक्षा स्तर"। मुझे उम्मीद है कि एक कंपनी मेरे रोजगार और व्यक्तिगत डेटा को सुरक्षित रख सकेगी।
gbjbaanb

5
@gbjbaanb मुझे लगता है कि ओपी का मतलब है कि जीवन का नुकसान यहां सबसे खराब स्थिति नहीं है।
एंड्रेस एफ।

जवाबों:


126

कई 'स्वच्छ' चीजें हैं जो गतिशील भाषाओं में की जा सकती हैं जिन्हें कोड के कुछ हिस्सों में दूर किया जा सकता है जो किसी अन्य प्रोग्रामर या ऑडिटर को तुरंत दिए गए कोड की कार्यक्षमता के रूप में स्पष्ट नहीं हैं।

इस क्रम को आइआरबी (इंटरेक्टिव रूबी शेल) पर विचार करें:

irb(main):001:0> "bar".foo
NoMethodError: undefined method `foo' for "bar":String
        from (irb):1
        from /usr/bin/irb:12:in `<main>'
irb(main):002:0> class String
irb(main):003:1> def foo
irb(main):004:2> "foobar!"
irb(main):005:2> end
irb(main):006:1> end
=> nil
irb(main):007:0> "bar".foo
=> "foobar!"

क्या हुआ वहाँ मैं fooएक स्ट्रिंग स्थिरांक में विधि को कॉल करने की कोशिश की है । यह विफल रहा। मैंने तब स्ट्रिंग वर्ग खोला और fooओ रिटर्न करने की विधि को परिभाषित किया "foobar!", और फिर इसे कॉल किया। यह काम किया।

यह एक खुले वर्ग के रूप में जाना जाता है और मुझे हर बार बुरे सपने आते हैं, मैं माणिक में कोड लिखने के बारे में सोचता हूं जिसमें किसी भी तरह की सुरक्षा या अखंडता है। यकीन है कि यह आपको कुछ साफ-सुथरी चीजें करने में काफी तेज है ... लेकिन मैं इसे हर बार बना सकता हूं जब कोई किसी को एक स्ट्रिंग संग्रहीत करता है, तो उसने इसे एक फ़ाइल में संग्रहीत किया, या इसे नेटवर्क पर भेजा। और स्ट्रिंग को पुनर्परिभाषित करने के इस छोटे से कोड में कहीं भी टक किया जा सकता है।

कई अन्य गतिशील भाषाओं में समान चीजें हैं जो की जा सकती हैं। पर्ल के पास टाई :: स्केलर है जो पर्दे के पीछे बदल सकता है कि किसी दिए गए स्केलर कैसे काम करते हैं (यह थोड़ा अधिक स्पष्ट है और एक विशिष्ट कमांड की आवश्यकता होती है जिसे आप देख सकते हैं, लेकिन एक स्केलर जो कहीं और से पारित होता है) एक समस्या हो सकती है। यदि आपके पास पर्ल कुकबुक तक पहुंच है, तो नुस्खा 13.15 देखें - टाई के साथ मैजिक वेरिएबल्स बनाना।

इन चीजों (और अक्सर गतिशील भाषाओं का हिस्सा) के कारण, कोड में सुरक्षा के स्थैतिक विश्लेषण के कई दृष्टिकोण काम नहीं करते हैं। Perl और Undecidability इस मामले को दिखाता है और वाक्यविन्यास हाइलाइटिंग के साथ भी ऐसी तुच्छ समस्याओं को इंगित करता है ( whatever / 25 ; # / ; die "this dies!";पॉज़ चुनौतियां क्योंकि whateverइसे तर्क को लेने के लिए परिभाषित किया जा सकता है या रनटाइम को पूरी तरह से सिंटैक्स हाइलाइटर या स्टेटिक बीज़र को हराने के लिए नहीं )।


यह रूबी में पर्यावरण को एक्सेस करने की क्षमता के साथ और भी दिलचस्प हो सकता है कि एक बंद को परिभाषित किया गया था ( यूट्यूब देखें : जोशुआ बल्लांको द्वारा रूबी कॉनसेबल रूबी कांसेबल 2011 से रखते हुए )। मुझे इस वीडियो के बारे में Ars Technica द्वारा माउस TheLuckyDog की टिप्पणी से अवगत कराया गया था ।

निम्नलिखित कोड पर विचार करें:

def mal(&block)
    puts ">:)"
    block.call
    t = block.binding.eval('(self.methods - Object.methods).sample')
    block.binding.eval <<-END
        def #{t.to_s}
          raise 'MWHWAHAW!'
        end
    END
end

class Foo
    def bar
        puts "bar"
    end

    def qux
        mal do
            puts "qux"
        end
    end
end

f = Foo.new
f.bar
f.qux

f.bar
f.qux

यह कोड पूरी तरह से दिखाई देता है, लेकिन malविधि कहीं और हो सकती है ... और खुली कक्षाओं के साथ, निश्चित रूप से, इसे कहीं और फिर से परिभाषित किया जा सकता है।

इस कोड को चलाना:

~ / $ माणिक foo.rb 
बार
> :)
qux
बार
b.rb: 20: `qux 'में: MWHWAHW! (रनटाइम त्रुटि)
    b.rb से: 30: `में
~ / $ माणिक foo.rb 
बार
> :)
qux
b.rb: 20: `बार 'में: MWHWAHAW! (रनटाइम त्रुटि)
    b.rb से: 29: `में

इस कोड में, क्लोजर उस दायरे में कक्षा में परिभाषित सभी तरीकों और अन्य बाइंडिंग तक पहुंचने में सक्षम था । इसने एक यादृच्छिक तरीका चुना और एक अपवाद को बढ़ाने के लिए इसे फिर से परिभाषित किया। ( रूबी में बाइंडिंग क्लास देखें कि इस वस्तु की क्या पहुंच है, इसका अंदाजा लगाने के लिए)

इस संदर्भ में चर, विधियां, स्वयं का मूल्य, और संभवत: एक पुनरावृत्ति अवरोधक, जिसे एक्सेस किया जा सकता है।

एक छोटा संस्करण जो एक चर के पुनर्परिवर्तन को दर्शाता है:

def mal(&block)
    block.call
    block.binding.eval('a = 43')
end

a = 42
puts a
mal do 
  puts 1
end
puts a

जब, जब रन का उत्पादन होता है:

42
1
43

यह खुले वर्ग से अधिक है जिसका मैंने ऊपर उल्लेख किया है जो स्थैतिक विश्लेषण को असंभव बनाता है। ऊपर जो दिखाया गया है वह यह है कि एक क्लोजर जो कहीं और से गुजरता है, उसके साथ उस पूरे वातावरण को ले जाता है जिसे वह परिभाषित किया गया था। इसे प्रथम श्रेणी के वातावरण के रूप में जाना जाता है (जैसे ही जब आप कार्यों को पास कर सकते हैं, वे प्रथम श्रेणी के कार्य होते हैं, यह पर्यावरण और उस समय उपलब्ध सभी बाइंडिंग) है। कोई भी वैरिएबल को फिर से परिभाषित कर सकता है जिसे क्लोजर के दायरे में परिभाषित किया गया था।

अच्छा या बुरा, माणिक या नहीं के बारे में शिकायत (वहाँ का उपयोग करता है, जहां एक होगा चाहते हैं एक विधि के वातावरण में प्राप्त करने के लिए सक्षम होने के लिए (देखें सुरक्षित पर्ल में)), "क्यों माणिक होगा के सवाल एक सरकारी परियोजना के लिए में प्रतिबंधित किया जा "ऊपर वर्णित वीडियो में वास्तव में उत्तर दिया गया है।

मान लीजिये:

  1. रूबी किसी भी बंद से पर्यावरण को निकालने की अनुमति देता है
  2. रूबी बंद के दायरे में सभी बाइंडिंग को पकड़ लेती है
  3. रूबी सभी बाइंडिंग को लाइव और म्यूटेबल बनाए रखती है
  4. रूबी के पास नए बाइंडिंग छाया पुराने बाइंडिंग हैं (बजाय पर्यावरण को क्लोन करने या रिबंडिंग को प्रतिबंधित करने के)

इन चार डिज़ाइन विकल्पों के निहितार्थ के साथ, यह जानना असंभव है कि कोई भी कोड क्या करता है।

इसके बारे में अधिक सार सार ब्लॉग पर पढ़ा जा सकता है । विशेष पद स्कीम के बारे में है जहां इस तरह की बहस थी। (SO पर संबंधित: योजना प्रथम श्रेणी के वातावरण का समर्थन क्यों नहीं करती है? )

समय के साथ, हालांकि, मुझे एहसास हुआ कि मूल रूप से जितना मैंने सोचा था, उससे अधिक कठिन और कम प्रथम श्रेणी के वातावरण के साथ शक्ति थी। इस बिंदु पर मेरा मानना ​​है कि प्रथम श्रेणी का वातावरण सबसे अच्छा बेकार है, और सबसे खराब खतरनाक है।

मुझे उम्मीद है कि यह खंड प्रथम श्रेणी के वातावरण के खतरे के पहलू को दिखाता है और यह क्यों दिया जाएगा कि रूबी को समाधान प्रदान किया जाए। यह न केवल यह है कि रूबी एक गतिशील भाषा है (जैसा कि अन्य उत्तर में कहा गया है, अन्य गतिशील भाषाओं को अन्य परियोजनाओं में अनुमति दी गई है), लेकिन यह विशिष्ट मुद्दे हैं जो कुछ गतिशील भाषाओं को तर्क करने के लिए और भी कठिन बना देते हैं।


3
मुझे इस बात की समझ नहीं है। आप एक पर्ल वर्ग का उल्लेख करते हैं जो स्केलर के व्यवहार को बदलने की अनुमति देता है। हालांकि, पर्ल का व्यापक रूप से उपयोग किया जाता है, जिसमें सुरक्षित वातावरण भी शामिल है। बस भाषा में इन क्षमताओं होने का मतलब यह नहीं है कि भाषा का उपयोग नहीं किया जा सकता है। रूबी के विशेष मामले में, इस तथ्य की संभावना है कि लक्ष्य वातावरण रूबी का समर्थन नहीं करता है। व्यक्तिगत रूप से, मैंने कभी भी रूबी को किसी भी सिस्टम पर उपयोग के लिए उपलब्ध नहीं देखा है, और मुझे यकीन नहीं है कि यह किसी भी अनुमोदित सॉफ़्टवेयर सूचियों पर है।
थॉमस ओवेन्स

17
@ThomasOwens - इस उत्तर की मेरी समझ यह है कि कुंजी है "many approaches to static analysis of security in code doesn't work", इसलिए इसे अस्वीकार कर दिया गया है क्योंकि इसका विश्लेषण नहीं किया जा सकता (इस समूह द्वारा, कम से कम)। चाहे मैं इसे सही व्याख्या कर रहा हूं, या यह अस्वीकार करने का एक वैध कारण भी है, मुझे नहीं पता।
बोबसन

21
अनुमोदित सॉफ़्टवेयर सूचियों की जानकारी में कमी, मैं केवल गतिशील भाषाओं के साथ कठिनाइयों का अनुमान लगा सकता हूं। हालाँकि, मैंने वित्तीय सॉफ़्टवेयर और भुगतान कार्ड उद्योग के चेक के साथ समान मुद्दों को देखा है, क्योंकि सुरक्षा के मुद्दों के लिए भाषा ने उस पर स्थैतिक विश्लेषण नहीं किया है। मैंने गतिशील भाषाओं में दो उदाहरणों का प्रदर्शन किया जहां भाषा की प्रकृति उसे स्थैतिक विश्लेषण को पलटने की अनुमति देती है। मैंने यह भी बताया कि ऐसा क्यों , सैद्धांतिक रूप से भी, कभी भी सटीक नहीं हो सकता। यह हो सकता है कि कुछ जगहों पर पर्ल को अनुमति दी जाए और दूसरों को नहीं, मैं केवल कारणों का अनुमान लगा सकता हूं।

2
आप कई अन्य भाषाओं में भी मानक पुस्तकालय कार्यों को पुनर्परिभाषित कर सकते हैं (उदाहरण के लिए ओबज-सी, सी, सी ++)।
मार्टिन विकमैन

12
खैर, .NET एक्सटेंशन के तरीके उपरोक्त रूबी के समान नहीं हैं। वे सिर्फ एक स्थिर वर्ग टाइप करने का एक आसान तरीका बनाते हैं। वे वास्तव में एक वर्ग में एक विधि नहीं जोड़ते हैं।
ग्राहम

50

मान लिया गया कि मूल्यांकन केवल सुरक्षा था, और केवल एक स्वीकृति स्कैन नहीं था (अर्थात, वे रूबी को स्वीकार नहीं करते हैं क्योंकि वे रूबी का समर्थन नहीं करना चाहते हैं):

सुरक्षा विश्लेषण उपकरण में आमतौर पर गतिशील व्यवहार के साथ बुरा समय होता है।

उदाहरण के लिए:

ASP.NET MVC और एंटिटी फ्रेमवर्क जैसे आधुनिक फीचर्स के साथ लिखे गए किसी भी .NET प्रोजेक्ट को वेराकोड की तरह चलाएं और देखें कि आप अपनी रिपोर्ट में किस तरह की गलत पॉज़िटिव्स की लॉन्ड्री करते हैं।

वेराकोड भी कई मूलभूत तकनीकों को सूचीबद्ध करता है। .NET 4 कोर लाइब्रेरीज़ में "असमर्थित फ्रेमवर्क" को असमर्थित या बीटा के रूप में सूचीबद्ध किया जाता है, भले ही उनमें से अधिकांश इस बिंदु पर कई साल पुराने हों।

यदि आप एक ऐसी इकाई के साथ काम कर रहे हैं, जिसके पास इस तरह के उपकरण पर एक मजबूत निर्भरता है, तो वे लगभग असुरक्षित होने पर विचार करने के लिए मजबूर होते हैं यदि उनके पास तकनीकी विशेषज्ञता और संसाधन नहीं हैं, तो मैन्युअल रूप से एक परियोजना का मूल्यांकन करें और देखें कि क्या यह ठीक से लिखा गया है और सुरक्षित।

नागरिक संचालन में जहां कंप्यूटर सिस्टम आमतौर पर किसी भी खतरनाक चीज को नियंत्रित नहीं करता है या बहुत महंगा होता है, वहीं यह है कि आप झूठी सकारात्मक चर्चा करते हैं और उन्हें आम तौर पर ऐसे ही स्वीकार किया जाता है।

बैंकिंग कार्यों में आपके पास अभी भी एक झूठी सकारात्मक शमन का मौका है, लेकिन आप प्रत्येक आइटम के minutiae पर चर्चा करने के लिए बहुत अधिक समय बिताने जा रहे हैं। यह तेजी से लागत निषेधात्मक हो जाता है और आप अधिक पारंपरिक तरीकों का उपयोग करना शुरू कर देते हैं।

सैन्य, विमानन, भारी उद्योग और इसी तरह, सिस्टम उन चीजों को नियंत्रित कर सकता है जिनके पास भयानक विफलता मोड हैं जो उन प्रणालियों में हैं, इसलिए उनके पास भाषा, संकलक आदि के बारे में बहुत सख्त नियम हो सकते हैं।

संगठन आम तौर पर अपनी सुरक्षा नीति को सबसे खराब स्थिति के लिए लिखते हैं, जिसके बारे में वे जानते हैं, इसलिए भले ही आप कुछ तुच्छ लिख रहे हों, अगर आप इसे एक ऐसे संगठन के लिए लिख रहे हैं जिसमें गैर-तुच्छ प्रणाली है, तो डिफ़ॉल्ट रूप से इसे रखने के लिए होने जा रहा है। उच्चतर मानक जब तक कोई विशिष्ट अपवाद का अनुरोध नहीं करता है।


4
और वह सिर्फ झूठी सकारात्मकता है। वास्तव में चिंताजनक बात झूठी नकारात्मक के लिए संभावित है।
स्टीफन C

3
ईमानदारी से, इन उपकरणों के साथ मेरा अनुभव आम तौर पर भयानक रहा है। वास्तव में चर्चा के लायक कुछ पाने की 1/200 से 1/1000 की दर के साथ शायद कुछ। इसके अलावा, जब मुझे एक झूठी सकारात्मक मिलती है, तो मुझे पता है कि कोडबेस या फ्रेमवर्क में हजारों स्थानों में कुछ का उपयोग किया जाता है और इसने केवल कुछ ही समय में इसे पहचान लिया है, मैं वास्तव में आत्मविश्वास से भरा नहीं हूं। समस्या यह है कि आप प्रभावी रूप से एक नकारात्मक प्रमाण को लागू कर रहे हैं जब आप इन उपकरणों में से एक का निर्माण करते हैं जब तक कि आप कल्पना # जैसी औपचारिक भाषा के साथ शुरू नहीं करते हैं।
बिल

33

रक्षा और सैन्य अनुप्रयोगों में गतिशील भाषाओं का उपयोग किया जा सकता है। मैंने व्यक्तिगत रूप से DoD अनुप्रयोगों में पर्ल और पायथन का उपयोग किया है। मैंने PHP और जावास्क्रिप्ट को भी इस्तेमाल किया और देखा है। मेरे अनुभवों में, मैंने जो गैर-संकलित कोड देखे हैं उनमें से अधिकांश शेल स्क्रिप्ट और पर्ल हैं क्योंकि आवश्यक वातावरण स्वीकृत हैं और विभिन्न संभावित लक्ष्य प्रणालियों पर स्थापित हैं।

तथ्य यह है कि इन भाषाओं गतिशील हैं सबसे अधिक समस्या नहीं है। इन भाषाओं के व्याख्याकारों को लक्ष्य प्रणालियों पर उपयोग के लिए अनुमोदित किया जाना चाहिए। यदि दुभाषिया उपयोग के लिए अनुमोदित नहीं है (या, शायद, यह है, लेकिन यह लक्ष्य प्रणालियों पर तैनात नहीं है), तो भाषा का उपयोग नहीं किया जा सकता है। किसी सुरक्षित प्रणाली पर दिए गए दुभाषिए (या किसी भी अनुप्रयोग) का उपयोग करने के लिए किसी भी प्रकार की सुरक्षा बाधाओं की आवश्यकता होती है: स्रोत का विश्लेषण, लक्ष्य वातावरण के लिए स्रोत से संकलन करने की क्षमता, बायनेरिज़ का अतिरिक्त विश्लेषण, मौजूदा बुनियादी ढांचे के साथ कोई संघर्ष सुनिश्चित नहीं करना, आदि।


32

मैंने एफ -16 के एमएमयू के लिए स्थिति लेखन कोड के लिए डीओडी (रक्षा विभाग) के साथ साक्षात्कार के लिए कुछ समय बिताया । किसी भी गैर-खुलासे का उल्लंघन किए बिना: एमएमयू कंप्यूटर इकाई है जो लगभग सभी एफ -16 के कार्यों को नियंत्रित करती है। यह (स्पष्ट रूप से) महत्वपूर्ण है कि कोई त्रुटि, जैसे रन-टाइम बग, उड़ान के दौरान नहीं होती हैं। यह समान रूप से महत्वपूर्ण है कि सिस्टम वास्तविक समय कंप्यूटिंग संचालन करता है।

इस और अन्य ऐतिहासिक कारणों के लिए, इस प्रणाली के लिए सभी कोड ADA में लिखे गए हैं , जो एक स्थिर ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषा है

एडा की सुरक्षा-महत्वपूर्ण समर्थन सुविधाओं के कारण, अब इसका उपयोग न केवल सैन्य अनुप्रयोगों के लिए किया जाता है, बल्कि वाणिज्यिक परियोजनाओं में भी किया जाता है, जहां एक सॉफ्टवेयर बग के गंभीर परिणाम हो सकते हैं, जैसे एविओनिक्स और वायु यातायात नियंत्रण, वाणिज्यिक रॉकेट (जैसे एरियन 4 और 5), उपग्रहों और अन्य अंतरिक्ष प्रणालियों, रेलवे परिवहन और बैंकिंग। उदाहरण के लिए, बोइंग 777 में फ्लाई-बाय-वायर सिस्टम सॉफ्टवेयर Ada में लिखा गया था।

मैं बहुत अधिक उद्धरण से नफरत करता हूं, लेकिन यह वास्तव में अच्छी तरह से बताता है कि इस तरह की परियोजनाओं के लिए बिल्कुल स्थिर भाषाओं (जैसे एडीए) का उपयोग क्यों किया जाता है:

बड़ी संख्या में संकलन-समय की जांच में बग से बचने में मदद करने के लिए समर्थित है जो कि कुछ अन्य भाषाओं में रन-टाइम तक पता लगाने योग्य नहीं होगा या स्रोत कोड में स्पष्ट चेक को जोड़ने की आवश्यकता होगी। उदाहरण के लिए, बेमेल अंत टोकन के कारण त्रुटियों को रोकने के लिए सिंटैक्स को स्पष्ट रूप से ब्लॉकों के नामकरण की आवश्यकता होती है। मजबूत टाइपिंग के पालन से कई सामान्य सॉफ़्टवेयर त्रुटियों (गलत पैरामीटर, श्रेणी उल्लंघन, अमान्य संदर्भ, बेमेल प्रकार, आदि) का पता चल जाता है या तो संकलन-समय के दौरान, या अन्यथा रन-टाइम के दौरान। जैसा कि संगामिति भाषा विनिर्देश का हिस्सा है, कंपाइलर कुछ मामलों में संभावित गतिरोधों का पता लगा सकता है। कंपाइलर्स आमतौर पर गलत वर्तनी वाले पहचानकर्ताओं, पैकेजों की दृश्यता, निरर्थक घोषणाओं आदि की जांच करते हैं और त्रुटि को ठीक करने के तरीके के बारे में चेतावनी और उपयोगी सुझाव प्रदान कर सकते हैं।

Ada रन-टाइम चेकों का भी समर्थन करता है जो कि अनलॉक्ड मेमोरी, बफर ओवरफ्लो त्रुटियों, रेंज उल्लंघनों, ऑफ-बाय-वन एरर्स, एरे एक्सेस एक्सेस एरर्स और अन्य डिटेक्टिव बग्स तक पहुंच से सुरक्षा प्रदान करता है। इन जांचों को रनटाइम दक्षता के हित में अक्षम किया जा सकता है, लेकिन अक्सर कुशलतापूर्वक संकलित किया जा सकता है। इसमें कार्यक्रम सत्यापन में मदद करने के लिए सुविधाएं भी शामिल हैं। इन कारणों के लिए, एडा व्यापक रूप से महत्वपूर्ण प्रणालियों में उपयोग किया जाता है, जहां किसी भी विसंगति में बहुत गंभीर परिणाम हो सकते हैं, उदाहरण के लिए, आकस्मिक मृत्यु, चोट या गंभीर वित्तीय नुकसान। उन प्रणालियों के उदाहरण जहां एडा का उपयोग किया जाता है उनमें एविओनिक्स, रेलवे, बैंकिंग, सैन्य और अंतरिक्ष प्रौद्योगिकी शामिल हैं।

Ada का डायनेमिक मेमोरी प्रबंधन उच्च-स्तरीय और प्रकार-सुरक्षित है। आद्या के पास सामान्य (और अस्पष्ट) "संकेत" नहीं है; न ही यह किसी भी प्रकार के सूचक को स्पष्ट रूप से घोषित करता है। इसके बजाय, सभी डायनामिक मेमोरी आवंटन और डीलक्लोकेशन को स्पष्ट रूप से घोषित एक्सेस प्रकारों के माध्यम से होना चाहिए। प्रत्येक एक्सेस प्रकार में एक संबद्ध स्टोरेज पूल है जो मेमोरी प्रबंधन के निम्न-स्तरीय विवरणों को संभालता है; प्रोग्रामर या तो डिफ़ॉल्ट भंडारण पूल का उपयोग कर सकता है या नए लोगों को परिभाषित कर सकता है (यह गैर-वर्दी मेमोरी एक्सेस के लिए विशेष रूप से प्रासंगिक है)। कई अलग-अलग पहुंच प्रकारों की घोषणा करना भी संभव है जो सभी एक ही प्रकार को नामित करते हैं लेकिन विभिन्न भंडारण पूल का उपयोग करते हैं। साथ ही, भाषा संकलन समय और रन टाइम दोनों पर एक्सेसिबिलिटी चेक के लिए प्रदान करती है, जो यह सुनिश्चित करती है कि एक एक्सेस वैल्यू उस ऑब्जेक्ट के प्रकार को रेखांकित नहीं कर सकती जो इसे इंगित करता है।


3
"एडा की सुरक्षा-महत्वपूर्ण समर्थन सुविधाओं के कारण, यह अब [वाणिज्यिक रॉकेट (जैसे एरियन 4 और 5)] में उपयोग किया जाता है , निश्चित रूप से पहले एरियन 5 एक सॉफ्टवेयर बग के कारण फट गया , इसलिए कोई चांदी की गोली नहीं है।
एंड्रयू मार्शल

5
@AndrewMarshall: "हालांकि रिपोर्ट ने एक सॉफ्टवेयर बग को प्रत्यक्ष कारण के रूप में पहचाना, अन्य जांचकर्ता कारणों को सिस्टम डिज़ाइन विफलताओं और प्रबंधन के मुद्दों के रूप में देखते हैं" - मुझे गंभीरता से संदेह है कि कोड एक अलग भाषा (जैसे जावा या सी ++) में लिखा गया है। कक्षा के लिए रॉकेट।
मार्टिन श्रोडर

@ MartinSchröder ओह मुझे संदेह नहीं है कि Ada अभी भी इस एप्लिकेशन के लिए दूसरों से बेहतर है, बस यह देखते हुए कि यह मूर्खतापूर्ण नहीं है। एक और भाषा अनगिनत बगों के माध्यम से हो सकती है जो सिर्फ अडा में संभव नहीं थी।
एंड्रयू मार्शल

13

DoD और NASA दोनों का प्रोग्रामिंग के साथ एक लंबा इतिहास रहा है, जिसमें अरबों डॉलर खर्च हुए। दोनों संस्थानों ने ऐसी प्रक्रियाओं को स्वीकार किया है जो उन्हें समान गलतियों को दोहराने से बचाएं।

Is this the government being slow to adopting new technologies?

यह एक गलत धारणा है - गतिशील भाषाएं एक नई तकनीक नहीं हैं, वे काफी पुरानी हैं। समस्या यह है कि यदि आपको कभी भी एक डायनेमिक भाषा (जैसे कमजोर / गतिशील टाइपिंग) के कारण समस्या हुई थी और उस समस्या पर आपको बहुत पैसा खर्च करना पड़ा था, तो आप एक ऐसी नीति स्वीकार कर सकते थे जो आपको फिर से वही गलती करने से रोक सके - जैसे संवेदनशील प्रणालियों में गतिशील भाषाओं के उपयोग पर प्रतिबंध।

डायनेमिक भाषाएं अक्सर बग को "निगल" कर सकती हैं और कुछ अप्रत्याशित व्यवहार के साथ समाप्त हो जाएंगी। संवेदनशील प्रणालियों में यह बहुत खतरनाक है। अगर कुछ गलत हो रहा है, तो आप इसे जल्द से जल्द जानना चाहते हैं।

यदि सुरक्षा का संबंध है, तो वास्तविक उपयोग के मामले को देखना आवश्यक होगा। उदाहरण के लिए, मुझे नहीं लगता कि रेल वेब पेज पर एक रूबी जावा वेबपेज की तुलना में स्वचालित रूप से कम सुरक्षित होगी।


2
IMHO अधिक बग को किसी अन्य चीज़ की तुलना में अनपेक्षित बफर ओवरफ्लो द्वारा "निगल" लिया गया है, जो कि वास्तव में कुछ ऐसा है जो सबसे गतिशील भाषाओं को पहली जगह की अनुमति नहीं देगा ... बस कह रहा है
चमत्कारी

@miraculixx सच है, एक कारण है कि जावा / सी # और समान भाषाओं का उपयोग रूबी की तुलना में बहुत अधिक किया जा रहा है। वे रक्षात्मक हैं - वे सब कुछ जांचते हैं। C / C ++ में एक अच्छे कोडिंग मानकों का उपयोग करके रक्षात्मकता को लागू किया जा सकता है। आप हर चीज के लिए चेक भी लागू कर सकते हैं। लेकिन क्या आप रूबी या जावास्क्रिप्ट में एक संवेदनशील एप्लिकेशन लिखने की कल्पना कर सकते हैं? छिपे हुए कीड़े के लिए संभावना महान है।
सुल्तान

वास्तव में, मैं कर सकता हूँ। हम इस बात से सहमत हैं कि सॉफ्टवेयर को प्रोग्रामिंग लैंग्वेज से स्वतंत्र रूप से पूरी तरह से जांचने की जरूरत है। प्रतिगमन से बचने के लिए, उदाहरण के लिए, इकाई परीक्षण, बीडीडी एट अल का उपयोग करके परीक्षण को सबसे अच्छा स्वचालित किया जाता है। एक पेशेवर दृष्टिकोण (संवेदनशील अनुप्रयोग, सही?) को मानते हुए, एक पर्याप्त परीक्षण कवरेज प्राप्त करना एक प्रबंधित प्रक्रिया है, मौका नहीं छोड़ा गया है। इसके साथ, मुझे संदेह है कि सी / सी ++, जावा को छिपे हुए बग के संदर्भ में रूबी या जावास्क्रिप्ट की पसंद पर एक फायदा है। प्रोग्रामर कौशल? सी ++ के साथ संभवतः अधिक तकनीकी, जावा के साथ संदिग्ध, फिर भी शायद ही कोई भाषा मुद्दा। अधिक तकनीकी! = उत्पाद की गुणवत्ता।
चमत्कारी

6

मैं Drupal के SA-CORE-2014-005 का वर्णन करके मौजूदा उत्तरों को जोड़ना चाहूंगा , जो एक अत्यधिक महत्वपूर्ण भेद्यता है जो SQL इंजेक्शन और अंततः मनमाना कोड निष्पादन में सक्षम बनाता है। यह PHP के डायनामिक टाइपिंग और लैक्स रनटाइम टाइपिंग नियमों के कारण होता है।

इस समस्या के लिए पैच की संपूर्णता है:

-      foreach ($data as $i => $value) {
+      foreach (array_values($data) as $i => $value) {

यह कोड SQL एब्स्ट्रेक्शन लेयर का हिस्सा है जिसे SQL इंजेक्शन को रोकने के लिए डिज़ाइन किया गया है। यह नामित पैरामीटर और एक सहयोगी सरणी के साथ एक SQL क्वेरी लेता है जो प्रत्येक नामित पैरामीटर के लिए एक मूल्य प्रदान करता है। मान एक सरणी होने की अनुमति देता है, जैसे मामलों के लिए WHERE x IN (val1, val2, val3), जहां सभी तीन मान एकल नाम पैरामीटर के लिए एकल सरणी मान के रूप में पारित किए जा सकते हैं।

असुरक्षा होती है क्योंकि कोड मानता है कि $iमें $i => $valueमूल्य के एक पूर्णांक सूचकांक होना चाहिए। यह आगे बढ़ता है और इस "सूचकांक" को सीधे SQL क्वेरी में पैरामीटर नाम के भाग के रूप में परिवर्तित करता है, क्योंकि पूर्णांक को किसी भी भागने की आवश्यकता नहीं है, है ना?

दुर्भाग्य से Drupal के लिए, PHP ऐसी गारंटी प्रदान नहीं करता है। एक अन्य साहचर्य सरणी में पास करना संभव है, जिसकी कुंजी तार हैं, और यह लूप स्ट्रिंग कुंजी को क्वेरी में खुशी से सम्‍मिलित करेगा, जैसा कि (कोड सोचता है कि यह केवल एक पूर्णांक हो सकता है)।

हालांकि, सांख्यिकीय रूप से टाइप की गई भाषा में एक समान त्रुटि के तरीके हैं, वे संभावना नहीं है। एक अच्छा डेवलपर यह विचार करेगा $iकि क्वेरी में इसे संक्षिप्त करने से पहले क्या संभव चीजें हो सकती हैं। सांख्यिकीय रूप से टाइप की गई भाषा के साथ, यह लागू करना बहुत आसान है कि $iपूर्णांक होना चाहिए, और इस तरह से सुरक्षा संवेदनशील कोड में, जो कि निश्चित रूप से किया जाएगा।

इसके अलावा, कोड वास्तव में जाँचता है कि क्या आइटम पर पुनरावृत्ति करने से पहले एक सरणी है। और यहाँ असफलता का एक दूसरा भाग निहित है जो इस भेद्यता को सक्षम बनाता है: एक साहचर्य सरणी और "सामान्य" सरणी दोनों के लिए सही है is_array। हालांकि यह भी सच है कि C # में, दोनों शब्दकोश और सरणियाँ हैं IEnumerable, ऐसे कोड का निर्माण करना मुश्किल है, जो इस तरह से सरणी सूचकांकों के साथ शब्दकोश कुंजियों को भी जानबूझकर भ्रमित करेगा, अकेले गलती से।


2

कोई कोडबेस सुरक्षित है या नहीं यह इस बात पर निर्भर करता है कि आप अपना कोड कैसे लिखते हैं, आप इसका परीक्षण कैसे करते हैं और आप अपने विकास और परिनियोजन प्रक्रिया को कैसे सत्यापित और मॉनिटर करते हैं। भाषाएँ न तो सुरक्षित हैं और न ही असुरक्षित, यह आप कैसे कोड है।

दुर्भावनापूर्ण इनपुट (एसक्यूएल इंजेक्शन, बफर ओवरफ्लो), वायरस, रूटकिट और ट्रोजन के कारण अधिकांश सुरक्षा घटनाएं। कोई भी भाषा आपको इससे बचा नहीं सकती है।

इसलिए "असुरक्षित" होने के लिए भाषाओं के वर्गों पर प्रतिबंध लगाना एक वैध कारण नहीं है।

मुझे संदेह है कि किसी ने, जो भी कारण - सूचित या नहीं - इन भाषाओं पर प्रतिबंध लगाने का फैसला किया। कुछ समय बाद यह एक संगठनात्मक सत्य बन गया । यह कुछ परियोजनाओं के लिए उस समय पर सच हो सकता था, लेकिन नियंत्रण संस्कृतियों को बदलते फैसले (वे गलत थे स्वीकार) के लिए उत्सुक नहीं हैं और बल्कि सरल नियमों को प्राथमिकता देते हैं। वे नियमों और विनियमों पर खिलते हैं और इससे कोई फर्क नहीं पड़ता कि वे समझ में आते हैं या नहीं, यह कथित सुरक्षा है जो मायने रखता है।

यह हर समय नियंत्रण संस्कृतियों में होता है। मैं इसे कम या ज्यादा रोज देखता हूं। यह कोई मतलब नहीं है, लेकिन यह है कि यह कैसे जाता है। यदि आप इस अत्यधिक प्रासंगिक विषय के बारे में अधिक पढ़ना चाहते हैं, तो मैं श्नाइडर की पुस्तक " द रेन्गिनियरिंग वैकल्पिक " की सिफारिश करता हूं । श्नाइडर की किताब पर आधारित माइकल साहोटो / एजिलिट्रिक्स द्वारा यहां एक संस्कृति आरेख है : यहां छवि विवरण दर्ज करें


18
-1 कई वैध तकनीकी कारण हैं कि क्यों विभिन्न प्रणालियों के लिए एक भाषा को दूसरे (वास्तविक-समय, स्थैतिक-टाइपिंग, रन-टाइम चेक) पर चुना जाएगा। आप मानते हैं कि कारण 100% संस्कृति हैं, हमें बनाम उन्हें, और मनमाना, जो IMO इस मामले में पूरी तरह से गलत है।
माइकल जैस्पर

8
"बोली न सुरक्षित या असुरक्षित हैं" - देखना stackoverflow.com/a/14313277/602554 । कुछ भाषाएं निश्चित रूप से दूसरों की तुलना में "अधिक सुरक्षित" हैं।
माइकल जैस्पर

2
मेरे उत्तर को अपडेट किया, शायद आपकी पसंद को। मेरा अभी भी मानना ​​है कि एक प्रणाली कितनी सुरक्षित है, यह उस कोड पर अधिक निर्भर करता है जो आप अपनी भाषा के अनुसार लिखते हैं कि आप किस भाषा का उपयोग करते हैं, हालांकि कुछ भाषाएं कुछ समस्याओं से बचने में मदद करती हैं (जबकि, संभवतः अन्य का परिचय देती हैं)।
मार्टिन विकमैन

2
@ मर्टिनविकमैन: ए) एसक्यूएल / एचटीएमएल इंजेक्शन और बफर ओवरफ्लो कुछ प्रकार के सिस्टम द्वारा हल किए जाते हैं - आपके पास फरार और अप्रकाशित इनपुट के लिए अलग-अलग प्रकार हैं इसलिए आपको पता है कि किस तरीके से इलाज किया जाना चाहिए। b) 'सिक्योर प्रोजेक्ट्स' में सभी सुरक्षा मुद्दे अनिवार्य रूप से समझौता नहीं करते हैं। मैं नहीं चाहता कि सॉफ्टवेयर किसी भी बग को चलाने के लिए हवाई जहाज चलाए, भले ही वह 'सुरक्षा' मुद्दा न हो (अर्थात सिस्टम को संभालने के लिए इस्तेमाल नहीं किया जा सकता)।
मैकीज पाइचोटका

5
तथ्यात्मक सटीकता समस्याओं के लिए -1। बफर अतिप्रवाह कारनामे सी भाषा के लिए विशिष्ट समस्या है; आप उन भाषाओं के बारे में कभी नहीं सुनते हैं जो आपको स्टैक पर स्ट्रिंग बफर आवंटित करने की अनुमति नहीं देती हैं। और काल्पनिक एसक्यूएल बोली की कल्पना करना बिल्कुल भी मुश्किल नहीं है, जिसमें पैरामीटर्स के उपयोग की अनुमति नहीं है, लेकिन इसकी आवश्यकता है । SQL इंजेक्शन इस भाषा में असंभव होगा। तो हाँ, एक अच्छी तरह से डिज़ाइन की गई भाषा आपको कई सामान्य प्रकार के हमलों से बचा सकती है
मेसन व्हीलर

2

जहां तक ​​मैं बता सकता हूं, रक्षा नीति का आधिकारिक विभाग आम तौर पर गतिशील भाषाओं को मना नहीं करता है।

डीओडी द्वारा विकसित या खरीदे गए सॉफ्टवेयर के मानकों को रक्षा सूचना प्रणाली एजेंसी (डीआईएसए) द्वारा प्रख्यापित किया जाता है । उनकी एप्लीकेशन सिक्योरिटी - एप्लीकेशन सिक्योरिटी एंड डेवलपमेंट सिक्योरिटी टेक्निकल इंप्लीमेंटेशन गाइड (STIG) किसी विशेष भाषा को प्रतिबंधित नहीं करती है। इसमें रूबी का उल्लेख नहीं है, लेकिन इसमें पर्ल और पायथन का उल्लेख है जो समान रूप से गतिशील हैं। इसमें विभिन्न विषयों (निम्नलिखित स्थापित कोडिंग मानकों, कमांड इंजेक्शन कमजोरियों से बचने, आदि) के संदर्भ में उनका उल्लेख किया गया है।

संभवतः आप जो देख रहे हैं वह अत्यधिक सख्त स्कैनिंग उपकरण है (एसटीआईजी में उल्लिखित कई अलग-अलग हैं, प्रत्येक में नियमों की अपनी व्याख्या हो सकती है) और / या इसके उत्पादन की अत्यधिक सख्त व्याख्या।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.