2016-09-14 7 views
10

में विफल नहीं हुआ मैं एक librandom.so पुस्तकालय और एक main exectuable जो इस प्रकार संकलित किया गया है:

$ clang++ -o main main.o -lrandom -L. -Wl,-rpath,"\$ORIGIN" 

वे एक ही निर्देशिका में दोनों कर रहे हैं। चूंकि main में $ORIGIN है rpath में, यह ठीक काम करता है - ./main त्रुटियों के बिना रिटर्न देता है।

अब, मैं setuid रूप root साथ चलाने के लिए main सेट कर रहा हूं:

$ sudo chown root main 
$ sudo chmod a+s main 
$ ./main 

मैं main उम्मीद $ORIGIN के बाद से विफल setuid अनुप्रयोगों में विस्तार नहीं है। आश्चर्य की बात है, यह काम करता है।

अगर मैं एक और निर्देशिका से main चलाने, हालांकि, यह असफल अपेक्षा के अनुरूप कार्य करता है:

$ cd /tmp  
$ /path/to/main 
/path/to/main: error while loading shared libraries: librandom.so: cannot open shared object file: No such file or directory 

यह क्यों काम करता है जब मैं अपने युक्त निर्देशिका से main चला सकता हूँ?

उत्तर

2

मुझे मुख्य विफल होने की उम्मीद है क्योंकि $ ORIGIN सेटुइड अनुप्रयोगों में विस्तार नहीं किया गया है। आश्चर्य की बात है, यह काम करता है।

Glibc $ORIGIN का विस्तार भी SUID binaries के लिए की एक लंबा इतिहास रहा है (उदाहरण के लिए CVE-2010-3847 देखें)। इसके पीछे प्रेरणा यह है कि आरपीएथ के लिए $ORIGIN का उपयोग करने वाली सूड बाइनरीज़ डिज़ाइन द्वारा तोड़ दी गई हैं, इसलिए ग्लिब डेवलपर्स को इसे ठीक करने के लिए कभी भी परेशान नहीं किया गया था। कुछ डाउनस्ट्रीम डिस्ट्रोज़ ने स्टॉक ग्लिब के शीर्ष पर पैच प्रदान किए जो ओरीजिन-विस्तार को अक्षम करते हैं, इसलिए सटीक स्थिति आपके डिस्ट्रो पर निर्भर करती है।

मजेदार पर्याप्त, केवल मुक्त-खड़े $ORIGIN का विस्तार किया जाएगा - यदि आप इसे उदा। $ORIGIN/libs यह विफल होना शुरू हो जाएगा।

जब मैं अपनी निर्देशिका से मुख्य भागता हूं तो यह क्यों काम करता है?

एक बार जब आप अपनी फ़ाइल ले जाते हैं, तो $ ORIGIN अलग-अलग फ़ोल्डर में विस्तारित होगा जिसमें अब आवश्यक लाइब्रेरी नहीं है।

+0

दूसरे हिस्सों के संबंध में - मैं फ़ाइल को नहीं ले रहा हूं, बस वर्तमान निर्देशिका। '$ ORIGIN' निष्पादन योग्य के स्थान से संबंधित है, वर्तमान कार्यशील निर्देशिका नहीं। –

+0

दाएं। ऐसा लगता है कि उबंटू ग्लिबैक पैच के संस्करण का उपयोग करता है जो खाली स्ट्रिंग के लिए '$ ओरिजिन' का विस्तार करता है (उदाहरण के लिए [इस टिप्पणी] में वर्णित है (https://sourceware.org/bugzilla/show_bug.cgi?id=12393#c0))। डायनामिक लिंकर तब इसे सीडब्ल्यूडी के रूप में पेश करेगा जो व्यवहार की व्याख्या करेगा। आप शायद [डेवलपर्स को इसकी रिपोर्ट कर सकते हैं] (https://bugs.launchpad.net/ubuntu/) लेकिन मुझे संदेह है कि वे रुचि रखते हैं। – yugr

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