2012-02-10 17 views
6

के साथ एलडी_PRELOAD मैं एक पुस्तकालय को प्रीलोड करने के लिए LD_PRELOAD का उपयोग करने की कोशिश कर रहा हूं जिसमें सेटुइड अनुमतियां हैं। पहली बार में LD_PRELOAD की कोशिश की, और ऐसा लग रहा था जैसे कि यह setuid बाइनरी के साथ पर ध्यान नहीं दिया जा रहा था, हालांकि यह काम कर रहा था जब मैं ls की तरह दूसरों के साथ की कोशिश की, dir आदिसेटयूड बाइनरी

LD_PRELOAD के प्रलेखन से:

LD_PRELOAD 
      A whitespace-separated list of additional, user-specified, ELF shared 
      libraries to be loaded before all others. This can be used to 
      selectively override functions in other shared libraries. For set- 
      user-ID/set-group-ID ELF binaries, only libraries in the standard 
      search directories that are also set-user-ID will be loaded. 

मैंने पुस्तकालय को /usr/lib, /usr/local/lib, और /usr/lib64 पर उपरोक्त इस दस्तावेज़ के अनुसार सेटयूड अनुमतियों के साथ रखने की कोशिश की, लेकिन यह अभी भी काम नहीं कर रहा है। अगर मैं LD_PRELOAD उस मामले में एक पथ नहीं देता जहां मेरे पास सेटयूड के साथ मानक डीआईआरएस में लाइब्रेरी है, तो यह लाइब्रेरी नहीं लग रहा है। अगर मैं इसे रास्ता देता हूं, तो यह कुछ भी नहीं करता है।

सेटुइड बाइनरी एक मूल अनुमति बाइनरी है जो गैर रूट उपयोगकर्ता खोल में चलता है। कोई विचार? निश्चित नहीं है कि क्या मुझे पथ खो रहा है, एक पर्यावरण परिवर्तनीय है, या मैं ऊपर दिए गए दस्तावेज को गलत समझ रहा हूं।

संपादित: अनुमतियों का अनुरोध किया हैं:

लाइब्रेरी:

-rwsr-sr-x 1 root root 72580 2012-02-10 07:51 

ऐप:

-rwsr-xr-x 1 root root 137517601 2012-02-10 

env | grep LD 
LD_LIBRARY_PATH=/usr/lib (I added this manually myself, usually LD_LIBRARY_PATH is empty) 
+0

क्या आप SELinux चला रहे हैं? –

+0

हां, सूज़ एंटरप्राइज़ 11.1 वह है जो मैं वर्तमान में चल रहा हूं .. –

+2

यह आखिरकार काम करता था। परीक्षणों के पूरे सेट में, मैंने कुछ गड़बड़ करनी होगी। इसे lib64 में सही अनुमतियों (setuid) के साथ डालकर और LD_PRELOAD को पथ प्रदान नहीं किया। मदद के लिए आप सभी का धन्यवाद! –

उत्तर

-1

जैसे आपके lib स्थापित करें:

  • locat आयन:/lib या/usr/lib
  • अनुमतियाँ: जड़: जड़
  • setuid और

यकीन LD_PRELOAD बनाने पर setgid अपने वातावरण को निर्यात किया जाता है

$ export LD_PRELOAD=/usr/lib/yourlib.so 
$ env | grep LD_PRELOAD # verify 

फिर अपने कार्यक्रम चलाने ।

+0

यह काम नहीं करता है, और यह _all_ ऐप्स पर लाइब्रेरी पर लागू होता है। मैं इस ऐप के लिए इसे प्रीलोड करने के लिए एलडी_PRELOAD = ... ऐपनाम का उपयोग करने की कोशिश कर रहा था। एक प्रयोग के रूप में, मैंने अपने स्वयं के डीआईआर में एलएस की प्रतिलिपि बनाई, और इसमें सेटुइड अनुमतियां जोड़ दीं (chmod u + s ./ls)। मेरी लाइब्रेरी पहले एलएस के साथ काम करने के लिए प्रयुक्त होती है, इस स्थानीय अनुमतियों के साथ काम नहीं करती है। अब एक और प्रयोग के रूप में, मैंने lib को /etc/ld.so.preload में जोड़ने की कोशिश की, और यह काम करता है, लेकिन फिर से, यह सब के लिए एप्स। मैं चाहता था कि यह एलडी_PRELOAD = .. यदि संभव हो तो ऐपनाम के साथ काम करना चाहता है। –

