पर्यावरण चर में कार्यों को परिभाषित करने की क्षमता अपने आप में सुरक्षा जोखिम क्यों नहीं है?


9

जैसा कि मैं इसे समझता हूं, आम तौर पर किसी को पर्यावरण चर में संग्रहीत जानकारी प्रदान करने के लिए सुरक्षित माना जाता है। शेलशॉक भेद्यता यहां एक मुद्दा है क्योंकि इसका मतलब है कि पर्यावरण चर के अंदर एक फ़ंक्शन परिभाषा के अंत में कोड को मार दिया जाएगा जब बैश का एक नया उदाहरण लॉन्च होता है और आप स्पष्ट रूप से किसी को भी अपने सर्वर पर कृपया किसी भी कोड को चलाने के लिए नहीं चाहते हैं। । फ़ंक्शन परिभाषाएँ स्वयं स्पष्ट रूप से सुरक्षा जोखिम नहीं हैं, हालांकि उन्हें अनुमति दी जाती है क्योंकि उन्हें अपने कोड को निष्पादित करने के लिए स्पष्ट रूप से बुलाया जाना है।

मेरा सवाल यह है कि एक दुर्भावनापूर्ण उपयोगकर्ता केवल एक फ़ंक्शन को परिभाषित क्यों नहीं कर सकता, जैसे कि एक सामान्य आदेश के रूप में उनके दुर्भावनापूर्ण कोड lsऔर फिर उम्मीद है कि स्क्रिप्ट (या जो कुछ भी चल रहा है) इस कमांड का उपयोग किसी बिंदु पर करेगा?

मेरे मन में जो है उसका एक उदाहरण:

$ export ls='() { echo "doing bad things..."; }'
$ bash -c ls
doing bad things...

जवाबों:


10

यह एक सुरक्षा जोखिम है। इसलिए आम तौर पर आप इसे किसी अन्य संदर्भ (सिस्टम के रिमोट कंट्रोल, बदलते उपयोगकर्ता आदि) पर स्विच करते समय नहीं कर सकते।

यदि आप अपने इच्छित किसी भी पर्यावरण चर को बनाने की क्षमता रखते हैं, तो ऐसे कई संभावित तरीके हैं जिनसे आप मनमाना कोड निष्पादित कर सकते हैं। एक उदाहरण के रूप में
लें $LD_PRELOAD। यदि आपके पास उस चर को सेट करने की क्षमता है, तो आप लाइब्रेरी फ़ंक्शंस को प्रतिस्थापित कर सकते हैं, और अपना कोड वहां चिपका सकते हैं। आप $DISPLAYवैरिएबल सेट कर सकते हैं , और एक्स डिस्प्ले को रीडायरेक्ट कर सकते हैं जिससे प्रोग्राम कनेक्ट होता है ताकि आपको ऐप पर नियंत्रण मिल सके।

यही कारण है कि चीजें sudoसभी चर के वातावरण को पट्टी करती हैं। sudoकेवल कुछ चुनिंदा चर के माध्यम से अनुमति देता है। और उन चरों में से, यह उन्हें पवित्र करता है (यह $TERMचर के माध्यम से गुजरता है , लेकिन यह नहीं होगा यदि इसमें असामान्य वर्ण शामिल हैं)।


वाह, मैं हमेशा सोचता हूँ कि BASH में कुछ विशाल स्क्रिप्ट्स जो मैं करता हूँ, अजीबोगरीब असफलताएँ होती हैं जब सूडो के साथ शुरू की जाती हैं, खासकर रास्तों के आसपास, जिसके कारण मुझे सूडो के लिए जाँच शुरू होती है और उन्हें ब्लॉक करना पड़ता है, लेकिन मुझे कभी नहीं पता था कि ऐसा क्यों हुआ और हुआ था एक समस्या, अच्छे स्पष्टीकरण के लिए धन्यवाद फिर से पर्यावरणीय चर को अलग करना।
छिपकली

3

मैं कहूंगा कि यह तब है जब बैश आपके / बिन / श। यह बोर्न शेल की एक विशेषता नहीं है, और मुझे यकीन है कि यह पॉज़िक्स शेल की एक विशेषता भी नहीं है, वास्तव में वे इसे स्पष्ट रूप से मना करना चाहते हैं।

बैश वास्तव में कूर व्युत्पन्न खोल से अधिक है, एक बोर्न शेल की तुलना में, इसके नाम के बावजूद, और इसके एकमात्र कोर्न जैसे शेल की विशेषता है, और मेरी राय में यह रसोई की सुविधा है जिसमें कोई व्यावहारिक गुण नहीं है। डेवलपर्स जो मानकों के लिए बैश सुविधाओं से बचते हैं, जैसे कि बोर्न शेल, पॉज़िक्स शेल, या ksh88 सबसेट जो कि आधुनिक शेल सामान्य रूप में है, या दूसरे शब्दों में, अपने आप को अच्छी प्रथाओं और मानक मुहावरों के लिए प्रतिबद्ध करते हैं, जब उनके सॉफ़्टवेयर चालू होते हैं। लिनक्स और मैक और अब संभावित रूप से कमजोर, चूंकि शोषण लेखक अपने इरादों के बावजूद, 'बशीज़' का उपयोग करने के लिए स्वतंत्र हैं। जब तक / बिन / श, अन्य कोर्न शेल व्युत्पन्न के रूप में आमंत्रित किया जाता है, तब तक बेहतर संगतता, यह तभी है जब / बिन / श आपके लॉगिन शेल, या इंटरेक्टिव शेल है, जब बैश एक कोर्न शेल की तुलना में अधिक बोर्न शेल की तरह व्यवहार करता है,

