क्या विश्व स्तर पर फोर्क बम का उपयोग करने से इसके निष्पादन को रोका जा सकता है?


15

यदि आप विश्व स्तर पर सेट थे

alias ':(){ :|:& };:'='echo fork bomb averted'

क्या यह एक प्रभावी सुरक्षा रणनीति होगी जो बैश कांटा बम के निष्पादन से बचने के लिए होगी या फिर अभी भी इसे निष्पादित करने का कोई तरीका होगा?

मुझे लगता है कि सवाल कैश से बाहर है: क्या एक कमांड निष्पादित करने का एक तरीका है जब यह किसी और चीज़ के लिए अलियास किया जाता है?


1
@ user1717828, एक "कांटा बम" एक ऐसा कार्यक्रम है जो बस खुद की नई प्रतियां चलाता है, हमेशा के लिए। चल रहे कार्यक्रमों की संख्या में परिणामस्वरूप घातीय वृद्धि आमतौर पर कुछ को कम क्रम में तोड़ने का कारण बनती है।
मार्क

1
यहां तक ​​कि अगर यह काम करता है - यह एक प्रोग्राम के खिलाफ रक्षा नहीं करेगा जो फोर्क () को दंश से नहीं गुजर रहा है?
UKMonkey

2
: () {: |: और: |: &} ;:
जोशुआ

3
बस चलाएंa(){ a|a& };a
23:25 पर user253751

1
आप सामान्य रूप से बचेंगे (यदि आप इसे काम करने के लिए प्राप्त करेंगे), लेकिन संभव है कि इस पर विभिन्न प्रकार की विविधताएँ हों।
मस्त

जवाबों:


52

दो , नहीं, तीन , ... मुख्य बाधाओं में से है कि करने के लिए कर रहे हैं:

  1. यह उपनाम के लिए मान्य नाम नहीं है। बैश के ऑनलाइन मैनुअल :

    वर्ण ... और ऊपर सूचीबद्ध शेल मेटाचैकर या उद्धृत वर्णों में से कोई भी अन्य नाम में प्रकट नहीं हो सकता है।

    (, ), &, |और रिक्त स्थान को बैश 4.4 में बाहर हैं।

  2. वह विशेष स्ट्रिंग केवल शेल में एक फोर्क बम लिखने का एकमात्र तरीका नहीं है, सिर्फ इसलिए कि यह अस्पष्ट दिखता है। उदाहरण के लिए, :वास्तव में अक्षरों से बना कुछ के बजाय फ़ंक्शन को कॉल करने की आवश्यकता नहीं है ।

  3. यदि आप उपनाम सेट कर सकते हैं, तो उपयोगकर्ता उपनाम को अनइंस्टॉल कर सकता है, कमांड लाइन पर उपनाम नाम से बचकर या इसे पूरी तरह से निष्क्रिय कर सकता है, संभवत: एक स्क्रिप्ट में फ़ंक्शन चलाकर (बैश नॉनएक्टिव शेल में उपनाम का विस्तार नहीं करता है) ।

  4. भले ही शेल एक फोर्क बम के सभी संस्करणों को रोकने के लिए पर्याप्त रूप से प्रतिबंधित है, एक सामान्य उद्देश्य प्रणाली में अन्य प्रोग्राम योग्य उपयोगिताएं होंगी जो उपप्रकारों को पुन: उत्पन्न और कांटा कर सकती हैं। पर्ल या सी कंपाइलर मिला? काफी आसान। जागते हुए भी शायद ऐसा कर सके। यहां तक ​​कि अगर आपके पास स्थापित नहीं हैं, तो भी आपको उपयोगकर्ता को सिस्टम के बाहर से संकलित बायनेरिज़ में लाने से रोकने की आवश्यकता होगी, या चल रहे हैं /bin/shजो संभवतः सिस्टम के बाकी कार्यों के लिए पूरी तरह से परिचालन शेल होने की आवश्यकता है।

उपयोगकर्ता द्वारा शुरू की जाने वाली प्रक्रियाओं की संख्या को सीमित करने के लिए बस ulimit -u(यानी RLIMIT_NPROC) या समकक्ष का उपयोग करें। अधिकांश लिनक्स सिस्टम पर pam_limitsउपयोगकर्ता द्वारा चुने गए किसी भी कमांड को शुरू करने से पहले प्रक्रिया की गिनती सीमा निर्धारित कर सकते हैं।

