रूट-सक्षम स्क्रिप्ट के लिए चर को सुरक्षित रूप से कैसे पास करें?


13

यह प्रश्न पूरी तरह से सामान्य है और केवल मेरी स्थिति पर लागू नहीं है, लेकिन ... मेरे पास एक छोटा व्यस्त बॉक्स उपकरण है, जहां मैं चाहता हूं कि एक गैर-रूट उपयोगकर्ता किसी विशेष स्क्रिप्ट को रूट प्राइवेटिलिज के साथ निष्पादित करने में सक्षम हो। उदाहरण के लिए, डीएचसीपी को सक्षम करने के लिए इस छोटी सी स्क्रिप्ट जैसा कुछ, जहां केवल वैरिएबल ( $1) को cmdline पर भेजना है (!!) जिसे होस्ट नाम भेजना है:

#!/bin/bash
udhcpc -b -i eth0 -h $1

इस तरह के udhcpc को चलाने के लिए रूट एक्सेस की आवश्यकता होती है, इसलिए यह करने के /etc/sudoersलिए इस लाइन को समाहित करने के लिए मेरी योजना है :

joe ALL = NOPASSWD: /path/to/enable_dhcp.sh

जो आसानी से रूट विशेषाधिकार के साथ उस स्क्रिप्ट को चलाने के लिए "जो" को सक्षम करना चाहिए:

sudo /path/to/enable_dhcp.sh

और एक पासवर्ड के लिए नहीं पूछा जा रहा है (जो मैं चाहता हूं, क्योंकि मैं चाहता हूं कि जो इसे स्क्रिप्ट करने में सक्षम हो)।

अब .. मुझे पता है (या कम से कम मुझे लगता है कि मैं) $1एक स्क्रिप्ट का उपयोग करना जो आसानी से रूट विशेषाधिकारों के साथ चलाया जा सकता है एक संक्षिप्त विचार है क्योंकि आप जो भी चाहते हैं उसे इंजेक्ट कर सकते हैं।

तो ... इससे निपटने का सबसे अच्छा तरीका क्या है? इंजेक्शन के हमलों के लिए व्यापक खुला नहीं होने के दौरान, मैं कैसे करूँ जो मैं रूट विशेषाधिकारों के साथ करना चाहता हूं, उसे एक चर में पारित करने की अनुमति दें (या प्रभावी रूप से ऐसा करना)?

जवाबों:


14

के तहत शेल स्क्रिप्ट चल रहा है sudoसुरक्षित है बशर्ते कि sudoपर्यावरण पुनर्स्थापित करने के लिए कॉन्फ़िगर किया गया है । इसके विपरीत, यदि sudoपर्यावरण को रीसेट नहीं किया जाता है, तो शेल स्क्रिप्ट चलाना सुरक्षित नहीं है, भले ही आपकी स्क्रिप्ट अपने मापदंडों का उपयोग न करे ( शेल स्क्रिप्ट पर सेट की अनुमति दें देखें )। सुनिश्चित करें कि आपके पास Defaults env_resetहै /etc/sudoersया यह विकल्प संकलन-समय डिफ़ॉल्ट है ( sudo sudo -V | grep envइसमें शामिल होना चाहिए Reset the environment to a default set of variables)।

स्क्रिप्ट मापदंडों का उपयोग करने में कोई विशेष खतरा नहीं है। $1एक स्ट्रिंग है, आपको यह सुनिश्चित करने की आवश्यकता है कि आप इसे स्ट्रिंग के रूप में उपयोग कर रहे हैं। (उदाहरण के लिए, मत करो eval "$1"।) जाहिर है, यह विशेष रूप से महत्वपूर्ण है कि चर की सामग्री के बारे में धारणाएं न बनाएं, और दोहरे चर को सभी चर प्रतिस्थापन (यानी लिखें "$1", नहीं $1) के आसपास रखें। ध्यान दें कि चर प्रतिस्थापन के आसपास दोहरे उद्धरण चिह्नों को विशेषाधिकारों के साथ चलने वाली स्क्रिप्ट के लिए विशिष्ट नहीं है, यह कुछ ऐसा है जो आपको हर समय करना चाहिए।

हो सकता है कि आप उस पैरामीटर को और मान्य करना चाहते हों, जो इस udhcpcबात पर निर्भर करता है कि होस्ट नाम जैसा कुछ नहीं दिखता है। उदाहरण के लिए, यह एक पहली वाक्यात्मक जाँच करेगा:

#!/bin/sh
case "$1" in
  *[!:-.0-9A-Za-z]*|-*) echo 1>&2 "Badly formed host name!"; exit 3;;
esac
udhcpc -b -i eth0 -h "$1"

अन्य बातों पर विचार करने के लिए उस आदेश के व्यवहार पर प्रभाव पड़ सकता है: वर्तमान कार्यशील निर्देशिका, और क्या स्टडिन, स्टडआउट, स्टेडर पॉइंट टू, सिग्नल हैंडलर और अलिमेट्स। उदाहरण के लिए, कोर डंप (<kbd> Ctrl - \ </ kbd> पर) की अनुमति देकर, आप उपयोगकर्ता को कूड़े / रन / लॉक की अनुमति दे सकते हैं जो मेरे सिस्टम पर बहुत सीमित आकार के साथ एक tmpfs है और एक DoS की अनुमति दे सकता है।
स्टीफन चेज़लस

5

आपको ज्ञात अच्छे पैटर्न के खिलाफ पारित इनपुट से मेल खाना चाहिए।

उदाहरण के लिए, ऐसा लगता है कि आईपी एड्रेस आपके लिए वैध इनपुट हो सकता है। तो आप कुछ इस तरह का उपयोग कर सकते हैं:

if [[ "$1" =~ ^[0-9]?[0-9]?[0-9].[0-9]?[0-9]?[0-9].[0-9]?[0-9]?[0-9]$ ]]
then
  udhcpc -b -i eth0 -h "$1"
else
  echo "Don't mess with me pork chop."
fi

ध्यान दें, कि regexp का परीक्षण नहीं किया गया है, आप यह सुनिश्चित करने के लिए जिम्मेदार हैं कि आपका regexp कुछ भी खतरनाक नहीं होने देता है।

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