मैं आपको यह समझाने की कोशिश करूंगा कि यह रसोई-सिंक सुविधा है, 2 मामलों के साथ: आप एक एम्बेडेड देव हैं, जो राउटर, नेटवर्क-संलग्न-भंडारण 1 बड़ा एनवी जैसे डिवाइस बनाता है, इसका मतलब है कि अधिक, मेमोरी, इसलिए, अधिक लागत, इतना कम मुनाफा, इसलिए, अगर यह बैश की इस विशेषता का उपयोग करने पर विचार करने का एक कारण था, तो क्या आपको इसके बजाय FPATH और ऑटोलॉड, ksh88 सुविधाओं का उपयोग नहीं करना चाहिए? पूरे समारोह को पर्यावरण में बाइट के लिए पास करने के बजाय? तुम भी विचार कर सकते हैं पार्सिंग और प्रूनिंग पर्यावरण थोक, इससे पहले कि यह एक गोले के लिए हो जाता है जो एक चर को गुमराह कर सकता है, जैसे कि फ़िल्टर ^ ^ $ (। *) $, और इसी तरह ...

यह रेखांकित करता है कि इसके बारे में क्या अद्वितीय है, इससे कोई फर्क नहीं पड़ता कि चर क्या है, और स्क्रिप्ट को चर का संदर्भ या उपयोग नहीं करना है, यह अभी भी असुरक्षित हो सकता है।

#!/bin/sh
exec /usr/local/myapp/support/someperlscript.pl

सूरज के नीचे और कुछ के लिए, ऊपर की लिपि की तरह ही सुरक्षित होना चाहिए, आप किसी भी चर का उपयोग नहीं कर रहे हैं आप किसी को कैसे भ्रमित कर सकते हैं? को बदल रहा है

#!/bin/bash -norc
exec /usr/local/myapp/support/someperlscript.pl

या तो मदद नहीं करता है, इसके पास ईएनवी या इसके साथ कुछ भी नहीं था - हर कोई जला हुआ है क्योंकि बैश को अद्वितीय होने की आवश्यकता है। तथ्य यह है कि संस्करण 2 को मारना मुद्दा है, मेरे लिए यह साबित करता है कि कोई भी कभी भी अपने अनुप्रयोगों के लिए इस सुविधा का उपयोग नहीं करता है , क्योंकि अन्यथा इसे इस समय के आसपास दुबकना नहीं चाहिए । और क्या बुरा है मूल रूप से इस सुविधा से परहेज नहीं है । यहाँ एक उदाहरण दिया गया है: 'su -' के साथ, यदि आप किसी से पूछेंगे, तो स्पष्टीकरण यह होगा कि यह पर्यावरण को प्रभावित करता है, मैन पेज की जाँच करें, और आपको बस 99.9% मिलेंगे। मैंने उस सही तरीके से परीक्षण किया, क्योंकि इस प्रणाली / बिन / श पर रूट का लॉगिन शेल है, और / बिन / श bash BUT है , इस उदाहरण में मैं कोशिश करता हूंमेरी .bash_profile को सख्त करने के लिए। मैंने अपना मौजूदा नाम रूट के लिए बदल दिया (जो सक्षम है), लेकिन मेरी सोच अगर सु की थी, तो संभवतः सूडो, वैसे भी, मैं इसके लिए बदल गया:

exec env -i TERM=vt102 LOGNAME=root USER=root HOME=/var/root /bin/ksh -i

इसलिए, मैं वास्तव में पर्यावरण को पूरी तरह से हटा रहा हूं, और एक न्यूनतम एनवी का उपयोग कर रहा हूं, और फिर एक शेल चला रहा हूं जिसमें वर्तमान प्रक्रिया के स्थान पर समस्या नहीं होनी चाहिए। फिर मानक उदाहरण के स्थान पर प्रयास करें:

%dock='() { echo -e "\e[2t\c"; echo dockshock;} ; dock' su 

यह दिखाता है कि किसी विशेष फ़ंक्शन को पार्स करने से इसका कोई लेना-देना नहीं है, और एक फ़ंक्शन फ़ंक्शन का उपयोग और उपयोग कर सकता है। यदि रूट, आदि का परीक्षण करने के लिए आप फ़ंक्शन के तर्क की कल्पना कर सकते हैं, तो इस मामले में, यह केवल एक संशोधित रूप है जो एक एस्केप विंडो का उपयोग करके या टर्मिनल विंडो को आइकॉनिक करने या डॉक करने के लिए एक फ़ंक्शन है, जो कि बहुत ही मानक है, इसलिए मैं विघटित करने के लिए क्लिक करने के बाद, गोदी देखें - लेकिन, तो क्या? अब यह प्रयास करें:

%TERM='() { echo -e "\e[2t\c"; echo dockshock;} ; TERM' su - 

और अंदाज लगाइये क्या? खिड़की को गोदी में लेकर चूसा जाता है। यहाँ बाद में ऐसा दिखता है ..

%TERM='() { echo -e "\e[2t\c"; echo dockshock;} ; TERM' su -
Password:
dockshock
# env
_=/usr/bin/env
HOME=/var/root
LOGNAME=root
TERM=vt102
USER=root
# echo $0
/bin/ksh
#

तो, इसलिए, उसके लिए बहुत कुछ! निर्यात किए गए कार्यों में वास्तव में आरसी स्क्रिप्ट्स पर प्राथमिकता है। आप इसे चकमा नहीं दे सकते।


1
POSIX ने ड्राफ्ट 2 में निर्यात योग्य कार्यों की अनुमति दी, और उसके बाद उन्हें अस्वीकृत कर दिया। सुविधा पागल है।
मिकसेर्व
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.