लिनक्स सभी व्याख्या किए गए निष्पादनों (यानी एक #!
पंक्ति से शुरू होने वाले निष्पादनयोग्य ) पर सेतु के बिट को अनदेखा करता है । Comp.unix.questions पूछे जाने वाले प्रश्न setuid शेल स्क्रिप्ट की सुरक्षा संबंधित समस्याओं बताते हैं। ये समस्याएं दो प्रकार की होती हैं: शेबंग-संबंधी और शेल-संबंधित; मैं नीचे अधिक विवरण में जाता हूं।
यदि आप सुरक्षा के बारे में परवाह नहीं करते हैं और लिनक्स के तहत सेटिड स्क्रिप्ट की अनुमति देना चाहते हैं, तो आपको कर्नेल को पैच करना होगा। 3.x कर्नेल के रूप में, मुझे लगता है कि आपको कॉल करने install_exec_creds
से load_script
पहले फ़ंक्शन में कॉल जोड़ने की आवश्यकता है open_exec
, लेकिन मैंने परीक्षण नहीं किया है।
सेतुबंध शबंग
#!
आमतौर पर शबंग ( ) को लागू करने के लिए एक दौड़ की स्थिति निहित है :
- कर्नेल निष्पादन योग्य खोलता है, और पाता है कि यह इसके साथ शुरू होता है
#!
।
- कर्नेल निष्पादन योग्य बंद कर देता है और दुभाषिया खोलता है।
- कर्नेल स्क्रिप्ट को तर्क सूची (एस
argv[1]
) के लिए पथ सम्मिलित करता है , और दुभाषिया को निष्पादित करता है।
यदि इस कार्यान्वयन के साथ सेतु लिपियों की अनुमति दी जाती है, तो एक हमलावर मौजूदा सैटिड लिपि में एक प्रतीकात्मक लिंक बनाकर, इसे निष्पादित करते हुए, और कर्नेल के चरण 1 के बाद और दुभाषिया के चारों ओर हो जाने से पहले लिंक को बदलने की व्यवस्था करके एक मनमानी स्क्रिप्ट को लागू कर सकता है। अपना पहला तर्क। इस कारण से, अधिकांश यूनियनों ने सेतुंग बिट को अनदेखा कर दिया, जब वे एक शेबंग का पता लगाते हैं।
इस कार्यान्वयन को सुरक्षित करने का एक तरीका यह होगा कि कर्नेल स्क्रिप्ट फ़ाइल को तब तक लॉक करे जब तक कि इंटरप्रेटर ने इसे न खोल दिया हो (ध्यान दें कि इससे न केवल फ़ाइल को अनलिंक या ओवरराइट करने से रोका जाना चाहिए, बल्कि पथ में किसी भी निर्देशिका का नाम बदल दिया जाना चाहिए)। लेकिन यूनिक्स सिस्टम अनिवार्य ताले से दूर भागते हैं, और प्रतीकात्मक लिंक एक सही लॉक सुविधा को विशेष रूप से कठिन और आक्रामक बना देते हैं। मुझे नहीं लगता कि कोई भी इस तरह से करता है।
कुछ यूनिक्स सिस्टम (मुख्य रूप से ओपनबीएसडी, नेटबीएसडी और मैक ओएस एक्स, जिनमें से सभी को कर्नेल सेटिंग को सक्षम करने की आवश्यकता होती है) एक अतिरिक्त सुविधा का उपयोग करके सुरक्षित सेतुंग को लागू करें : पथ फ़ाइल डिस्क्रिप्टर एन पर पहले से खोली गई फ़ाइल को संदर्भित करता है (इसलिए उद्घाटन है) लगभग बराबर )। कई यूनिक्स सिस्टम (लिनक्स सहित) में स्क्रिप्ट सेट नहीं है।/dev/fd/N
/dev/fd/N
dup(N)
/dev/fd
- कर्नेल निष्पादन योग्य खोलता है, और पाता है कि यह इसके साथ शुरू होता है
#!
। मान लें कि निष्पादन योग्य के लिए फ़ाइल विवरणक 3 है।
- कर्नेल दुभाषिया खोलता है।
- कर्नेल
/dev/fd/3
तर्क सूची (जैसा argv[1]
) को सम्मिलित करता है , और दुभाषिया को निष्पादित करता है।
स्वेन मस्कैच के शेबबैंग पेज में यूनियनों के बारे में बहुत सारी जानकारी है, जिसमें सेतु समर्थन भी शामिल है ।
सेतुवाद व्याख्याकार
मान लें कि आप अपने प्रोग्राम को रूट के रूप में चलाने में कामयाब रहे हैं, क्योंकि या तो आपका ओएस सेट्युड शेबेंग का समर्थन करता है या क्योंकि आपने एक देशी बाइनरी आवरण (जैसे कि sudo
) का उपयोग किया है। क्या आपने सुरक्षा छेद खोला है? हो सकता है । यहाँ समस्या बनाम संकलित कार्यक्रमों की व्याख्या नहीं है। मुद्दा यह है कि क्या आपका रनटाइम सिस्टम विशेषाधिकारों के साथ निष्पादित होने पर सुरक्षित व्यवहार करता है।
किसी भी गतिशील रूप से जुड़े देशी बाइनरी निष्पादन योग्य एक तरह से गतिशील लोडर (जैसे /lib/ld.so
) द्वारा व्याख्या की जाती है , जो प्रोग्राम द्वारा आवश्यक गतिशील पुस्तकालयों को लोड करता है। कई यूनियनों पर, आप पर्यावरण के माध्यम से गतिशील पुस्तकालयों के लिए खोज पथ को कॉन्फ़िगर कर सकते हैं ( LD_LIBRARY_PATH
पर्यावरण चर के लिए एक सामान्य नाम है), और यहां तक कि सभी निष्पादित बायनेरिज़ ( LD_PRELOAD
) में अतिरिक्त पुस्तकालयों को लोड करें । कार्यक्रम के हमलावर को विशेष रूप से तैयार की libc.so
गई $LD_LIBRARY_PATH
(अन्य रणनीति के बीच) रखकर उस कार्यक्रम के संदर्भ में मनमाना कोड निष्पादित किया जा सकता है । सभी समझदार सिस्टम LD_*
सेतु निष्पादन में चर को अनदेखा करते हैं ।
में गोले ऐसे श, csh और डेरिवेटिव के रूप में, वातावरण चर स्वचालित रूप से खोल पैरामीटर बन जाते हैं। जैसे मानकों के माध्यम से PATH
, IFS
, और कई और अधिक, स्क्रिप्ट की invoker शेल स्क्रिप्ट के संदर्भ में मनमाने ढंग से कोड निष्पादित करने के लिए कई अवसर हैं। कुछ गोले इन चरों को सेट करने के लिए डिफॉल्ट करते हैं यदि वे पता लगाते हैं कि स्क्रिप्ट को विशेषाधिकारों के साथ लागू किया गया है, लेकिन मुझे नहीं पता कि कोई विशेष कार्यान्वयन है जिस पर मुझे भरोसा होगा।
अधिकांश रनटाइम वातावरण (चाहे मूल, बाइटकोड या व्याख्या की गई) में समान विशेषताएं हैं। कुछ लोग सेतु के निष्पादन में विशेष सावधानी बरतते हैं, हालांकि देशी कोड चलाने वाले अक्सर डायनेमिक लिंकिंग (जो सावधानी बरतते हैं) की तुलना में कुछ भी नहीं करते हैं।
पर्ल एक उल्लेखनीय अपवाद है। यह स्पष्ट रूप से एक सुरक्षित तरीके से सेतु लिपियों का समर्थन करता है । वास्तव में, आपकी स्क्रिप्ट सेटिउड चला सकती है, भले ही आपके ओएस ने स्क्रिप्ट पर सेट बिट को अनदेखा किया हो। इसका कारण यह है कि एक सेटलिड रूट हेल्पर के साथ पर्ल जहाज जो आवश्यक जांच करता है और वांछित विशेषाधिकारों के साथ वांछित स्क्रिप्ट पर दुभाषिया को फिर से स्थापित करता है। यह पर्ल्सेक मैनुअल में समझाया गया है । ऐसा लगता है कि सेतु पर्ल लिपियों के #!/usr/bin/suidperl -wT
बजाय की जरूरत है #!/usr/bin/perl -wT
, लेकिन अधिकांश आधुनिक प्रणालियों पर, #!/usr/bin/perl -wT
पर्याप्त है।
ध्यान दें कि इन समस्याओं को रोकने के लिए देशी बाइनरी रैपर का उपयोग करना अपने आप में कुछ नहीं है । वास्तव में, यह स्थिति को बदतर बना सकता है, क्योंकि यह आपके रनटाइम वातावरण को यह पता लगाने से रोक सकता है कि यह विशेषाधिकारों के साथ लगाया गया है और इसके रनटाइम कॉन्फ़िगरेशन को दरकिनार कर सकता है।
एक देशी बाइनरी रैपर एक शेल स्क्रिप्ट को सुरक्षित बना सकता है यदि आवरण पर्यावरण को सुरक्षित करता है । स्क्रिप्ट का ध्यान रखना चाहिए कि बहुत अधिक धारणाएं न बनें (उदाहरण के लिए वर्तमान निर्देशिका के बारे में) लेकिन ऐसा होता है। आप इसके लिए sudo का उपयोग कर सकते हैं बशर्ते कि यह पर्यावरण को साफ करने के लिए स्थापित हो। ब्लैकलिस्टिंग वैरिएबल त्रुटि-प्रवण है, इसलिए हमेशा श्वेतसूची। सुडो के साथ, सुनिश्चित करें कि env_reset
विकल्प चालू है, वह setenv
बंद है, और वह env_file
और env_keep
केवल सहज चर हैं।
टी एल, डी आर:
- सैट्यूड शेबंग असुरक्षित है लेकिन आमतौर पर इसे नजरअंदाज कर दिया जाता है।
- यदि आप विशेषाधिकारों (या तो sudo या setuid के माध्यम से) के साथ कोई प्रोग्राम चलाते हैं, तो मूल कोड या पर्ल लिखें, या प्रोग्राम को एक रैपर से शुरू करें जो पर्यावरण को साफ करता है (जैसे कि
env_reset
विकल्प के साथ sudo )।
¹ इस चर्चा समान रूप से लागू करता है, तो आप "setgid" "setuid" के लिए स्थानापन्न; वे दोनों स्क्रिप्ट पर लिनक्स कर्नेल द्वारा नजरअंदाज कर रहे हैं