क्या एक बच्चे की प्रक्रिया की पीआईडी ​​लिनक्स पर हमेशा अपने माता-पिता के पीआईडी ​​से अधिक होती है?


22

बता दें, कर्नेल 2.6 आगे से।

मैं सिस्टम पर चलने वाली सभी प्रक्रियाओं को देखता हूं।

क्या बच्चों का पीआईडी ​​हमेशा उनके माता-पिता के पीआईडी ​​से अधिक होता है?

क्या "उलटा" के विशेष मामले होना संभव है?

जवाबों:


47

नहीं, बहुत साधारण कारण से कि PID में अधिकतम संख्यात्मक मूल्य हो सकते हैं। यदि किसी प्रक्रिया में सबसे अधिक पीआईडी ​​है, तो कोई भी बच्चा नहीं चाहता है कि उसके पास अधिक पीआईडी ​​हो। बच्चे को कम पीआईडी ​​देने का विकल्प fork()पूरी तरह से विफल होगा, जो बहुत उत्पादक नहीं होगा।

PID को क्रम में आवंटित किया जाता है, और उच्चतम एक का उपयोग करने के बाद, सिस्टम निम्न (फ्री) निचले लोगों को पुन: उपयोग करने के लिए चारों ओर लपेटता है, इसलिए आप अन्य मामलों में भी एक बच्चे के लिए कम PID प्राप्त कर सकते हैं।

मेरे सिस्टम पर डिफ़ॉल्ट अधिकतम पीआईडी ​​( /proc/sys/kernel/pid_max322) सिर्फ 32768 है, इसलिए यह उस स्थिति तक पहुंचना मुश्किल नहीं है जहां रैपराउंड होता है।

$ echo $$
27468
$ bash -c 'echo $$'
1296
$ bash -c 'echo $$'
1297

यदि आपका सिस्टम PID को रैंडम तरीके से आवंटित करना था ( जैसे OpenBSD प्रतीत होता है ) लगातार (लिनक्स की तरह) के बजाय, दो विकल्प होंगे। या तो यादृच्छिक विकल्प संभव पीआईडी ​​के पूरे स्थान पर बनाया गया था, जिस स्थिति में यह स्पष्ट होगा कि एक बच्चे की पीआईडी ​​माता-पिता की तुलना में कम हो सकती है। या, बच्चे के पीआईडी ​​को माता-पिता की पीआईडी ​​से अधिक मूल्यों से यादृच्छिक रूप से चुना जाएगा, जो औसतन इसे माता-पिता की पीआईडी ​​और अधिकतम के बीच आधे रास्ते में डाल देगा। पुनरावर्ती रूप से फोर्क करने की प्रक्रियाएं फिर जल्दी से अधिकतम तक पहुंच जाएंगी और हम ऊपर बताए गए बिंदुओं पर एक ही बिंदु पर होंगे: एक नए कांटे को सफल होने के लिए कम पीआईडी ​​का उपयोग करने की आवश्यकता होगी।


3
एफडब्ल्यूआईडब्ल्यू, वहां मौजूद सिस्टम हैं जहां पीआईडी ​​को यादृच्छिक रूप से आवंटित किया जाता है (उदाहरण के लिए ओपनबीएसडी पर डिफ़ॉल्ट रूप से), और मुझे यकीन है कि मैंने लिनक्स पर समान पीआईडी ​​आवंटन योजना देखी है (या कम से कम एक सुझाए गए देखा है)।
Kusalananda

@ कुसलानंद, हाँ, मुझे लगता है कि इसके बारे में एक सवाल है। मेरे पास इसे खोदने का समय नहीं है, लेकिन जहां तक ​​मुझे याद है, लिनक्स के लिए पैच जिसने यादृच्छिक पीआईडी ​​का चयन किया था वह पुराना था और अनावश्यक के रूप में छोड़ दिया गया था। हालांकि यह मायने नहीं रखता है: जब तक वहाँ (अपेक्षाकृत कम) अधिकतम पीआईडी ​​है, एक बार जब इसका उपयोग किया जाता है तो विकल्प कम पीआईडी ​​देने के लिए होते हैं, या कांटा पर एक त्रुटि छोड़ते हैं।
ilkachachu


2
@ मैसिमो, सुरक्षा पहलू पर इस सवाल पर चर्चा की गई है। सुरक्षा: क्या यादृच्छिक पीआईडी ​​अधिक सुरक्षा लाते हैं?
ilkachachu

1
@RonJohn, ठीक है, मैं नहीं जानता कि अन्य लिनक्स वहां क्या मूल्य रखते हैं, लेकिन यह परिवर्तनीय है, आप इसे 64-बिट सिस्टम पर लगभग 4 मिलियन (4194304, या 2 ^ 22) पर सेट कर सकते हैं। (यह एक संख्या है, बाइट्स की एक मात्रा नहीं है)
ilkkachu

8

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

http://cve.circl.lu/cve/CVE-2018-1121

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

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