2014-05-16 10 views
7

नोड में से बचने, मैं एक मॉड्यूल (GM) का उपयोग कर रहा है और पाया है कि यह child_process मॉड्यूल से spawn का उपयोग करता GraphicMagick के convert निष्पादन करने के लिए तर्क पारित करने के लिए।child_process अंडे/

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

उत्तर

7

हमने हाल ही में node.js. में avoiding command injection vulnerabilities पर एक ब्लॉग पोस्ट प्रकाशित किया है। यह बताता है कि कैसे स्पॉन इसे रोकता है।

यदि जीएम child_process.exec का उपयोग कर रहा था तो इंजेक्शन का एक बड़ा मौका होगा। ऐसा इसलिए है क्योंकि child_process.exec कमांड के तहत कमांड निष्पादित करता है और सीधे नहीं, बैकटिक्स, $(),; & &, जैसे शैल मेटा वर्णों को देना, || आदि घृणित रूप से इस्तेमाल किया जाना चाहिए।

परिणामी सिस्टम कॉल एक साधारण ls -l के लिए .exec() के साथ ऐसा दिखता है जो उपयोगकर्ता इनपुट ले सकता है।

[पीआईडी ​​25,170] execve ("/ bin/श", [ "/ bin/श", "-c", "ls -l उपयोगकर्ता इनपुट"], [/ * 16 वार्स * /]

के बाद से ग्राम जिसके परिणामस्वरूप सिस्टम कॉल अंडे का उपयोग करता है कुछ इस तरह दिखेगा।

[पीआईडी ​​25,565] execve ("/ bin/ls", [ "/ bin/ls", "-l ","। "], [/ * 16 वर्ण * /]

जीएम बी ई निष्पादित करने के लिए पहला तर्क। इसका मतलब यह है कि उपयोगकर्ता पाइप और अन्य कमांड लाइन ट्रिकरी का उपयोग करके खोल में उप-आदेश नहीं चला सकता है, क्योंकि हमारे उदाहरण/बिन/एलएस में बैकटिक्स या पाइप के साथ क्या करना है या नहीं; यह/bin/bash है जो उन आदेशों की व्याख्या करने जा रहा है। यह parametrized बनाम स्ट्रिंग-आधारित SQL क्वेरी का उपयोग करने के समान है, यदि आप इससे परिचित हैं।

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

तो, यहाँ प्रणाली को चलाने के लिए सामान्य सामूहिक मार्गदर्शन Node.js से आदेश है:

  • child_process.exec प्रयोग करने से बचें, और इसका इस्तेमाल कभी नहीं करता है, तो आदेश किसी भी इनपुट कि उपयोगकर्ता इनपुट के आधार पर बदलता शामिल हैं।
  • यदि संभव हो तो उपयोगकर्ताओं को आदेशों में विकल्पों को पास करने से बचने का प्रयास करें। स्पॉन या execfile का उपयोग करते समय आमतौर पर मान ठीक होते हैं, लेकिन उपयोगकर्ता नियंत्रित स्ट्रिंग के माध्यम से विकल्पों का चयन करना एक बुरा विचार है।
  • यदि आपको उपयोगकर्ता नियंत्रित विकल्पों की अनुमति देनी है, तो आदेश के विकल्पों को व्यापक रूप से देखें, निर्धारित करें कि कौन से विकल्प सुरक्षित हैं, और केवल उन विकल्पों को श्वेतसूची में रखें।
+0

कई आदेशों का उपयोग करने के बारे में क्या? उदाहरण के लिए "सीडी" + डीआईआर + "; ./" ​​+ fileToExecute। मुझे लगता है कि आप जिस तरीके से वर्णित हैं उसके साथ आप सक्षम नहीं होंगे। क्या मै गलत हु? –

संबंधित मुद्दे