आप गलत प्रोग्राम चला सकते हैं। कोई आपको अपना कार्यक्रम चलाने के लिए तैयार कर सकता है।
-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
किया है तो ईव ने साझा किया है, और यह ईव की कस्टम स्क्रिप्ट के रूप में एक ही निर्देशिका में फाइलों के लिए मिलता है , ईव के रन - सभी ऐलिस विशेषाधिकार के साथ!-execdir
wc
wc
wc
(चालाक होने के नाते, ईव ने 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
वह ऐलिस के रूप में चलती है।