कुछ इस तरह /etc/security/limits.confसे सभी उपयोगकर्ताओं के लिए 50 प्रक्रियाओं की एक कठिन सीमा होगी:

*        hard    nproc           50

(स्टीफन किट ने पहले ही 1 बिंदु का उल्लेख किया , जेफ स्कालर ने 2 और 3 का उल्लेख किया )


क्या बिना फोर्क बम लिखना संभव है &?
स्टीफन किट

4
@StephenKitt मैं 100% निश्चित नहीं हूं, लेकिन मेरा अनुमान है कि बैश पूरा हो गया है। यदि हां, तो अनंत संभावनाएं हैं। उदाहरण के लिए आप ascii char-38 कोड पार्स कर सकते हैं और इसे निष्पादित कर सकते हैं।
मैरी

@ इस विशेष संदर्भ में आपको &सीमा के आसपास काम करते समय किसी भी अन्य निषिद्ध चरित्र से बचना होगा ।
स्टीफन किट

15
मेरा कहना मुख्य रूप से यह था कि खराब कार्यक्षमता को काली सूची में डालने की कोशिश करना एक बुरा विचार है। लगभग हमेशा रास्ते होते हैं।
मैरी

2
@ मैरी: बैश काफी निश्चित रूप से ट्यूरिंग पूर्ण है।
अगली सूचना तक रोक दिया गया।

18

नहीं, कांटा-बम लिखने के कई तरीके हैं।

दुष्ट कांटा-बम लेखक एक अलग फ़ंक्शन नाम के साथ फिर से प्रयास करेगा। या अन्य परिवर्तन जब तक उसका कांटा-बम सफल नहीं होता।

अनजाने कांटे-बम लेखक पहले स्थान पर कैनोनिकल फोर्क-बम का उत्पादन नहीं करेंगे।

यह वास्तव में एक अनजाना कांटा-बम लेखक बनना आसान है। उदाहरण के लिए, आप केवल makeएक बाहरी, अनियंत्रित के साथ पुनरावर्ती का उपयोग कर सकते हैं cd, इसे -jविकल्प और गैर-मौजूदा उपनिर्देशिकाओं के साथ जोड़कर - एक वास्तविक उदाहरण जो मैंने एक बार ठोकर खाई है।

आप सभी संभावनाओं के खिलाफ सुरक्षा नहीं कर सकते, और निश्चित रूप से एक निर्धारित हमलावर के खिलाफ नहीं। आपको केवल अपने सिस्टम की जटिलता को बढ़ाना होगा।


14

आप फोर्क बम का उपनाम नहीं दे सकते, क्योंकि यह वैध उपनाम नाम नहीं है :

$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name

वर्ण '/', '$', '`', '=' और ऊपर उल्लिखित वर्णों के किसी भी मेटा मेटाट्रैक्टर या उद्धृत अक्षर किसी अन्य नाम में प्रकट नहीं हो सकते हैं।

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


एक शेल इस उपनाम को स्थापित करने की अनुमति देता है या नहीं, इससे कोई फर्क नहीं पड़ता। महत्वपूर्ण यह है कि यदि ऐसा कोई अन्य उपनाम मौजूद है, तो भी कमांड की व्याख्या करते समय इसका विस्तार नहीं किया जाता है क्योंकि उपनाम नाम अनुमत पैटर्न से मेल नहीं खाता है। dashऔर boshउदाहरण के लिए दोनों चुपचाप इसे अनदेखा करते हैं।
शास्त्री

10

दो बार, नहीं।

फोर्क-बम लिखने का यह एकमात्र तरीका नहीं है।

जब एक उपनाम हो तो "कमांड" निष्पादित करने के कई तरीके भी हैं:

command the-command
\the-command

उदाहरण:

$ alias ls=not-really-ls
$ ls
-bash: not-really-ls: command not found
$ \ls
jeff.html  output.png
$ command ls
jeff.html  output.png

मुख्य विषय से संबंधित नहीं है लेकिन क्यों \lsदिखाया गयाoutput.png लेकिन command lsनहीं किया?
nxnev

अच्छी तरह से देखा गया! यह वास्तव में, मुख्य विषय से असंबंधित है। यह एक क्लासिक PEBCAK त्रुटि है जहां मैं कॉपी / गलत-चिपकाया जाता हूं (या आउटपुट को साफ करता हूं। बीच-बीच में)। मैं इसे विचलित करने के लिए ठीक करूँगा। धन्यवाद, @nxnev!
जेफ स्कालर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.