WebSockets के लिए समान-मूल नीति क्यों नहीं है? मैं ws से क्यों जुड़ सकता हूं: // लोकलहोस्ट?


84

मैं अपने आवेदन (Daemon <-> WebGUI और Daemon <-> FatClient, आदि) के लिए अंतर-प्रक्रिया संचार के लिए WebSockets का उपयोग करना चाहूंगा। परीक्षण के दौरान, मैंने websocket.org ( http://www.websocket.org/echo.html ) पर जावास्क्रिप्ट वेबस्केट क्लाइंट के माध्यम से अपने स्थानीय रूप से चलने वाले वेब सॉकेट सर्वर (ws: // localhost: 1234) से जुड़ने का प्रयास किया ।

मेरा सवाल अब यह है:
यह क्यों संभव है? क्या ब्राउज़रों में कोई क्रॉस-ओरिजिन पॉलिसी लागू नहीं है (यहाँ: लिनक्स पर FF29)?

मैं पूछ रहा हूं क्योंकि अगर websocket.org बुराई थी, तो यह मेरे स्थानीय WS सर्वर के साथ संवाद करने की कोशिश कर सकता है और स्थानीयहोस्ट से प्राप्त किसी भी संदेश को किसी अन्य सर्वर पर पुनर्निर्देशित कर सकता है:

स्थानीय वेबसॉकेट सर्वर ब्राउज़र ईविल वेब सर्वर
at ws: // localhost: 1234 at http: //evil.tld
        | | |
        | | ------ [GET /] ---------> |
        | | <----- [HTML + EvilJS] ---- |
        | <------ [Connect ws: // ..] ---- | |
        | <---- [कुछ संचार] -> | |
        | | ---- [दुष्ट आगे] ----> |
        | | |

मैंने पूरे उपयोग के मामले का परीक्षण नहीं किया है, लेकिन कनेक्ट करने के लिए ws: // localhost JS से दिया गया है जो websocket.org द्वारा दिया गया है निश्चित रूप से काम करता है।


2
websocket.org बुराई नहीं होनी चाहिए, वेब सॉकेट्स हो सकते हैं;)
kuldeep.kamboj

जवाबों:


51

"क्यों?" AJAX कॉल के विरोध के कारण वेबसॉकेट्स के लिए ब्राउज़र, समान उत्पत्ति नीति (जिनमें से CORS एक छूट है) लागू नहीं करता है, इसका कारण यह है कि क्रॉस-ऑरिजिनल अनुरोधों के मूल्य स्थापित होने के बाद वेबस्केट पेश किए गए थे, और क्योंकि वे ' फिर से शुरू करने के लिए एसओपी के अधीन नहीं है, कॉर्स क्लाइंट-साइड चेक का ऐतिहासिक कारण लागू नहीं होता है।

AJAX के लिए, एक कंबल सिंगल ओरिजिन पॉलिसी के दिनों में, सर्वरों ने कभी भी एक अलग डोमेन 1 से अनुरोध भेजने के लिए एक प्रमाणित ब्राउज़र की अपेक्षा नहीं की थी, और इसलिए यह सुनिश्चित करने की आवश्यकता नहीं थी कि अनुरोध एक विश्वसनीय स्थान 2 से आ रहा है , बस जाँच करें सत्र कुकी। बाद में इस तरह की धारणा (प्रभावी रूप से एक सीएसआरएफ हमले कर ) के उल्लंघन से मौजूदा अनुप्रयोगों का दुरुपयोग करने से बचने के लिए कॉर्स जैसे आराम को क्लाइंट-साइड चेक करना पड़ा

अगर आज वेब का आविष्कार किया जा रहा है, तो हम जो जानते हैं, उसे जानने के लिए, AJAX के लिए न तो SOP और न ही CORS की आवश्यकता होगी और यह संभव है कि सभी सत्यापन सर्वर पर छोड़ दिए जाएंगे।

वेबसॉकेट्स, एक नई तकनीक होने के नाते, गो गो से क्रॉस-डोमेन परिदृश्यों का समर्थन करने के लिए डिज़ाइन किए गए हैं। सर्वर लॉजिक लिखने वाले किसी को भी भारी-भरकम ब्राउजर-साइड एहतियात ला ला कोर की आवश्यकता के बिना क्रॉस-ऑरिजिनल रिक्वेस्ट की संभावना के बारे में पता होना चाहिए और आवश्यक सत्यापन करना चाहिए।


1 यह एक सरलीकरण है। संसाधनों के लिए क्रॉस-ओरिजिनल GET अनुरोध (जिसमें <img>, <link> और <script> टैग) शामिल हैं और फ़ॉर्म सबमिट POST अनुरोधों को हमेशा वेब की मूलभूत विशेषता के रूप में अनुमति दी गई थी। आजकल, क्रॉस-ऑरिजिनल AJAX कॉल जिनके अनुरोधों के समान गुण हैं उन्हें भी अनुमति दी जाती है और सरल क्रॉस-ऑरिजिनल अनुरोध के रूप में जाना जाता है । हालाँकि, कोड में ऐसे अनुरोधों से लौटाए गए डेटा तक पहुंच की अनुमति नहीं है जब तक कि सर्वर के कोर हेडर द्वारा स्पष्ट रूप से अनुमति नहीं दी जाती है। इसके अलावा, यह इन "सरल" POST अनुरोध हैं जो प्राथमिक कारण हैं कि सर्वरों को दुर्भावनापूर्ण वेबसाइटों से बचाने के लिए CSRF टोकन आवश्यक हैं।

2 वास्तव में, अनुरोध स्रोत की जांच करने का एक सुरक्षित तरीका भी उपलब्ध नहीं था क्योंकि Refererहेडर को एक खुले रीडायरेक्ट भेद्यता का उपयोग करके उदासीन किया जा सकता है। इससे यह भी पता चलता है कि खराब सीएसआरएफ कमजोरियों को तब वापस कैसे समझा गया था।


6
यह वास्तव में प्रश्न का उत्तर देता है, इसलिए +1। लेकिन, रिकॉर्ड के लिए, मैं इस तर्क से पूरी तरह असहमत हूं। मैं अनुमान लगाता हूं कि इस डिजाइन निर्णय के परिणामस्वरूप, वेबसॉकेट्स का उपयोग करने वाली कई महत्वपूर्ण साइटें Originहेडर को मान्य करने में विफल होंगी और परिणामस्वरूप निजी उपयोगकर्ता डेटा को तीसरे पक्ष की साइटों पर लीक कर सकते हैं। ग्राहक Access-Control-Allow-Originहेडर की जाँच कर रहे हैं, जैसा कि वे वेब पर किसी अन्य क्रॉस-ऑरिजनल HTTP रिक्वेस्ट पर जेएस की पहुँच की अनुमति देने से पहले करते हैं, इस हमले के पूरे वर्ग (क्रॉस-साइट वेबसॉकेट अपहरण) को रोकने के लिए एक सरल तरीका होगा। अब बहुत अधिक देर हो चुकी है।
Ajedi32

3
मैं सहमत होना चाहता हूं, डिजाइन परिवर्तन अनिवार्य रूप से एक श्वेतसूची आधारित दृष्टिकोण से एक ब्लैकलिस्ट के लिए बढ़ रहा है, जो जोखिम भरा है। निष्पक्ष बिंदु।
staafl

42

oberstet ने सवाल का जवाब दिया । धन्यवाद! दुर्भाग्य से मैं इसे "सही" नहीं कह सकता क्योंकि यह एक टिप्पणी थी। ब्राउज़र "मूल" हेडर भेजता है जिसे एप्लिकेशन द्वारा चेक किया जा सकता है।

जावा में [1]:

@Override
सार्वजनिक शून्य onOpen (WebSocket क्लाइंट सॉकेट, क्लाइंटहैंडशेक हैंडशेक) {
    स्ट्रिंग क्लाइंटऑरिजिन = हैंडशेक.गेटफिल्ड वेल ("मूल");

    if (clientOrigin == null ||! clientOrigin.equals (WEBSOCKET_ALLOWED_ORIGIN_HEADER)) {
        logger.log (Level.WARNING, "क्लाइंट ने सही मूल हेडर नहीं भेजा:" + clientOrigin);        

        clientSocket.close ();
        वापसी;
    }

    // ...
}

[१] https://github.com/TooTallNate/Java-WebSocket का उपयोग करके


OWASP ने पहले और सबसे महत्वपूर्ण कदम के रूप में अपने CSRF चीट शीट में उत्पत्ति (और संभावित रूप से रेफर) हेडर की जांच करने का उल्लेख किया है , लेकिन वे एक कदम आगे जाने और एक सीएसआरएफ विशिष्ट रक्षा को लागू करने की भी सलाह देते हैं। WebSockets के मामले में, यह WSR URI को क्वेरी पैरामीटर के रूप में एक XSRF एंटीफ् toरग टोकन के रूप में जोड़ सकता है और मूल जांच के बाद इसे सर्वर-साइड मान्य कर सकता है।
केविन सेक्रिस्ट

18

WebSockets डोमेन संचार को पार कर सकते हैं, और वे SOP (समान उत्पत्ति नीति) द्वारा सीमित नहीं हैं।

आपके द्वारा वर्णित एक ही सुरक्षा समस्या बिना WebSockets के हो सकती है।

बुराई जेएस कर सकते हैं:

  • URL के साथ एक स्क्रिप्ट / छवि टैग बनाएँ, जो bad.tld के लिए है और क्वेरी स्ट्रिंग में डेटा डालें।
  • एक फॉर्म टैग बनाएं, डेटा को खेतों में रखें, और फॉर्म का "सबमिट" क्रिया शुरू करें, एक HTTP POST कर, जो क्रॉस डोमेन हो सकता है। AJAX SOP द्वारा सीमित है, लेकिन सामान्य HTTP POST नहीं है। XSRF वेब सुरक्षा समस्या की जाँच करें।

यदि आपके पृष्ठ में कुछ जावास्क्रिप्ट इंजेक्ट करता है, या आपको दुर्भावनापूर्ण जावास्क्रिप्ट प्राप्त होता है, तो आपकी सुरक्षा पहले ही टूट चुकी है।


1
मुझे जेएस की बुराई की चिंता नहीं है। मुझे पता है कि यह हमेशा संभव है। मुझे वास्तव में ब्राउज़र-ब्रेकआउट के बारे में चिंता है: कोई भी वेबसाइट अब स्थानीय स्तर पर बाध्य WS सॉकेट के साथ संवाद कर सकती है और वहां से डेटा चोरी कर सकती है।
बिनविदेरियर

53
SOP / CORS WebSocket पर लागू नहीं होता है, लेकिन ब्राउज़र एक originहेडर भेजेगा जिसमें सर्वर का होस्टनाम होता है जो JS को WebSocket कनेक्शन खोलने वाले HTML के साथ सेवा करता था। एक WebSocket सर्वर जाँच के द्वारा पहुँच को प्रतिबंधित कर सकता है origin
प्रेस्टीट्यूट

इस सवाल का जवाब नहीं है। सवाल यह था कि एक अलग डोमेन से एक वेबपेज एक स्थानीय वेबस्केट का उपयोग क्यों कर सकता है। OPs परिदृश्य में ऐसा कुछ भी नहीं है कि "आपके पृष्ठ में जावास्क्रिप्ट इंजेक्ट करें" - यह एक अलग परिदृश्य है। WebSocket के बिना, एक दूरस्थ वेबपेज स्थानीयहोस्ट पर संसाधनों को पढ़ने में सक्षम नहीं होगा, क्योंकि यह वही है जो SOP रोकता है।
सालेस्के १।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.