क्या लिनक्स के पास कांटा बम से बचाव के लिए कोई उपाय है?


12
#include <unistd.h>
int main(int argc, char* argv[]) {
  while(1)
  {
    fork();
  } 
}

मैं अपने लिनक्स पर इस कार्यक्रम को चलाता हूं, टर्मिनल पर कुछ भी आउटपुट नहीं करता है, ओएस लगता है कि मृत हो गया। क्या लिनक्स के पास ऐसे प्रोग्राम के लिए कोई सुरक्षा उपाय है जो स्मृति से बाहर चला सकता है?


2
मुझे संदेह है कि यदि आप एक बड़े स्वैप विभाजन को बनाने के लिए कई डिस्ट्रोस को बुरी सलाह का पालन नहीं करते हैं तो प्रभाव बहुत कम होगा ...
R .. GitHub STOP HELPING ICE

1
क्या "65k मारने के बाद कोई नई प्रक्रिया नहीं बना रहा है" काउंटर-माप के रूप में गिना जाता है? ;)
बॉबी

जवाबों:


18

इसे कांटा बम के रूप में जाना जाता है ।

क्या लिनक्स के पास ऐसे प्रोग्राम के लिए कोई सुरक्षा उपाय है जो स्मृति से बाहर चला सकता है?

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

पहली जगह में इसे रोकने का एक तरीका उपयोगकर्ता प्रक्रियाओं की संख्या को सीमित करना है, का उपयोग करके ulimit -u(यह मानते हुए कि आप बैश का उपयोग कर रहे हैं; अन्य गोले समतुल्य होंगे)।


2
एक बात जो ध्यान देने योग्य है वह ulimitहै बैश करना; अन्य गोले की संभावना एक ही अंतर्निहित कमांड होगी, लेकिन शायद एक अलग नाम के साथ।
जय

@ जय: निष्पक्ष बिंदु। मैंने नोट किया है कि अब जवाब में, धन्यवाद!
ओलिवर चार्ल्सवर्थ

1
प्रति उपयोगकर्ता मेमोरी / फ़ाइल डिस्क्रिप्टर को सीमित करना पर्याप्त होना चाहिए। प्रति उपयोगकर्ता मेमोरी सीमित करना हमेशा एक अच्छा विचार है। जब एक प्रक्रिया (ओओएम) मार दी जाती है, तो वॉचडॉग को एक अधिसूचना भेजनी चाहिए ताकि BOFH 'दुष्ट' उपयोगकर्ता को बूट कर सके / सिस्टम से संबंधित सभी प्रक्रियाएं बंद हो

मेरा मानना ​​है कि आप लॉगिन मापदंडों के माध्यम से कुछ सीमाएं भी निर्धारित कर सकते हैं
p_l

10

हां, हालाँकि यह आपके सिस्टम पर डिफ़ॉल्ट रूप से सक्षम नहीं हो सकता है। setrlimitप्रति उपयोगकर्ता प्रक्रियाओं की संख्या सहित - सिस्टम कॉल सिस्टम सीमाओं को परिभाषित करता है।

आइए इसे पहले कर्नेल एपीआई में देखें (क्योंकि आपने "linux" का उल्लेख किया है): आप सेटलिमिट के लिए मैनपेज का उपयोग कर सकते हैं, जो आपको कुछ ऐसा करने के लिए कहेगा

#include <sys/resource.h>
...

struct rlimit  r;

rnew.r_cur = 40;
rnew.r_max = 50;
setrlimit(RLIMIT_NPROC,&r);

यह प्रति उपयोगकर्ता अधिकतम प्रक्रियाएं ( RLIMIT_NPROC) से 40 (सॉफ्ट लिमिट) और 50 (हार्ड लिमिट) तय करेगा।

अब, शेल से, यदि आप बैश का उपयोग करते हैं, तो आप ulimitअंतर्निहित कमांड का उपयोग कर सकते हैं :

ulimit -u
29089

आप इसे तर्क के रूप में पारित करके सीमा निर्धारित कर सकते हैं:

ulimit -u 100

ulimit --help आपको दिखाएगा कि ऐसी कई अन्य सीमाएँ हैं जिन्हें आप सेट कर सकते हैं (एक जो कि ब्याज की हो सकती है, उपयोगकर्ता द्वारा उपयोग की जाने वाली फ़ाइल डिस्क्रिप्टर की अधिकतम संख्या है)।


7

यह निर्भर करता है कि आप इसका उपयोग उपयोगकर्ता स्तर या सिस्टम स्तर पर करना चाहते हैं। उपयोगकर्ता स्तर पर ulimit(या अन्य गोले के लिए संबंधित कमांड) सबसे आसान समाधान होगा।

हालाँकि सिस्टम स्तर पर दुर्भावनापूर्ण उपयोगकर्ताओं (या बस का उपयोग नहीं करने के लिए ulimit) को रोकने के तंत्र हैं। लिनक्स cgroups तंत्र प्रति समूह के आधार पर संसाधनों को सीमित कर सकता है। आप pam_systemdउपयोगकर्ता समूह को विशिष्ट समूह में रहने के लिए बाध्य कर सकते हैं । इसके अन्य लाभ हैं, उदाहरण के लिए, CPU अनुसूचक।


1
+1: cgroups वास्तव में नए हैं, और अधिकांश लोग अभी तक उनके बारे में ज्यादा नहीं जानते हैं। हम और कहाँ सीख सकते हैं?
केन ब्लूम

1
@KenBloom: 1. ब्राउजिंग करके /sys/fs/cgroup/2. गूगल में सर्च करके 3. ब्राउजिंग make menuconfigकरके 4. 4. देख कर /usr/src/linux/Documentation/cgroups5. सिस्टमड प्रलेखन को पढ़कर। क्षमा करें मैं अधिक मदद नहीं कर सकता, लेकिन मैंने केवल उन संसाधनों का उपयोग किया। मैंने संसाधनों को नियंत्रित करने के लिए डेस्कटॉप पर cgroups का उपयोग किया।
मकीज पीचोटका

6

ulimit -u"अधिकतम उपयोगकर्ता प्रक्रियाओं" पर एक सीमा निर्धारित करने के लिए बैश शेल से उपयोग करें ।

C शेल से, आप limitकमांड का उपयोग करते हैं ।

यदि आपको ऐसा करने के लिए सिस्टम कॉल की आवश्यकता है, तो setrlimitकॉल को सेट करने के लिए उपयोग करें RLIMIT_NPROC


1

चूँकि यहाँ हाल के उत्तर 3 साल से अधिक पुराने हैं, इसलिए मैं यह बताना चाहता हूँ कि नए कर्नेल (4.3 से) के पास नए "पीआईडीएस सबसिस्टम" के माध्यम से कांटा बम को रोकने के लिए स्पष्ट समर्थन है। (देखें https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=49b786ea146f69c371df18e81ce0a2d5839f865c और https://git.kernel.org/cgit/linux/kernel/git /torvalds/linux.git/commit/?id=917d8e2d10f40e28aa9e0d824b2e5b8197d79fc2 )

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