लिनक्स पर एक प्रक्रिया को अनजाना बनाएं


14

मैं एक पासवर्ड मैनेजर एप्लिकेशन पर काम कर रहा हूं, और सुरक्षा कारणों से मैं एक अनजानी प्रक्रिया शुरू करना चाहता हूं।

और इसके अलावा मैं नहीं चाहता कि यह कार्यक्रम एक डेमॉन हो क्योंकि मुझे मानक इनपुट से पढ़ने और इसे लिखने की आवश्यकता है।

क्या इसे करने का कोई तरीका है?


11
"सुरक्षा कारणों से मैं एक अनजानी प्रक्रिया शुरू करना चाहता हूं।" बस एक नोट - अगर यह अनुमति दी गई थी, तो लोग आसानी से नापाक कारणों से इसका शोषण कर सकते थे - उदाहरण के लिए, एक अजेय कांटा बम लॉन्च करें।
वीएलएजी

32
यह एक XY समस्या की तरह लगता है । मुझे संदेह है कि जो कुछ भी आप वास्तव में हासिल करने की कोशिश कर रहे हैं, एक अनजानी प्रक्रिया इसे करने का तरीका नहीं है। "सुरक्षा कारणों से" बहुत अस्पष्ट है। वास्तव में आप उपयोगकर्ता को क्या करने से रोकना चाहते हैं? उनकी क्या पहुँच है?
नैट एल्ड्रेडगे

4
कोई भी प्रक्रिया जो सभी इरादों और उद्देश्यों के लिए अनुपयुक्त है, एक वायरस है।
नत्फ़ुली के

3
@ NateEldredge: बल्कि, प्रोग्राम को संकेतों को अनदेखा करें। यह करने के लिए विशिष्ट तरीका है; अन्यथा, कोई व्यक्ति टर्मिनल को दरकिनार करते हुए सीधे एक SIGINT या SIGTSTP भेज सकता है।
नूह स्परियर

2
@NoahSpurrier: मैं एक ऐसी स्थिति की कल्पना कर रहा हूं जहां आपके पास एक उपयोगकर्ता है जो कंसोल पर चीजें टाइप कर सकता है, लेकिन जो अन्यथा कंप्यूटर पर कोड (जैसे कियोस्क) को निष्पादित नहीं कर सकता है। आप इसे स्थापित करते हैं ताकि कोई भी कुंजी जो वे टाइप कर सकें, एक अप्रत्याशित प्रभाव होगा। यदि वे अन्य कोड निष्पादित कर सकते हैं, तो SIGINT और SIGTSTP और SIGQUIT की अनदेखी करना मदद नहीं करता है; जो कोई भी उन संकेतों को सीधे प्रक्रिया में भेज सकता है वह SIGKILL या SIGSTOP भी भेज सकता है जिसे आप अनदेखा नहीं कर सकते।
नैट एल्ड्रेडज

जवाबों:


41

एक अलग उपयोगकर्ता और संभाल के तहत पासवर्ड प्रबंधक रन बनाने / उपेक्षा / ब्लॉक टर्मिनल-उत्पन्न संकेतों ( SIGINT, SIGQUIT, SIGHUP, SIGTSTP, SIGTTIN, और SIGTTOU)।

जब तक आपकी प्रभावी आईडी 0 (रूट) नहीं है, तब तक आप किसी भिन्न उपयोगकर्ता (उपयोगकर्ता जिसका वास्तविक यूआईडी और सेव्ड-सेट यूआईडी दोनों आपके अलग-अलग यूआईडी से अलग हैं) के तहत चलने वाली (= मार) प्रक्रियाओं को सिग्नल नहीं भेज सकते हैं।

सभी प्रक्रियाएँ अभी भी जड़ से मारनी होंगी।

निकट विवरण के लिए, मार (2) देखें


15

एक प्रक्रिया को अकल्पनीय बनाने का एकमात्र तरीका यह है कि इसे कर्नेल थ्रेड के रूप में लागू किया जाए , जो कि कुछ तुच्छ नहीं है।

आप अभी भी इसे मार सकते हैं लेकिन यह एक ओएस शटडाउन संपार्श्विक क्षति होगी।

आप एक कस्टम कर्नेल मॉड्यूल भी विकसित कर सकते हैं जो SIGNAL_UNKILLABLEध्वज को आपकी प्रक्रिया में सेट करेगा । इस ध्वज को केवल init(या systemdजो भी प्रारंभिक प्रक्रिया कर्नेल लॉन्च के लिए सेट किया गया है) डिज़ाइन किया गया है , जो केवल उपयोगकर्ता की प्रक्रिया है जो बिना शर्त हत्या के खिलाफ संरक्षित है लेकिन कुछ भी नहीं है कि ध्वज को एक नियमित प्रक्रिया के लिए मौजूद होने से मना किया जाए।


1
यह
muhmuhten

@muhmuhten आप सही कह रहे हैं, यह एक उपयोगकर्ता रहित प्रक्रिया है जिसे बिना शर्त हत्या के खिलाफ संरक्षित किया जा रहा है। यह हालांकि अनुकूलित करने के लिए डिज़ाइन नहीं किया गया है जबकि कर्नेल मॉड्यूल और थ्रेड्स के लिए निश्चित रूप से एक एपीआई है।
jlliagre

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

@jlliagre वास्तव में, यह नहीं है।
मुहुमथेन

@ डडेक एक अनजानी प्रक्रिया पहले से ही सामान्य रूप से अव्यावहारिक बढ़त का मामला है।
जुलियाग्रे

11

तकनीकी रूप से, इस प्रक्रिया को अकल्पनीय बनाने का कोई तरीका नहीं है।

बेशक, गैर-रूट उपयोगकर्ताओं के लिए वे केवल उन प्रक्रियाओं को मार सकते हैं जिनके पास एक ही उपयोगकर्ता आईडी है जो वे करते हैं, इसलिए यदि आप विभिन्न खाते बना सकते हैं तो आप प्रक्रिया के लिए "अद्वितीय" उपयोगकर्ता आईडी का उपयोग कर सकते हैं और फिर केवल रूट ही इसे मार सकता है।

एक सरल, लेकिन कम मजबूत, समाधान यह है कि आपकी प्रक्रिया को अधिक से अधिक संकेतों को पकड़ना है (शायद उन्हें अनदेखा कर रहा है)। यह केवल खिलौना उदाहरण या गैर-प्रतिकूल वातावरण के लिए उपयुक्त है क्योंकि KILL सिग्नल (सिग्नल 9) को पकड़ने का कोई तरीका नहीं है, लेकिन अन्यथा आप उनके द्वारा मारे जाने से बच सकते हैं।

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


1
लेकिन (इसके अलावा inittab) यह संभव है कि मॉनिटर प्रक्रिया को भी मारा जा सकता है, नहीं?
रोज़ा

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