+0

क्या आप अपने lib और अपने प्रोग्राम पर 'ls -lad' के परिणाम दिखाने के साथ-साथ' env | grep ld' 'के परिणाम दिखाने के लिए संपादित कर सकते हैं? –

+0

संपादन जोड़ा गया। आपकी मदद के लिए धन्यवाद! बस एक और स्पष्टीकरण, जब मैं इसे /etc/ld.so.preload में डालता हूं, तो मेरा ऐप भी lib के साथ काम करता प्रतीत होता है, यह सिर्फ सभी ऐप्स के लिए काम करता है। शायद कुछ चेक करता है LD_PRELOAD के हिस्से के रूप में लोडर ld.so.preload केस में छोड़ा जाता है। साथ ही, जब मैं रूट के रूप में sudo और चलाता हूं, LD_PRELOAD मेरे ऐप के साथ काम करता है, लेकिन मैं ऐप को दुर्भाग्य से रूट के रूप में नहीं चला सकता। यह एक त्वरित प्रयोग था। –

3

यदि आप SELinux का उपयोग कर रहे हैं, तो यह इसके कारण हो सकता है। ईएलएफ सहायक वैक्टरों में से एक जो ग्लिबैक का समर्थन करता है AT_SECURE है। यह विशेष पैरामीटर (जो डिफ़ॉल्ट रूप से 0 या 1 है) ईएलएफ गतिशील लिंकर को विभिन्न पर्यावरण चरों को अनसेट करने के लिए बताता है जिन्हें आपके सिस्टम के लिए संभावित रूप से हानिकारक माना जाता है। इनमें से एक LD_PRELOAD है। आम तौर पर, यह पर्यावरण स्वच्छता तब की जाती है जब एक सेटयूड/सेटजीड एप्लिकेशन कहा जाता है (स्पष्ट भेद्यता को रोकने के लिए)। SELinux ने इस स्वच्छता को भी बढ़ाया जब भी कोई एप्लिकेशन SELinux में डोमेन संक्रमण को ट्रिगर कर रहा है (sysadm_t से mozilla_tmoz लेबल वाली बाइनरी के माध्यम से कहें); SELinux लोड किए गए एप्लिकेशन के लिए AT_SECURE ध्वज सेट करता है (उदाहरण में, मोज़िला/फ़ायरफ़ॉक्स)।

noatsecure अनुमति किसी विशेष संक्रमण के लिए पर्यावरण स्वच्छता गतिविधि को अक्षम करता है। आप निम्न की अनुमति बयान के माध्यम से यह कर सकते हैं (जैसा कि उदाहरण पर ऊपर लागू होगा):

allow sysadm_t mozilla_t:process { noatsecure }; 
+0

क्या सेलिनक्स सुरक्षा बढ़ाया लिनक्स या संदिग्ध उद्यम है? मैं बाद वाले भाग रहा हूं। क्या आप पुरुष हैं tioned अभी भी suse उद्यम के लिए आवेदन करते हैं? –

+0

[इस] के अनुसार (http://news.opensuse.org/2008/08/20/opensuse-to-add-selinux-basic-enablement-in-111/) SELinux 11.1 के साथ शुरू होने वाले एसयूएसई एंटरप्राइज़ में एक विकल्प है । यदि आप इसका उपयोग नहीं कर रहे हैं, हालांकि, मेरा जवाब लागू नहीं होता है। –

+0

जो मैं देख सकता हूं, मैं सेलिनक्स नहीं चला रहा हूं। मैं किसी भी सामान्य selinux विन्यास विकल्प नहीं देखता। मैंने AppArmour देखा था, लेकिन यह भी अक्षम है। –

7

LD_PRELOAD setuid के साथ नहीं किया जा सकता। यह लिनक्स में एक सुरक्षा सुविधा है। संदर्भ के लिए this article,के उदाहरण पर कस्टम कोड के साथ कुछ लाइब्रेरी कॉल को प्रतिस्थापित करने के लिए LD_PRELOAD का उपयोग करने के तरीके के बारे में विस्तार से पता चलता है।

संबंधित मुद्दे