PATH में जो डायरेक्टरी है उसके लिए '-execdir' एक्शन असुरक्षित का उपयोग क्यों कर रहा है?


19

-execdirउपयोग -execनहीं करते हुए खोज की कार्रवाई के संयोजन का उपयोग करना असुरक्षित क्यों है ?

जब मैं नीचे कमांड चला रहा हूं तो मुझे निम्नलिखित संकेत संदेश मिल रहा है:

/path/to/currentDir/$ find . -type f -name 'partOfFileNames*' -execdir rm -- {} +

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)

इस संकेत के प्रकट होने का क्या कारण हो सकता है?

जवाबों:


22

आप गलत प्रोग्राम चला सकते हैं। कोई आपको अपना कार्यक्रम चलाने के लिए तैयार कर सकता है।

-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वह ऐलिस के रूप में चलती है।


2
मुझे नहीं पता कि आपने इससे पहले सुना है कि आप एक बहुत अच्छा शिक्षक बना देंगे :)
heemayl

5
@heemayl उन सभी को जो नेट पर उपयोगी सामान लिखते हैं, पहले से ही शिक्षक हैं :-)
Ciro Santilli 新疆 all all all

5

यहाँ बहुत विस्तृत जानकारी है । एक और उत्कृष्ट संदर्भ यहाँ है । पहले संदर्भ से उद्धृत करने के लिए:

विकल्प -execdir एक और अधिक आधुनिक विकल्प है जिसे GNU खोज में पेश किया गया है, यह एक और अधिक सुरक्षित संस्करण बनाने का प्रयास है। यह दो महत्वपूर्ण वृद्धि के साथ एक ही अर्थ के रूप में है:

यह हमेशा फ़ाइल को पूर्ण पथ प्रदान करता है (फ़ाइल के सापेक्ष पथ का उपयोग वास्तव में -exec के मामले में खतरनाक है)।

निरपेक्ष पथ प्रदान करने के अलावा, यह सुरक्षा के लिए पैठ चर की भी जाँच करता है (यदि PATH env चर में डॉट मौजूद है, तो आप गलत निर्देशिका से निष्पादन योग्य चुन सकते हैं)

दूसरे संदर्भ से:

यदि मौजूदा निर्देशिका को $ PATH परिवेश चर में शामिल किया जाता है, तो '-execdir' कार्रवाई कुछ भी करने से इनकार करती है। यह आवश्यक है क्योंकि '-execdir' उसी निर्देशिका में प्रोग्राम चलाता है जिसमें वह फाइलें ढूंढता है - सामान्य रूप से, ऐसी निर्देशिका अविश्वसनीय उपयोगकर्ताओं द्वारा लिखी जा सकती है। इसी तरह के कारणों के लिए, '-execdir' कमांड चलाने के लिए '{}' को प्रकट करने की अनुमति नहीं देता है।


क्या आप अपना जवाब विस्तारित कर सकते हैं कि "यदि PATH env वैरिएबल में डॉट मौजूद है, तो आप गलत निर्देशिका से निष्पादन योग्य पिक कर सकते हैं" ? कौन सी गलत निर्देशिका ? और हमें इसे सुरक्षित बनाने के लिए क्यों करना है ? धन्यवाद
αғsнιη

मुझे उम्मीद है कि मेरी अपडेट की गई पोस्ट की दूसरी कड़ी आपके सवाल का जवाब देगी
Ron

3

मुख्य समस्या सिस्टम वैरिएबल के मूल्य के साथ है PATHजिसमें इसमें रिश्तेदार फ़ोल्डर शामिल हैं, इसलिए सुरक्षा कारणों से findआदेश आपको बायनेरिज़ को निष्पादित करने की अनुमति नहीं देगा, क्योंकि संभवतः यह गलत कार्यक्रमों को निष्पादित कर सकता है।


उदाहरण के लिए, यदि आपको चेतावनी के अनुसार अपने पेट में अपना वर्तमान डायर है:

वर्तमान निर्देशिका पैठ पर्यावरण चर में शामिल है।

और आप अपना कमांड चलाएंगे:

find . -type f -name 'partOfFileNames*' -execdir rm -- {} +

यदि आपके पास इसमें स्थानीय स्क्रिप्ट ( rmनिष्पादन योग्य झंडे के साथ) rm -fr /है, तो यह आपकी सभी फ़ाइलों को हटा सकता है, क्योंकि अपेक्षित निष्पादन के बजाय /bin/rm, आप rmवर्तमान dir से निष्पादित करेंगे , इसलिए शायद यह वह नहीं है जो आप चाहते थे।


एक साइड नोट के रूप में, यह ट्रैविस CI ( GH # 2811 ) में ज्ञात समस्या है जब यह त्रुटि के साथ विफल होता है:

खोज: सापेक्ष पथ `./node_modules/.bin 'PATH पर्यावरण चर में शामिल है, जो खोज की -execdir कार्रवाई के साथ संयोजन में असुरक्षित है। कृपया उस प्रविष्टि को $ PATH से हटा दें

तो इसका उपाय है कि PATH वैरिएबल से प्रभावित प्रविष्टि को हटाया जाए, जैसे

PATH=`echo $PATH | sed -e 's/:\.\/node_modules\/\.bin//'`

के रूप में drogus द्वारा प्रस्तावित । इस बग की प्रगति, GH # 4862 पर अनुसरण की जा सकती है ।


यहाँ बैश संस्करण वर्कअराउंड है:

PATH=${PATH//:\.\/node_modules\/\.bin/}

उदाहरण का उपयोग ( PATHविशिष्ट कमांड में फ़िल्टर किया गया):

env PATH=${PATH//:\.\/node_modules\/\.bin/} find . -type f

यहाँ एक sedऐसा लगता है जो सभी चीजों को हटाना findपसंद नहीं करता है: askubuntu.com/questions/621132/…
Ciro Santilli Sant to to to

3

xargsऔर bash -c cdसमाधान

ठीक है मैं हार मानता हूँ:

find . -type f |
  xargs -I '{}' bash -c 'cd "$(dirname "{}")" && pwd && echo "$(basename "{}")"'

sed वैकल्पिक हल

पिछले वर्कअराउंड से थोड़ा कम अच्छा:

PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" find . -execdir echo '{}' \;

एक टेस्टकेस:

[ "$(printf '/a/b::c/d:/e/f\n' | sed -E 's/(^|:)[^\/][^:]*//g')" = '/a/b:/e/f' ] || echo fail

के लिए rename: विशेष रूप से, आप भी कुछ पर्ल regex फू के साथ काम कर सकते हैं /programming/16541582/finding-multiple-files-recursively-and-renaming-in-linux/54163971#54163971

RTFS उम्मीद को कुचल रहा है

उन लोगों के लिए, जिन्हें उम्मीद है कि findराय की अनदेखी करने का एक तरीका मौजूद है , मुझे कुछ स्रोत के साथ कुचलने दें:

इससे हम देखते हैं कि चेकिंग पथ को बंद करने का कोई तरीका नहीं है।

यह जाँच करता है कि सटीक नियम है: असफल अगर PATHया तो खाली है या साथ शुरू नहीं होता है /

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.