आप गलत प्रोग्राम चला सकते हैं। कोई आपको अपना कार्यक्रम चलाने के लिए तैयार कर सकता है।
-execdirकार्रवाई निर्देशिका है कि फाइल (रों) पाया शामिल से अपने आदेश चलाता है। जब $PATHरिश्तेदार पथ होते हैं, जैसे कि .या कुछ भी जो इसके साथ शुरू नहीं होता है/ , -execdirअसुरक्षित है क्योंकि एक निर्देशिका जहां एक फ़ाइल मिलती है (या इसके सापेक्ष किसी अन्य निर्देशिका को हल किया जाता है) में उसी नाम का निष्पादन योग्य हो सकता है जैसा कि आप कोशिश कर रहे हैं। चलाने के लिए। इसके बाद संभावित रूप से अविश्वसनीय निष्पादन योग्य बदले में चलाया जाएगा।
यह आपके प्रोग्राम को चलाने के लिए किसी अन्य उपयोगकर्ता द्वारा जानबूझकर शोषण किया जा सकता है, जिससे आप जिस प्रोग्राम को चलाने का प्रयास कर रहे हैं, उसके बजाय नुकसान या ब्रीच डेटा सिक्योरिटी हो सकती है। या, कम अक्सर, यह अनजाने में गलत कार्यक्रम चलाया जा सकता है, यहां तक कि किसी को भी समस्या को हल करने की कोशिश किए बिना।
यदि आपके PATHपर्यावरण चर में सब कुछ एक पूर्ण पथ है, तो यह त्रुटि तब भी नहीं होनी चाहिए, भले ही आप जिस निर्देशिका को खोज रहे हों और उसमें -execdirसे हैं, वह निहित है PATH। (मैंने जांच की है कि यह काम करता है।) यदि आपको लगता है कि आपके पास कोई रिश्तेदार निर्देशिका नहीं है, $PATHलेकिन फिर भी यह त्रुटि हो रही है, तो कृपया अपने प्रश्न को आउटपुट के विवरण सहित अपडेट करें echo "$PATH"।
एक ठोस उदाहरण।
क्या गलत हो सकता है, इसका एक उदाहरण के रूप में:
- ऐलिस
.उसके पास है $PATHक्योंकि वह चाहती है कि वह जिस भी निर्देशिका में cdहै, उसके नाम के साथ अपना नाम रखने की जहमत उठाए बिना कार्यक्रम चला सके ./।
- एलिस के उन्मादी ईव ने
/home/eve/sharedएलिस के साथ साझा किया है।
- ऐलिस
.cउसके साथ साझा की गई फाइलों पर आंकड़े (लाइनें, शब्द, बाइट्स) चाहती है।
तो ऐलिस चलाता है:
find ~eve/shared -name \*.c -execdir wc {} \;
दुर्भाग्य से ऐलिस के लिए, ईव ने अपनी खुद की स्क्रिप्ट बनाई है, इसे नाम दिया है wc, इसे निष्पादन योग्य ( chmod +x) सेट किया है , और इसे एक निर्देशिका के तहत गुप्त रूप से रखा है /home/eve/shared। ईव की स्क्रिप्ट इस तरह दिखती है:
#!/bin/sh
/usr/bin/wc "$@"
do_evil # Eve replaces this command with whatver evil she wishes to do
इसलिए जब ऐलिस ने फाइलों को चलाने के लिए उपयोग findकिया है तो ईव ने साझा किया है, और यह ईव की कस्टम स्क्रिप्ट के रूप में एक ही निर्देशिका में फाइलों के लिए मिलता है , ईव के रन - सभी ऐलिस विशेषाधिकार के साथ!-execdirwcwcwc
(चालाक होने के नाते, ईव ने wcसिस्टम के लिए एक रैपर के रूप में अपना स्क्रिप्ट एक्ट बनाया है wc, इसलिए ऐलिस को यह भी पता नहीं होगा कि कुछ गलत हो गया है, अर्थात, यह do_evilचलाया गया था। हालांकि, सरल - और भी अधिक परिष्कृत - विविधताएं संभव हैं। )
यह कैसे findरोकता है।
find-execdirजब $PATHकोई रिश्तेदार निर्देशिका होती है , तो कार्रवाई करने से इनकार करके इस सुरक्षा समस्या को होने से रोकता है ।
find विशिष्ट स्थिति के आधार पर दो नैदानिक संदेश प्रदान करता है।
यदि .में है $PATH, तो (जैसा कि आपने देखा है) यह कहता है:
find: The current directory is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove the current directory from your $PATH (that is, remove "." or leading or trailing colons)
यह शायद .केस के लिए एक विशेष संदेश है क्योंकि यह विशेष रूप से आम है।
यदि आपके अलावा कोई अन्य पथ .--say, foo- में दिखाई देता है $PATHऔर आप findसाथ चलते हैं -execdir, तो यह कहता है:
find: The relative path `foo' is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove that entry from $PATH
बेहतर है कि रिश्तेदार रास्ते $PATHबिल्कुल न हों।
में .या अन्य रिश्तेदार पथ होने का जोखिम $PATHविशेष रूप से एक उपयोगिता का उपयोग करते समय बढ़ जाता है जो स्वचालित रूप से निर्देशिका को बदलता है, यही कारण है कि findआप -execdirइस स्थिति में उपयोग नहीं होने देंगे ।
लेकिन रिश्तेदार रास्ते होने, विशेष रूप से ., अपने आप $PATHमें स्वाभाविक रूप से जोखिम भरा है और वास्तव में वैसे भी सबसे अच्छा बचा जाता है। उपरोक्त उदाहरण में काल्पनिक स्थिति पर विचार करें। मान लें कि दौड़ने के बजाय find, ऐलिस बस cdकरने के लिए ~eve/shared/blahऔर चलाता है wc *.c। यदि blahईव की wcस्क्रिप्ट होती है, तो do_evilवह ऐलिस के रूप में चलती है।