`खोज -exec` का उपयोग करने में सुरक्षा मुद्दे और दौड़ की स्थिति क्या है?


14

से findआदमी पेज :

-exec command ;
    There are unavoidable security problems
    surrounding use of the -exec action; you should use the
    -execdir option instead.

-execdir command {} +
    Like -exec, but the specified command is run from the
    subdirectory containing the matched file, which is not
    normally the directory in which you started find.  This a much
    more secure method for invoking commands, as it avoids race
    conditions during resolution of the paths to the matched
    files.

इसका क्या मतलब है? शुरुआती निर्देशिका से इसे चलाने के साथ दौड़ की स्थिति क्यों हैं? और ये सुरक्षा जोखिम कैसे हैं?


सम्बंधित: लूपिंग का आउटपुट खराब अभ्यास से अधिक क्यों है? जहां कुछ उत्तरों में कवर किया गया है।
स्टीफन चेजलस

जवाबों:


13

यहाँ विवरण मिला :

-execकार्रवाई एक अन्य कार्यक्रम चलाने के लिए कारण बनता है। यह प्रोग्राम में उस फ़ाइल का नाम देता है जिसे उस समय माना जा रहा है। आह्वान किया गया कार्यक्रम आम तौर पर उस फ़ाइल पर कुछ कार्रवाई करेगा। एक बार फिर, एक दौड़ की स्थिति है जिसका फायदा यहां उठाया जा सकता है। हम एक विशिष्ट उदाहरण के रूप में कमांड लेंगे

 find /tmp -path /tmp/umsp/passwd -exec /bin/rm

इस सरल उदाहरण में, हम केवल एक फ़ाइल को हटाने के लिए पहचान रहे हैं और /bin/rmइसे हटाने के लिए आमंत्रित कर रहे हैं। एक समस्या मौजूद है क्योंकि बिंदु के बीच एक समय अंतराल है जहां पता चलता है कि उसे -execकार्रवाई की प्रक्रिया करने की आवश्यकता है और वह बिंदु जहां /bin/rmकमांड वास्तव में फाइलसिस्टम से फाइल को हटाने के लिए अनलिंक () सिस्टम कॉल जारी करता है। इस समयावधि के भीतर, एक हमलावर /tmp/umsp निर्देशिका का नाम बदल सकता है , इसे एक प्रतीकात्मक लिंक के साथ बदल सकता है /etc/bin/rmयह निर्धारित करने का कोई तरीका नहीं है कि यह उसी फ़ाइल पर काम कर रहा है जो कि मन में थी। एक बार प्रतीकात्मक लिंक होने के बाद, हमलावर ने /etc/passwdफ़ाइल को हटाने का कारण ढूंढने के लिए राजी कर लिया है, जो कि वास्तव में लागू किए गए कमांड द्वारा लक्षित प्रभाव नहीं है।

यकीन नहीं होता कि कोई भी कभी भी इसका फायदा उठा सकता है; लेकिन मुझे लगता है कि वहाँ जवाब है!


उपरोक्त मामले में, कमांड चलाने execdirसे /tmp/umspपहले पहली बार chdir होगा , और इसलिए सैद्धांतिक रूप से, डाइरेक्टरी को रिस्क करने वाले किसी भी डिरेक्टर का कोई असर नहीं होगा .. अगर रिलिंकिंग का मूल्यांकन करने के लिए "निर्णय" लेने के बाद हुआ है, -execलेकिन इससे पहले कि rmकमांड अपना काम कर सके। लेकिन मुझे आश्चर्य है कि इससे क्या फर्क पड़ेगा: उपयोगकर्ता द्वारा findकमांड लिखने का फैसला करने के बाद हमलावर केवल राहत कर सकता है ।
ओथियस

1
@RuiFRibeiro लिंक यह तर्क नहीं है कि कमांड को पास किया गया है, यह एक मध्यवर्ती निर्देशिका है। /tmp/umspएक निर्देशिका है जब findइसे देखता है, लेकिन जब rmचलाता है, तो हमले ने इसे एक प्रतीकात्मक लिंक के रूप में बदल दिया है /etc/tmp/umsp/passwdसभी के साथ एक नियमित फ़ाइल है, लेकिन एक ही नहीं है।
गिल्स एसओ- बुराई को रोकें '

2

मेरा मानना ​​है कि कारण -execखतरनाक है, क्योंकि यदि उपयोगकर्ता निष्पादित होने वाले प्रोग्राम का पूरा नाम और पथ निर्दिष्ट नहीं करेगा, तो यह संभवतः गलत प्रोग्राम को निष्पादित करेगा।

उदाहरण:

find /some/path -exec coolprogram

में /some/path, किसी ने दूसरा बनाया coolprogram, और यह आपके सभी डेटा को किसी बुरे अभिनेता को अपलोड करता है।

लेकिन रुकिए, आप कहते हैं, क्या आपको इसे अंजाम नहीं देना है ./coolprogram? हां, लेकिन कुछ लोगों के पास है PATH=.:/bin:whatever, जो वर्तमान निर्देशिका में कार्यक्रम को निष्पादित करेगा।

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


3
इन जोखिमों को अलग नहीं किया जाता है find -exec। अगर आपने .अपने रास्ते पर रखा है तो बस अमल करेंcoolprogram अपने वर्तमान डायर में करना पहले से ही खतरनाक है, चाहे आप findइसे करने के लिए उपयोग करें या नहीं!
डैनी Tupeny

1
सहमत हो गए, लेकिन ऐसा लगता है कि -सेक्स की स्थिति उस स्थिति के लिए देखती है जिसका मैंने उल्लेख किया था:The ‘-execdir’ action refuses to do anything if the current directory is included in the $PATH environment variable. This is necessary because ‘-execdir’ runs programs in the same directory in which it finds files – in general, such a directory might be writable by untrusted users. For similar reasons, ‘-execdir’ does not allow ‘{}’ to appear in the name of the command to be run.
डग

मुझे लगता है कि कहानी की नैतिकता वह है। आपके रास्ते में एक बुरा विचार भी है, यही कारण है कि मुझे यकीन है कि यह वहाँ नहीं है।
डग

.रास्ते {}में और कमांड में नापसंद के बारे में जानना दिलचस्प है । हो सकता है कि भविष्य में लिनक्स .पूरी तरह से पूरी तरह से निषिद्ध होगा और उपकरणों को अपनी सुरक्षा जांच को लागू करने की आवश्यकता नहीं होगी! :)
डैनी टुप्नेनी

1
मुझे लगता है कि मेरे द्वारा लिखे गए 90% कोड केवल 5% चीजों को पकड़ने के लिए हैं जो गलत हैं। :)
डग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.